ソースを参照

[Form] Removed dependency from renderer plugins on fields. The field instance is now passed to setUp() instead.

Bernhard Schussek 14 年 前
コミット
eba602ed1b

+ 1 - 1
src/Symfony/Component/Form/Config/CheckboxFieldConfig.php

@@ -20,7 +20,7 @@ class CheckboxFieldConfig extends AbstractFieldConfig
     public function configure(FieldInterface $field, array $options)
     {
         $field->setValueTransformer(new BooleanToStringTransformer())
-            ->addRendererPlugin(new CheckedPlugin($field))
+            ->addRendererPlugin(new CheckedPlugin())
             ->setRendererVar('value', $options['value']);
     }
 

+ 1 - 1
src/Symfony/Component/Form/Config/ChoiceFieldConfig.php

@@ -56,7 +56,7 @@ class ChoiceFieldConfig extends AbstractFieldConfig
         }
 
         if ($options['multiple'] && !$options['expanded']) {
-            $field->addRendererPlugin(new SelectMultipleNamePlugin($field));
+            $field->addRendererPlugin(new SelectMultipleNamePlugin());
         }
     }
 

+ 2 - 2
src/Symfony/Component/Form/Config/FieldConfig.php

@@ -41,8 +41,8 @@ class FieldConfig extends AbstractFieldConfig
             ->setValueTransformer($options['value_transformer'])
             ->setNormalizationTransformer($options['normalization_transformer'])
             ->setData($options['data'])
-            ->setRenderer(new DefaultRenderer($this->theme, $options['template']))
-            ->addRendererPlugin(new FieldPlugin($field))
+            ->setRenderer(new DefaultRenderer($field, $this->theme, $options['template']))
+            ->addRendererPlugin(new FieldPlugin())
             ->setRendererVar('class', null)
             ->setRendererVar('max_length', null)
             ->setRendererVar('size', null)

+ 1 - 1
src/Symfony/Component/Form/Config/FormConfig.php

@@ -42,7 +42,7 @@ class FormConfig extends AbstractFieldConfig
             ->setValidationGroups($options['validation_groups'])
             ->setVirtual($options['virtual'])
             ->setValidator($options['validator'])
-            ->addRendererPlugin(new FormPlugin($field    ));
+            ->addRendererPlugin(new FormPlugin());
 
         if ($options['csrf_protection']) {
             $field->enableCsrfProtection($options['csrf_provider'], $options['csrf_field_name']);

+ 1 - 1
src/Symfony/Component/Form/Config/PasswordFieldConfig.php

@@ -18,7 +18,7 @@ class PasswordFieldConfig extends AbstractFieldConfig
 {
     public function configure(FieldInterface $field, array $options)
     {
-        $field->addRendererPlugin(new PasswordValuePlugin($field, $options['always_empty']));
+        $field->addRendererPlugin(new PasswordValuePlugin($options['always_empty']));
     }
 
     public function getDefaultOptions(array $options)

+ 2 - 2
src/Symfony/Component/Form/Config/RadioFieldConfig.php

@@ -21,8 +21,8 @@ class RadioFieldConfig extends AbstractFieldConfig
     public function configure(FieldInterface $field, array $options)
     {
         $field->setValueTransformer(new BooleanToStringTransformer())
-            ->addRendererPlugin(new CheckedPlugin($field))
-            ->addRendererPlugin(new ParentNamePlugin($field))
+            ->addRendererPlugin(new CheckedPlugin())
+            ->addRendererPlugin(new ParentNamePlugin())
             ->setRendererVar('value', $options['value']);
     }
 

+ 2 - 2
src/Symfony/Component/Form/Field.php

@@ -14,7 +14,7 @@ namespace Symfony\Component\Form;
 use Symfony\Component\Form\ValueTransformer\ValueTransformerInterface;
 use Symfony\Component\Form\ValueTransformer\TransformationFailedException;
 use Symfony\Component\Form\Renderer\RendererInterface;
-use Symfony\Component\Form\Renderer\Plugin\PluginInterface;
+use Symfony\Component\Form\Renderer\Plugin\RendererPluginInterface;
 use Symfony\Component\Form\Event\DataEvent;
 use Symfony\Component\Form\Event\FilterDataEvent;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -495,7 +495,7 @@ class Field implements FieldInterface
         return $this->renderer;
     }
 
-    public function addRendererPlugin(PluginInterface $plugin)
+    public function addRendererPlugin(RendererPluginInterface $plugin)
     {
         $this->renderer->addPlugin($plugin);
 

+ 6 - 5
src/Symfony/Component/Form/Renderer/DefaultRenderer.php

@@ -13,7 +13,7 @@ namespace Symfony\Component\Form\Renderer;
 
 use Symfony\Component\Form\FieldInterface;
 use Symfony\Component\Form\Renderer\Theme\ThemeInterface;
-use Symfony\Component\Form\Renderer\Plugin\PluginInterface;
+use Symfony\Component\Form\Renderer\Plugin\RendererPluginInterface;
 
 class DefaultRenderer implements RendererInterface, \ArrayAccess
 {
@@ -33,8 +33,9 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
 
     private $children = array();
 
-    public function __construct(ThemeInterface $theme, $template)
+    public function __construct(FieldInterface $field, ThemeInterface $theme, $template)
     {
+        $this->field = $field;
         $this->theme = $theme;
         $this->template = $template;
     }
@@ -56,8 +57,8 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
             // Make sure that plugins and set variables are applied in the
             // order they were added
             foreach ($this->changes as $key => $value) {
-                if ($value instanceof PluginInterface) {
-                    $value->setUp($this);
+                if ($value instanceof RendererPluginInterface) {
+                    $value->setUp($this->field, $this);
                 } else {
                     $this->vars[$key] = $value;
                 }
@@ -82,7 +83,7 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
         return $this->theme;
     }
 
-    public function addPlugin(PluginInterface $plugin)
+    public function addPlugin(RendererPluginInterface $plugin)
     {
         $this->initialized = false;
         $this->changes[] = $plugin;

+ 3 - 10
src/Symfony/Component/Form/Renderer/Plugin/CheckedPlugin.php

@@ -14,17 +14,10 @@ namespace Symfony\Component\Form\Renderer\Plugin;
 use Symfony\Component\Form\Renderer\RendererInterface;
 use Symfony\Component\Form\FieldInterface;
 
-class CheckedPlugin implements PluginInterface
+class CheckedPlugin implements RendererPluginInterface
 {
-    private $field;
-
-    public function __construct(FieldInterface $field)
-    {
-        $this->field = $field;
-    }
-
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
-        $renderer->setVar('checked', (bool)$this->field->getData());
+        $renderer->setVar('checked', (bool)$field->getData());
     }
 }

+ 3 - 2
src/Symfony/Component/Form/Renderer/Plugin/ChoicePlugin.php

@@ -11,10 +11,11 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
+use Symfony\Component\Form\FieldInterface;
 use Symfony\Component\Form\Renderer\RendererInterface;
 use Symfony\Component\Form\ChoiceList\ChoiceListInterface;
 
-class ChoicePlugin implements PluginInterface
+class ChoicePlugin implements RendererPluginInterface
 {
     private $choiceList;
 
@@ -23,7 +24,7 @@ class ChoicePlugin implements PluginInterface
         $this->choiceList = $choiceList;
     }
 
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
         $choiceList = $this->choiceList;
 

+ 3 - 2
src/Symfony/Component/Form/Renderer/Plugin/DatePatternPlugin.php

@@ -11,9 +11,10 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
+use Symfony\Component\Form\FieldInterface;
 use Symfony\Component\Form\Renderer\RendererInterface;
 
-class DatePatternPlugin implements PluginInterface
+class DatePatternPlugin implements RendererPluginInterface
 {
     private $formatter;
 
@@ -22,7 +23,7 @@ class DatePatternPlugin implements PluginInterface
         $this->formatter = $formatter;
     }
 
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
         $renderer->setVar('date_pattern', $this->getPattern());
     }

+ 4 - 20
src/Symfony/Component/Form/Renderer/Plugin/EnctypePlugin.php

@@ -11,29 +11,13 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
-use Symfony\Component\Form\Renderer\RendererInterface;
 use Symfony\Component\Form\FieldInterface;
+use Symfony\Component\Form\Renderer\RendererInterface;
 
-class EnctypePlugin implements PluginInterface
+class EnctypePlugin implements RendererPluginInterface
 {
-    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:
-     *
-     *     <field action="..." method="post" {{ field.render.enctype }}>
-     *
-     * @param Form $field   The field for which to render the encoding type
-     */
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
-        $renderer->setVar('enctype', $this->field->isMultipart() ? 'enctype="multipart/form-data"' : '');
+        $renderer->setVar('enctype', $field->isMultipart() ? 'enctype="multipart/form-data"' : '');
     }
 }

+ 10 - 17
src/Symfony/Component/Form/Renderer/Plugin/FieldPlugin.php

@@ -14,15 +14,8 @@ namespace Symfony\Component\Form\Renderer\Plugin;
 use Symfony\Component\Form\Renderer\RendererInterface;
 use Symfony\Component\Form\FieldInterface;
 
-class FieldPlugin implements PluginInterface
+class FieldPlugin implements RendererPluginInterface
 {
-    private $field;
-
-    public function __construct(FieldInterface $field)
-    {
-        $this->field = $field;
-    }
-
     /**
      * Renders the HTML enctype in the field tag, if necessary
      *
@@ -32,12 +25,12 @@ class FieldPlugin implements PluginInterface
      *
      * @param Form $field   The field for which to render the encoding type
      */
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
-        $fieldKey = $this->field->getName();
+        $fieldKey = $field->getName();
 
-        if ($this->field->hasParent()) {
-            $parentRenderer = $this->field->getParent()->getRenderer();
+        if ($field->hasParent()) {
+            $parentRenderer = $field->getParent()->getRenderer();
             $parentId = $parentRenderer->getVar('id');
             $parentName = $parentRenderer->getVar('name');
             $id = sprintf('%s_%s', $parentId, $fieldKey);
@@ -50,13 +43,13 @@ class FieldPlugin implements PluginInterface
         $renderer->setVar('this', $renderer);
         $renderer->setVar('id', $id);
         $renderer->setVar('name', $name);
-        $renderer->setVar('errors', $this->field->getErrors());
-        $renderer->setVar('value', $this->field->getDisplayedData());
-        $renderer->setVar('disabled', $this->field->isDisabled());
-        $renderer->setVar('required', $this->field->isRequired());
+        $renderer->setVar('errors', $field->getErrors());
+        $renderer->setVar('value', $field->getDisplayedData());
+        $renderer->setVar('disabled', $field->isDisabled());
+        $renderer->setVar('required', $field->isRequired());
         $renderer->setVar('class', null);
         $renderer->setVar('max_length', null);
         $renderer->setVar('size', null);
-        $renderer->setVar('label', ucfirst(strtolower(str_replace('_', ' ', $this->field->getName()))));
+        $renderer->setVar('label', ucfirst(strtolower(str_replace('_', ' ', $field->getName()))));
     }
 }

+ 8 - 9
src/Symfony/Component/Form/Renderer/Plugin/FormPlugin.php

@@ -11,20 +11,19 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
-use Symfony\Component\Form\Renderer\RendererInterface;
+use Symfony\Component\Form\FieldInterface;
 use Symfony\Component\Form\FormInterface;
+use Symfony\Component\Form\Renderer\RendererInterface;
+use Symfony\Component\Form\Exception\UnexpectedTypeException;
 
-class FormPlugin implements PluginInterface
+class FormPlugin implements RendererPluginInterface
 {
-    private $form;
-
-    public function __construct(FormInterface $form)
+    public function setUp(FieldInterface $form, RendererInterface $renderer)
     {
-        $this->form = $form;
-    }
+        if (!$form instanceof FormInterface) {
+            throw new UnexpectedTypeException($form, 'Symfony\Component\Form\FormInterface');
+        }
 
-    public function setUp(RendererInterface $renderer)
-    {
         $fields = array();
 
         foreach ($this->form as $name => $field) {

+ 3 - 12
src/Symfony/Component/Form/Renderer/Plugin/MaxLengthPlugin.php

@@ -11,10 +11,10 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
-use Symfony\Component\Form\Renderer\RendererInterface;
 use Symfony\Component\Form\FieldInterface;
+use Symfony\Component\Form\Renderer\RendererInterface;
 
-class MaxLengthPlugin implements PluginInterface
+class MaxLengthPlugin implements RendererPluginInterface
 {
     private $maxLength;
 
@@ -23,16 +23,7 @@ class MaxLengthPlugin implements PluginInterface
         $this->maxLength = $maxLength;
     }
 
-    /**
-     * Renders the HTML enctype in the field tag, if necessary
-     *
-     * Example usage in Twig templates:
-     *
-     *     <field action="..." method="post" {{ field.render.enctype }}>
-     *
-     * @param Form $field   The field for which to render the encoding type
-     */
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
         $renderer->setVar('max_length', $this->maxLength);
     }

+ 3 - 2
src/Symfony/Component/Form/Renderer/Plugin/MoneyPatternPlugin.php

@@ -11,9 +11,10 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
+use Symfony\Component\Form\FieldInterface;
 use Symfony\Component\Form\Renderer\RendererInterface;
 
-class MoneyPatternPlugin implements PluginInterface
+class MoneyPatternPlugin implements RendererPluginInterface
 {
     private static $patterns = array();
 
@@ -24,7 +25,7 @@ class MoneyPatternPlugin implements PluginInterface
         $this->currency = $currency;
     }
 
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
         $renderer->setVar('money_pattern', self::getPattern($this->currency));
     }

+ 5 - 21
src/Symfony/Component/Form/Renderer/Plugin/ParentNamePlugin.php

@@ -11,31 +11,15 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
-use Symfony\Component\Form\Renderer\RendererInterface;
 use Symfony\Component\Form\FieldInterface;
+use Symfony\Component\Form\Renderer\RendererInterface;
 
-class ParentNamePlugin implements PluginInterface
+class ParentNamePlugin implements RendererPluginInterface
 {
-    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:
-     *
-     *     <field action="..." method="post" {{ field.render.enctype }}>
-     *
-     * @param Form $field   The field for which to render the encoding type
-     */
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
-        if ($this->field->hasParent()) {
-            $parentRenderer = $this->field->getParent()->getRenderer();
+        if ($field->hasParent()) {
+            $parentRenderer = $field->getParent()->getRenderer();
             $renderer->setVar('name', $parentRenderer->getVar('name'));
         }
     }

+ 6 - 18
src/Symfony/Component/Form/Renderer/Plugin/PasswordValuePlugin.php

@@ -11,35 +11,23 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
-use Symfony\Component\Form\Renderer\RendererInterface;
 use Symfony\Component\Form\FieldInterface;
+use Symfony\Component\Form\Renderer\RendererInterface;
 
-class PasswordValuePlugin implements PluginInterface
+class PasswordValuePlugin implements RendererPluginInterface
 {
-    private $field;
-
     private $alwaysEmpty;
 
-    public function __construct(FieldInterface $field, $alwaysEmpty = true)
+    public function __construct($alwaysEmpty = true)
     {
-        $this->field = $field;
         $this->alwaysEmpty = $alwaysEmpty;
     }
 
-    /**
-     * Renders the HTML enctype in the field tag, if necessary
-     *
-     * Example usage in Twig templates:
-     *
-     *     <field action="..." method="post" {{ field.render.enctype }}>
-     *
-     * @param Form $field   The field for which to render the encoding type
-     */
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
-        $value = $this->alwaysEmpty || !$this->field->isSubmitted()
+        $value = $this->alwaysEmpty || !$field->isSubmitted()
                 ? ''
-                : $this->field->getDisplayedData();
+                : $field->getDisplayedData();
 
         $renderer->setVar('value', $value);
     }

+ 3 - 2
src/Symfony/Component/Form/Renderer/Plugin/PluginInterface.php

@@ -11,9 +11,10 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
+use Symfony\Component\Form\FieldInterface;
 use Symfony\Component\Form\Renderer\RendererInterface;
 
-interface PluginInterface
+interface RendererPluginInterface
 {
-    function setUp(RendererInterface $renderer);
+    function setUp(FieldInterface $field, RendererInterface $renderer);
 }

+ 3 - 2
src/Symfony/Component/Form/Renderer/Plugin/SelectMultipleNamePlugin.php

@@ -11,11 +11,12 @@
 
 namespace Symfony\Component\Form\Renderer\Plugin;
 
+use Symfony\Component\Form\FieldInterface;
 use Symfony\Component\Form\Renderer\RendererInterface;
 
-class SelectMultipleNamePlugin implements PluginInterface
+class SelectMultipleNamePlugin implements RendererPluginInterface
 {
-    public function setUp(RendererInterface $renderer)
+    public function setUp(FieldInterface $field, RendererInterface $renderer)
     {
         // Add "[]" to the name in case a select tag with multiple options is
         // displayed. Otherwise only one of the selected options is sent in the