ソースを参照

Fix BooleanType and TranslatableType to use proper Form inheritance (getParent)

Thomas Rabaix 12 年 前
コミット
39f00e1bb4

+ 7 - 18
Form/Type/BooleanType.php

@@ -11,38 +11,27 @@
 
 namespace Sonata\AdminBundle\Form\Type;
 
-use Symfony\Component\Form\Extension\Core\Type\ChoiceType as FormChoiceType;
 use Symfony\Component\Translation\TranslatorInterface;
+use Symfony\Component\Form\AbstractType;
 
 use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
-class BooleanType extends FormChoiceType
+class BooleanType extends AbstractType
 {
     const TYPE_YES = 1;
 
     const TYPE_NO = 2;
 
-    protected $translator;
-
-    /**
-     * @param \Symfony\Component\Translation\TranslatorInterface $translator
-     */
-    public function __construct(TranslatorInterface $translator)
-    {
-        $this->translator = $translator;
-    }
-
     /**
      * {@inheritDoc}
      */
     public function setDefaultOptions(OptionsResolverInterface $resolver)
     {
-        parent::setDefaultOptions($resolver);
-
         $resolver->setDefaults(array(
-            'choices' => array(
-                self::TYPE_YES  => $this->translator->trans('label_type_yes', array(), 'SonataAdminBundle'),
-                self::TYPE_NO   => $this->translator->trans('label_type_no', array(), 'SonataAdminBundle')
+            'catalogue' => 'SonataAdminBundle',
+            'choices'   => array(
+                self::TYPE_YES  => 'label_type_yes',
+                self::TYPE_NO   => 'label_type_no'
             )
         ));
     }
@@ -52,7 +41,7 @@ class BooleanType extends FormChoiceType
      */
     public function getParent()
     {
-        return 'choice';
+        return 'sonata_type_translatable_choice';
     }
 
     /**

+ 9 - 32
Form/Type/TranslatableChoiceType.php

@@ -13,7 +13,7 @@
 namespace Sonata\AdminBundle\Form\Type;
 
 use Symfony\Component\Translation\TranslatorInterface;
-use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormInterface;
 use Symfony\Component\Form\FormView;
 use Symfony\Component\Form\FormBuilderInterface;
@@ -21,7 +21,7 @@ use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\Options;
 use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
-class TranslatableChoiceType extends ChoiceType
+class TranslatableChoiceType extends AbstractType
 {
     protected $translator;
 
@@ -34,52 +34,29 @@ class TranslatableChoiceType extends ChoiceType
     }
 
     /**
-     * {@inheritedDoc}
+     * {@inheritDoc}
      */
     public function setDefaultOptions(OptionsResolverInterface $resolver)
     {
         $resolver->setDefaults(array(
-            'multiple'          => false,
-            'expanded'          => false,
-            'choice_list'       => null,
-            'choices'           => array(),
-            'preferred_choices' => array(),
-            'catalogue'         => 'messages',
-
-            'empty_data'        => function (Options $options, $previousValue) {
-                $multiple = isset($options['multiple']) && $options['multiple'];
-                $expanded = isset($options['expanded']) && $options['expanded'];
-
-                return $multiple || $expanded ? array() : '';
-            },
-
-            'empty_value'       => function (Options $options, $previousValue) {
-                $multiple = isset($options['multiple']) && $options['multiple'];
-                $expanded = isset($options['expanded']) && $options['expanded'];
-
-                return $multiple || $expanded || !isset($options['empty_value']) ? null : '';
-            },
-
-            'error_bubbling'    => false,
+            'catalogue' => 'messages',
         ));
     }
 
     /**
      * {@inheritDoc}
      */
-    public function buildForm(FormBuilderInterface $builder, array $options)
+    public function buildView(FormView $view, FormInterface $form, array $options)
     {
         // translate options before building form
-        foreach ($options['choices'] as $name => $value) {
-            $options['choices'][$name] = $this->translator->trans($value, array(), $options['catalogue']);
+        foreach ($view->vars['choices'] as $choiceView) {
+            $choiceView->label = $this->translator->trans($choiceView->label, array(), $options['catalogue']);
         }
 
         // translate empty value
-        if (!empty($options['empty_value'])) {
-            $options['empty_value'] = $this->translator->trans($options['empty_value'], array(), $options['catalogue']);
+        if (!empty($view->vars['empty_value'])) {
+            $view->vars['empty_value'] = $this->translator->trans($view->vars['empty_value'], array(), $options['catalogue']);
         }
-
-        parent::buildForm($builder, $options);
     }
 
     /**

+ 0 - 1
Resources/config/form_types.xml

@@ -33,7 +33,6 @@
 
         <service id="sonata.admin.form.type.boolean" class="Sonata\AdminBundle\Form\Type\BooleanType">
             <tag name="form.type" alias="sonata_type_boolean" />
-            <argument type="service" id="translator" />
         </service>
 
         <service id="sonata.admin.form.type.translatable_choice" class="Sonata\AdminBundle\Form\Type\TranslatableChoiceType">

+ 25 - 0
Tests/Form/Type/BooleanTypeTest.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace Sonata\AdminBundle\Tests\Form\Type;
+
+use Sonata\AdminBundle\Form\Type\BooleanType;
+use Symfony\Component\Form\Tests\Extension\Core\Type\TypeTestCase;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class BooleanTypeTest extends TypeTestCase
+{
+    public function testGetDefaultOptions()
+    {
+        $type = new BooleanType();
+
+        $optionResolver = new OptionsResolver();
+
+        $this->assertEquals('sonata_type_translatable_choice', $type->getParent());
+
+        $type->setDefaultOptions($optionResolver);
+
+        $options = $optionResolver->resolve();
+
+        $this->assertEquals(2, count($options['choices']));
+    }
+}

Tests/Form/Type/DateTimeRangeTypeTest.php → Tests/Form/Type/Filter/DateTimeRangeTypeTest.php


+ 27 - 0
Tests/Form/Type/TranslatableChoiceTypeTest.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace Sonata\AdminBundle\Tests\Form\Type;
+
+use Sonata\AdminBundle\Form\Type\TranslatableChoiceType;
+use Symfony\Component\Form\Tests\Extension\Core\Type\TypeTestCase;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class TranslatableChoiceTypeTest extends TypeTestCase
+{
+    public function testGetDefaultOptions()
+    {
+        $stub = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
+
+        $type = new TranslatableChoiceType($stub);
+
+        $optionResolver = new OptionsResolver();
+
+        $this->assertEquals('choice', $type->getParent());
+
+        $type->setDefaultOptions($optionResolver);
+
+        $options = $optionResolver->resolve(array('catalogue' => 'foo'));
+
+        $this->assertEquals('foo', $options['catalogue']);
+    }
+}