Skip to content

Commit

Permalink
Merge pull request #51 from bwaidelich/feature-render-callbacks
Browse files Browse the repository at this point in the history
FEATURE: Configurable Form Element render callbacks
  • Loading branch information
Bastian Waidelich committed Jul 31, 2017
2 parents bc3c7d1 + 39d5bf9 commit 502878f
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
1 change: 1 addition & 0 deletions Classes/Core/Renderer/FluidFormRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ public function renderRenderable(\Neos\Form\Core\Model\Renderable\RootRenderable
}

$this->baseRenderingContext->setTemplatePaths($currentTemplatePathsResolver);
$output = $this->formRuntime->invokeRenderCallbacks($output, $renderable);
return $output;
}

Expand Down
33 changes: 33 additions & 0 deletions Classes/Core/Runtime/FormRuntime.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use Neos\Flow\Annotations as Flow;
use Neos\Flow\Mvc\ActionRequest;
use Neos\Form\Core\Model\Renderable\RootRenderableInterface;

/**
* This class implements the *runtime logic* of a form, i.e. deciding which
Expand Down Expand Up @@ -117,6 +118,11 @@ class FormRuntime implements \Neos\Form\Core\Model\Renderable\RootRenderableInte
*/
protected $flashMessageContainer;

/**
* @var callable[]
*/
protected $renderCallbacks = [];

/**
* @param \Neos\Form\Core\Model\FormDefinition $formDefinition
* @param \Neos\Flow\Mvc\ActionRequest $request
Expand Down Expand Up @@ -605,4 +611,31 @@ public function getFormDefinition()
public function beforeRendering(\Neos\Form\Core\Runtime\FormRuntime $formRuntime)
{
}

/**
* Registers a callback that is called just before a Form Element is rendered.
* The callback will be invoked with the rendered element and an instance of the RootRenderableInterface as
* arguments and is expected to return the (possibly altered) rendered element
*
* @param callable $callback
* @return void
* @api
*/
public function registerRenderCallback(callable $callback)
{
$this->renderCallbacks[] = $callback;
}

/**
* @param string $renderedElement
* @param RootRenderableInterface $renderable
* @return string
*/
public function invokeRenderCallbacks($renderedElement, RootRenderableInterface $renderable)
{
foreach ($this->renderCallbacks as $renderCallback) {
$renderedElement = call_user_func($renderCallback, $renderedElement, $renderable);
}
return $renderedElement;
}
}
5 changes: 5 additions & 0 deletions Documentation/extending-form-api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ list. A Form Element Renderer must implement the ``RendererInterface`` interface
* @return string
*/
public function renderRenderable(\Neos\Form\Core\Model\Renderable\RootRenderableInterface $renderable) {
$renderable->beforeRendering($this->formRuntime);
$items = array();
if ($renderable instanceof \Neos\Form\Core\Model\FormElementInterface) {
$elementProperties = $renderable->getProperties();
Expand All @@ -177,9 +178,13 @@ list. A Form Element Renderer must implement the ``RendererInterface`` interface
$content .= sprintf('<li>%s</li>', htmlspecialchars($item));
}
$content .= '</ul>';
$content = $this->formRuntime->invokeRenderCallbacks($content, $renderable);
return $content;
}
}

.. note:: Don't forget to invoke ``RootRenderableInterface::beforeRendering()`` and ``FormRuntime::invokeRenderCallbacks()``
as shown above.

.. tip:: If you write your own Renderer make sure to sanitize values with ``htmlspecialchars()`` before outputting
them to prevent invalid HTML and XSS vulnerabilities.

0 comments on commit 502878f

Please sign in to comment.