/** * Returns the path of a $renderable in the format <formIdentifier>/<sectionIdentifier>/<sectionIdentifier>/.../<elementIdentifier> * * @param RootRenderableInterface $renderable * @return string */ protected function getRenderablePath(RootRenderableInterface $renderable) { $path = $renderable->getIdentifier(); while ($renderable = $renderable->getParentRenderable()) { $path = $renderable->getIdentifier() . '/' . $path; } return $path; }
/** * @param RootRenderableInterface $renderable * @param string $as * @return string the rendered form values */ public function render(RootRenderableInterface $renderable, $as = 'formValue') { if ($renderable instanceof CompositeRenderableInterface) { $elements = $renderable->getRenderablesRecursively(); } else { $elements = array($renderable); } /** @var RendererInterface $fluidFormRenderer */ $fluidFormRenderer = $this->viewHelperVariableContainer->getView(); $formRuntime = $fluidFormRenderer->getFormRuntime(); $formState = $formRuntime->getFormState(); $output = ''; foreach ($elements as $element) { if (!$element instanceof FormElementInterface) { continue; } $value = $formState->getFormValue($element->getIdentifier()); $formValue = array('element' => $element, 'value' => $value, 'processedValue' => $this->processElementValue($element, $value), 'isMultiValue' => is_array($value) || $value instanceof \Iterator); $this->templateVariableContainer->add($as, $formValue); $output .= $this->renderChildren(); $this->templateVariableContainer->remove($as); } return $output; }
/** * Render the passed $renderable and return the rendered Renderable. * * @param \TYPO3\Form\Core\Model\Renderable\RootRenderableInterface $renderable * @return string the rendered $renderable * @throws \TYPO3\Form\Exception\RenderingException * @api */ public function renderRenderable(\TYPO3\Form\Core\Model\Renderable\RootRenderableInterface $renderable) { $renderable->beforeRendering($this->formRuntime); $this->templateParser->setConfiguration($this->buildParserConfiguration()); $renderableType = $renderable->getType(); if ($renderable->getRendererClassName() !== NULL && $renderable->getRendererClassName() !== get_class($this)) { $rendererClassName = $renderable->getRendererClassName(); $renderer = new $rendererClassName(); if (!$renderer instanceof RendererInterface) { throw new \TYPO3\Form\Exception\RenderingException(sprintf('The renderer class "%s" for "%s" does not implement RendererInterface.', $rendererClassName, $renderableType), 1326098022); } $renderer->setControllerContext($this->controllerContext); $renderer->setFormRuntime($this->formRuntime); return $renderer->renderRenderable($renderable); } $renderingOptions = $renderable->getRenderingOptions(); $renderablePathAndFilename = $this->getPathAndFilenameForRenderable($renderableType, $renderingOptions); $parsedRenderable = $this->getParsedRenderable($renderable->getType(), $renderablePathAndFilename); if ($this->getCurrentRenderingContext() === NULL) { // We do not have a "current" rendering context yet, so we use the base rendering context $this->baseRenderingContext->setControllerContext($this->controllerContext); $renderingContext = $this->baseRenderingContext; } else { $renderingContext = clone $this->getCurrentRenderingContext(); } $renderingContext->getViewHelperVariableContainer()->addOrUpdate('TYPO3\\Form\\Core\\Renderer\\FluidFormRenderer', 'currentRenderable', $renderable); if (!isset($renderingOptions['renderableNameInTemplate'])) { throw new \TYPO3\Form\Exception\RenderingException(sprintf('The Renderable "%s" did not have the rendering option "renderableNameInTemplate" defined.', $renderableType), 1326094948); } $templateVariableContainer = new \TYPO3\Fluid\Core\ViewHelper\TemplateVariableContainer(array($renderingOptions['renderableNameInTemplate'] => $renderable)); $renderingContext->injectTemplateVariableContainer($templateVariableContainer); if ($parsedRenderable->hasLayout()) { $renderableLayoutName = $parsedRenderable->getLayoutName($renderingContext); $renderableLayoutPathAndFilename = $this->getPathAndFilenameForRenderableLayout($renderableLayoutName, $renderingOptions); $parsedLayout = $this->getParsedRenderable($renderableLayoutName, $renderableLayoutPathAndFilename); $this->startRendering(self::RENDERING_LAYOUT, $parsedRenderable, $renderingContext); $output = $parsedLayout->render($renderingContext); $this->stopRendering(); } else { $this->startRendering(self::RENDERING_TEMPLATE, $parsedRenderable, $renderingContext); $output = $parsedRenderable->render($renderingContext); $this->stopRendering(); } return $output; }