diff --git a/src/Symfony/Component/Form/Field.php b/src/Symfony/Component/Form/Field.php index 0b42177351..efaf89da09 100644 --- a/src/Symfony/Component/Form/Field.php +++ b/src/Symfony/Component/Form/Field.php @@ -15,6 +15,7 @@ use Symfony\Component\Form\ValueTransformer\ValueTransformerInterface; use Symfony\Component\Form\ValueTransformer\TransformationFailedException; use Symfony\Component\Form\DataProcessor\DataProcessorInterface; use Symfony\Component\Form\Renderer\RendererInterface; +use Symfony\Component\Form\Renderer\Plugin\PluginInterface; /** * Base class for form fields @@ -417,6 +418,8 @@ class Field extends Configurable implements FieldInterface protected function setNormalizationTransformer(ValueTransformerInterface $normalizationTransformer) { $this->normalizationTransformer = $normalizationTransformer; + + return $this; } /** @@ -437,6 +440,8 @@ class Field extends Configurable implements FieldInterface protected function setValueTransformer(ValueTransformerInterface $valueTransformer) { $this->valueTransformer = $valueTransformer; + + return $this; } /** @@ -457,6 +462,8 @@ class Field extends Configurable implements FieldInterface protected function setDataProcessor(DataProcessorInterface $dataProcessor) { $this->dataProcessor = $dataProcessor; + + return $this; } /** @@ -477,6 +484,8 @@ class Field extends Configurable implements FieldInterface public function setRenderer(RendererInterface $renderer) { $this->renderer = $renderer; + + return $this; } /** @@ -489,6 +498,13 @@ class Field extends Configurable implements FieldInterface return $this->renderer; } + public function addRendererPlugin(PluginInterface $plugin) + { + $this->renderer->addPlugin($plugin); + + return $this; + } + /** * Normalizes the value if a normalization transformer is set * diff --git a/src/Symfony/Component/Form/FormFactory.php b/src/Symfony/Component/Form/FormFactory.php new file mode 100644 index 0000000000..29294b9ee3 --- /dev/null +++ b/src/Symfony/Component/Form/FormFactory.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form; + +use Symfony\Component\Form\ValueTransformer\BooleanToStringTransformer; +use Symfony\Component\Form\Renderer\DefaultRenderer; +use Symfony\Component\Form\Renderer\Plugin\IdPlugin; +use Symfony\Component\Form\Renderer\Plugin\NamePlugin; +use Symfony\Component\Form\Renderer\Plugin\ValuePlugin; + +class FormFactory +{ + private $theme; + + public function setTheme(ThemeInterface $theme) + { + $this->theme = $theme; + } + + public function getTheme() + { + return $this->theme; + } + + protected function getField($name, $template) + { + $field = new Field($name); + + return $field + ->setRenderer(new DefaultRenderer($this->theme, $template)) + ->addRendererPlugin(new IdPlugin($field)) + ->addRendererPlugin(new NamePlugin($field)); + } + + public function getCheckboxField($name, $value = '1') + { + return $this->getField($name, 'checkbox') + ->setValueTransformer(new BooleanToStringTransformer()) + ->addRendererPlugin(new ValuePlugin($value)); + } + + public function getRadioField($name) + { + $field = $this->getField($name, 'radio'); + + return $field + ->setValueTransformer(new BooleanToStringTransformer()) + ->addRendererPlugin(new ParentNamePlugin($field)); + } +} \ No newline at end of file diff --git a/src/Symfony/Component/Form/Renderer/Plugin/ParentNamePlugin.php b/src/Symfony/Component/Form/Renderer/Plugin/ParentNamePlugin.php new file mode 100644 index 0000000000..ab328cf95c --- /dev/null +++ b/src/Symfony/Component/Form/Renderer/Plugin/ParentNamePlugin.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license infieldation, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Renderer\Plugin; + +use Symfony\Component\Form\Renderer\RendererInterface; +use Symfony\Component\Form\FieldInterface; + +class ParentNamePlugin implements PluginInterface +{ + private $field; + + public function __construct(FieldInterface $field) + { + $this->field = $field; + } + + /** + * Renders the HTML enctype in the field tag, if necessary + * + * Example usage in Twig templates: + * + * + * + * @param Form $field The field for which to render the encoding type + */ + public function setUp(RendererInterface $renderer) + { + if ($this->field->hasParent()) { + $parentRenderer = $this->field->getParent()->getRenderer(); + $renderer->setParameter('name', $parentRenderer->getParameter('name')); + } + } +} \ No newline at end of file diff --git a/src/Symfony/Component/Form/Renderer/Plugin/ValuePlugin.php b/src/Symfony/Component/Form/Renderer/Plugin/ValuePlugin.php new file mode 100644 index 0000000000..d4df3c81d9 --- /dev/null +++ b/src/Symfony/Component/Form/Renderer/Plugin/ValuePlugin.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license infieldation, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Renderer\Plugin; + +use Symfony\Component\Form\Renderer\RendererInterface; + +class ValuePlugin implements PluginInterface +{ + private $value; + + public function __construct($value = null) + { + $this->value = $value; + } + + public function setUp(RendererInterface $renderer) + { + if (null !== $this->value) { + $renderer->setParameter('value', $this->value); + } + } +} \ No newline at end of file