Forráskód Böngészése

[Form] Refactored ChoiceField to FormFactory::getChoiceField()

Bernhard Schussek 14 éve
szülő
commit
b148a2a7ed

+ 22 - 20
src/Symfony/Bundle/TwigBundle/Resources/views/form.html.twig

@@ -113,37 +113,39 @@
 
 {% block choice__widget %}
 {% spaceless %}
-    {% if field.isExpanded %}
-        {% for choice, child in field %}
-            {{ child.renderer.widget }}
-            <label for="{{ id }}">{{ choice_list.label(choice) }}</label>
-        {% endfor %}
-    {% else %}
-        <select {{ block('field_attributes') }}{% if field.isMultipleChoice %} multiple="multiple"{% endif %}>
-            {% if not field.required %}
-                <option value="">{{ empty_value }}</option>
-            {% endif %}
-            {% if preferred_choices|length > 0 %}
-                {% set options = preferred_choices %}
-                {{ block('options') }}
-                <option disabled="disabled">{{ separator }}</option>
-            {% endif %}
-            {% set options = choices %}
+    <select {{ block('field_attributes') }}{% if field.isMultipleChoice %} multiple="multiple"{% endif %}>
+        {% if not field.required %}
+            <option value="">{{ empty_value }}</option>
+        {% endif %}
+        {% if preferred_choices|length > 0 %}
+            {% set options = preferred_choices %}
             {{ block('options') }}
-        </select>
-    {% endif %}
+            <option disabled="disabled">{{ separator }}</option>
+        {% endif %}
+        {% set options = choices %}
+        {{ block('options') }}
+    </select>
 {% endspaceless %}
 {% endblock choice__widget %}
 
+{% block choice_expanded__widget %}
+{% spaceless %}
+    {% for choice, child in field %}
+        {{ child.renderer.widget }}
+        {{ child.renderer.label(choice_list.label(choice)) }}
+    {% endfor %}
+{% endspaceless %}
+{% endblock choice_expanded__widget %}
+
 {% block checkbox__widget %}
 {% spaceless %}
-    <input type="checkbox" {{ block('field_attributes') }}{% if field.hasValue %} value="{{ field.value }}"{% endif %}{% if field.ischecked %} checked="checked"{% endif %} />
+    <input type="checkbox" {{ block('field_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if field.data %} checked="checked"{% endif %} />
 {% endspaceless %}
 {% endblock checkbox__widget %}
 
 {% block radio__widget %}
 {% spaceless %}
-    <input type="radio" {{ block('field_attributes') }}{% if field.hasValue %} value="{{ field.value }}"{% endif %}{% if field.ischecked %} checked="checked"{% endif %} />
+    <input type="radio" {{ block('field_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if field.data %} checked="checked"{% endif %} />
 {% endspaceless %}
 {% endblock radio__widget %}
 

+ 3 - 0
src/Symfony/Component/Form/Field.php

@@ -483,6 +483,9 @@ class Field extends Configurable implements FieldInterface
      */
     public function setRenderer(RendererInterface $renderer)
     {
+        $renderer->setParameter('field', $this);
+        $renderer->setParameter('label', ucfirst(strtolower(str_replace('_', ' ', $this->getKey()))));
+
         $this->renderer = $renderer;
 
         return $this;

+ 89 - 8
src/Symfony/Component/Form/FormFactory.php

@@ -12,15 +12,26 @@
 namespace Symfony\Component\Form;
 
 use Symfony\Component\Form\ValueTransformer\BooleanToStringTransformer;
+use Symfony\Component\Form\ChoiceList\DefaultChoiceList;
+use Symfony\Component\Form\DataProcessor\RadioToArrayConverter;
 use Symfony\Component\Form\Renderer\DefaultRenderer;
+use Symfony\Component\Form\Renderer\Theme\ThemeInterface;
 use Symfony\Component\Form\Renderer\Plugin\IdPlugin;
 use Symfony\Component\Form\Renderer\Plugin\NamePlugin;
 use Symfony\Component\Form\Renderer\Plugin\ValuePlugin;
+use Symfony\Component\Form\Renderer\Plugin\ChoicePlugin;
+use Symfony\Component\Form\Renderer\Plugin\ParentNamePlugin;
+use Symfony\Component\Form\ValueTransformer\ScalarToChoicesTransformer;
 
 class FormFactory
 {
     private $theme;
 
+    public function __construct(ThemeInterface $theme)
+    {
+        $this->setTheme($theme);
+    }
+
     public function setTheme(ThemeInterface $theme)
     {
         $this->theme = $theme;
@@ -31,9 +42,19 @@ class FormFactory
         return $this->theme;
     }
 
-    protected function getField($name, $template)
+    protected function getField($key, $template)
+    {
+        $field = new Field($key);
+
+        return $field
+            ->setRenderer(new DefaultRenderer($this->theme, $template))
+            ->addRendererPlugin(new IdPlugin($field))
+            ->addRendererPlugin(new NamePlugin($field));
+    }
+
+    protected function getForm($key, $template)
     {
-        $field = new Field($name);
+        $field = new Form($key);
 
         return $field
             ->setRenderer(new DefaultRenderer($this->theme, $template))
@@ -41,19 +62,79 @@ class FormFactory
             ->addRendererPlugin(new NamePlugin($field));
     }
 
-    public function getCheckboxField($name, $value = '1')
+    public function getCheckboxField($key, array $options = array())
     {
-        return $this->getField($name, 'checkbox')
+        $options = array_replace(array(
+            'value' => '1',
+        ), $options);
+
+        return $this->getField($key, 'checkbox')
             ->setValueTransformer(new BooleanToStringTransformer())
-            ->addRendererPlugin(new ValuePlugin($value));
+            ->addRendererPlugin(new ValuePlugin($options['value']));
     }
 
-    public function getRadioField($name)
+    public function getRadioField($key, array $options = array())
     {
-        $field = $this->getField($name, 'radio');
+        $options = array_replace(array(
+            'value' => null,
+        ), $options);
+
+        $field = $this->getField($key, 'radio');
 
         return $field
             ->setValueTransformer(new BooleanToStringTransformer())
-            ->addRendererPlugin(new ParentNamePlugin($field));
+            ->addRendererPlugin(new ParentNamePlugin($field))
+            ->addRendererPlugin(new ValuePlugin($options['value']));
+    }
+
+    public function getChoiceField($key, array $options = array())
+    {
+        $options = array_replace(array(
+            'choices' => array(),
+            'preferred_choices' => array(),
+            'multiple' => false,
+            'expanded' => false,
+        ), $options);
+
+        $choiceList = new DefaultChoiceList(
+            $options['choices'],
+            $options['preferred_choices']
+        );
+
+        if (!$options['expanded']) {
+            $field = $this->getField($key, 'choice');
+        } else {
+            $field = $this->getForm($key, 'choice_expanded');
+            $choices = array_merge($choiceList->getPreferredChoices(), $choiceList->getOtherChoices());
+
+            foreach ($choices as $choice => $value) {
+                if ($options['multiple']) {
+                    $field->add($this->getCheckboxField($choice, array(
+                        'value' => $choice,
+                    )));
+                } else {
+                    $field->add($this->getRadioField($choice, array(
+                        'value' => $choice,
+                    )));
+                }
+            }
+        }
+
+        $field->addRendererPlugin(new ChoicePlugin($choiceList));
+
+        if ($options['multiple'] && $options['expanded']) {
+            $field->setValueTransformer(new ArrayToChoicesTransformer($choiceList));
+        }
+
+        if (!$options['multiple'] && $options['expanded']) {
+            $field->setValueTransformer(new ScalarToChoicesTransformer($choiceList));
+            $field->setDataPreprocessor(new RadioToArrayConverter());
+        }
+
+        if ($options['multiple'] && !$options['expanded']) {
+            $field->addRendererPlugin(new SelectMultipleNamePlugin($field));
+        }
+
+        return $field;
     }
 }