diff --git a/src/Symfony/Component/Form/Extension/Templating/TemplatingExtension.php b/src/Symfony/Component/Form/Extension/Templating/TemplatingExtension.php new file mode 100644 index 0000000000..ea31370b5d --- /dev/null +++ b/src/Symfony/Component/Form/Extension/Templating/TemplatingExtension.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Extension\Templating; + +use Symfony\Component\Form\AbstractExtension; +use Symfony\Component\Form\FormRenderer; +use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface; +use Symfony\Component\Templating\PhpEngine; + +/** + * Integrates the Templating component with the Form library. + * + * @author Bernhard Schussek + */ +class TemplatingExtension extends AbstractExtension +{ + public function __construct(PhpEngine $engine, CsrfProviderInterface $csrfProvider = null, array $defaultThemes = array()) + { + $engine->addHelpers(array( + new FormHelper(new FormRenderer(new TemplatingRendererEngine($engine, $defaultThemes), $csrfProvider)) + )); + } +} diff --git a/src/Symfony/Component/Form/Forms.php b/src/Symfony/Component/Form/Forms.php index 263297073b..e37f085425 100644 --- a/src/Symfony/Component/Form/Forms.php +++ b/src/Symfony/Component/Form/Forms.php @@ -102,6 +102,54 @@ use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension; * ->getFormFactory(); * * + * Support for the Templating component is provided by TemplatingExtension. + * This extension needs a PhpEngine object for rendering forms. As second + * argument you should pass the names of the default themes. Here is an + * example for using the default layout with "
" tags: + * + * + * use Symfony\Component\Form\Extension\Templating\TemplatingExtension; + * + * $formFactory = Forms::createFormFactoryBuilder() + * ->addExtension(new TemplatingExtension($engine, null, array( + * 'FrameworkBundle:Form', + * ))) + * ->getFormFactory(); + * + * + * The next example shows how to include the "" layout: + * + * + * use Symfony\Component\Form\Extension\Templating\TemplatingExtension; + * + * $formFactory = Forms::createFormFactoryBuilder() + * ->addExtension(new TemplatingExtension($engine, null, array( + * 'FrameworkBundle:Form', + * 'FrameworkBundle:FormTable', + * ))) + * ->getFormFactory(); + * + * + * If you also loaded the CsrfExtension, you should pass the CSRF provider + * to the extension so that you can render CSRF tokens in your templates + * more easily: + * + * + * use Symfony\Component\Form\Extension\Csrf\CsrfExtension; + * use Symfony\Component\Form\Extension\Csrf\CsrfProvider\DefaultCsrfProvider; + * use Symfony\Component\Form\Extension\Templating\TemplatingExtension; + * + * + * $secret = 'V8a5Z97e...'; + * $csrfProvider = new DefaultCsrfProvider($secret); + * $formFactory = Forms::createFormFactoryBuilder() + * ->addExtension(new CsrfExtension($csrfProvider)) + * ->addExtension(new TemplatingExtension($engine, $csrfProvider, array( + * 'FrameworkBundle:Form', + * ))) + * ->getFormFactory(); + * + * * @author Bernhard Schussek */ final class Forms diff --git a/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperDivLayoutTest.php b/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperDivLayoutTest.php index 9dcc3b4f99..66c2eafb99 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperDivLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperDivLayoutTest.php @@ -12,9 +12,7 @@ namespace Symfony\Component\Form\Tests\Extension\Templating; use Symfony\Component\Form\FormView; -use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\Extension\Templating\FormHelper; -use Symfony\Component\Form\Extension\Templating\TemplatingRendererEngine; +use Symfony\Component\Form\Extension\Templating\TemplatingExtension; use Symfony\Component\Form\Tests\AbstractDivLayoutTest; use Symfony\Component\Form\Tests\Extension\Templating\Fixtures\StubTemplateNameParser; use Symfony\Component\Form\Tests\Extension\Templating\Fixtures\StubTranslator; @@ -26,7 +24,10 @@ use Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper; class FormHelperDivLayoutTest extends AbstractDivLayoutTest { - protected $helper; + /** + * @var PhpEngine + */ + protected $engine; protected function setUp() { @@ -39,7 +40,10 @@ class FormHelperDivLayoutTest extends AbstractDivLayoutTest } parent::setUp(); + } + protected function getExtensions() + { // should be moved to the Form component once absolute file paths are supported // by the default name parser in the Templating component $reflClass = new \ReflectionClass('Symfony\Bundle\FrameworkBundle\FrameworkBundle'); @@ -47,57 +51,58 @@ class FormHelperDivLayoutTest extends AbstractDivLayoutTest $rootTheme = realpath(__DIR__.'/Resources'); $templateNameParser = new StubTemplateNameParser($root, $rootTheme); $loader = new FilesystemLoader(array()); - $engine = new PhpEngine($templateNameParser, $loader); - $engine->addGlobal('global', ''); - $rendererEngine = new TemplatingRendererEngine($engine, array('FrameworkBundle:Form')); - $renderer = new FormRenderer($rendererEngine, $this->getMock('Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface')); - $this->helper = new FormHelper($renderer); - - $engine->setHelpers(array( - $this->helper, + $this->engine = new PhpEngine($templateNameParser, $loader); + $this->engine->addGlobal('global', ''); + $this->engine->setHelpers(array( new TranslatorHelper(new StubTranslator()), )); + + return array_merge(parent::getExtensions(), array( + new TemplatingExtension($this->engine, $this->csrfProvider, array( + 'FrameworkBundle:Form', + )), + )); } protected function tearDown() { - $this->helper = null; + $this->engine = null; } protected function renderEnctype(FormView $view) { - return (string) $this->helper->enctype($view); + return (string) $this->engine->get('form')->enctype($view); } protected function renderLabel(FormView $view, $label = null, array $vars = array()) { - return (string) $this->helper->label($view, $label, $vars); + return (string) $this->engine->get('form')->label($view, $label, $vars); } protected function renderErrors(FormView $view) { - return (string) $this->helper->errors($view); + return (string) $this->engine->get('form')->errors($view); } protected function renderWidget(FormView $view, array $vars = array()) { - return (string) $this->helper->widget($view, $vars); + return (string) $this->engine->get('form')->widget($view, $vars); } protected function renderRow(FormView $view, array $vars = array()) { - return (string) $this->helper->row($view, $vars); + return (string) $this->engine->get('form')->row($view, $vars); } protected function renderRest(FormView $view, array $vars = array()) { - return (string) $this->helper->rest($view, $vars); + return (string) $this->engine->get('form')->rest($view, $vars); } protected function setTheme(FormView $view, array $themes) { - $this->helper->setTheme($view, $themes); + $this->engine->get('form')->setTheme($view, $themes); } public static function themeBlockInheritanceProvider() diff --git a/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperTableLayoutTest.php b/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperTableLayoutTest.php index 0bbc95a549..b084379015 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperTableLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Templating/FormHelperTableLayoutTest.php @@ -12,9 +12,7 @@ namespace Symfony\Component\Form\Tests\Extension\Templating; use Symfony\Component\Form\FormView; -use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\Extension\Templating\FormHelper; -use Symfony\Component\Form\Extension\Templating\TemplatingRendererEngine; +use Symfony\Component\Form\Extension\Templating\TemplatingExtension; use Symfony\Component\Form\Tests\AbstractTableLayoutTest; use Symfony\Component\Form\Tests\Extension\Templating\Fixtures\StubTemplateNameParser; use Symfony\Component\Form\Tests\Extension\Templating\Fixtures\StubTranslator; @@ -26,7 +24,10 @@ use Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper; class FormHelperTableLayoutTest extends AbstractTableLayoutTest { - protected $helper; + /** + * @var PhpEngine + */ + protected $engine; protected function setUp() { @@ -39,7 +40,10 @@ class FormHelperTableLayoutTest extends AbstractTableLayoutTest } parent::setUp(); + } + protected function getExtensions() + { // should be moved to the Form component once absolute file paths are supported // by the default name parser in the Templating component $reflClass = new \ReflectionClass('Symfony\Bundle\FrameworkBundle\FrameworkBundle'); @@ -47,59 +51,58 @@ class FormHelperTableLayoutTest extends AbstractTableLayoutTest $rootTheme = realpath(__DIR__.'/Resources'); $templateNameParser = new StubTemplateNameParser($root, $rootTheme); $loader = new FilesystemLoader(array()); - $engine = new PhpEngine($templateNameParser, $loader); - $engine->addGlobal('global', ''); - $rendererEngine = new TemplatingRendererEngine($engine, array( - 'FrameworkBundle:Form', - 'FrameworkBundle:FormTable' - )); - $renderer = new FormRenderer($rendererEngine, $this->getMock('Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface')); - $this->helper = new FormHelper($renderer); - - $engine->setHelpers(array( - $this->helper, + $this->engine = new PhpEngine($templateNameParser, $loader); + $this->engine->addGlobal('global', ''); + $this->engine->setHelpers(array( new TranslatorHelper(new StubTranslator()), )); + + return array_merge(parent::getExtensions(), array( + new TemplatingExtension($this->engine, $this->csrfProvider, array( + 'FrameworkBundle:Form', + 'FrameworkBundle:FormTable', + )), + )); } protected function tearDown() { - $this->helper = null; + $this->engine = null; } protected function renderEnctype(FormView $view) { - return (string) $this->helper->enctype($view); + return (string) $this->engine->get('form')->enctype($view); } protected function renderLabel(FormView $view, $label = null, array $vars = array()) { - return (string) $this->helper->label($view, $label, $vars); + return (string) $this->engine->get('form')->label($view, $label, $vars); } protected function renderErrors(FormView $view) { - return (string) $this->helper->errors($view); + return (string) $this->engine->get('form')->errors($view); } protected function renderWidget(FormView $view, array $vars = array()) { - return (string) $this->helper->widget($view, $vars); + return (string) $this->engine->get('form')->widget($view, $vars); } protected function renderRow(FormView $view, array $vars = array()) { - return (string) $this->helper->row($view, $vars); + return (string) $this->engine->get('form')->row($view, $vars); } protected function renderRest(FormView $view, array $vars = array()) { - return (string) $this->helper->rest($view, $vars); + return (string) $this->engine->get('form')->rest($view, $vars); } protected function setTheme(FormView $view, array $themes) { - $this->helper->setTheme($view, $themes); + $this->engine->get('form')->setTheme($view, $themes); } }