Bläddra i källkod

Merge #1303 and tweak code to be BC

Thomas Rabaix 11 år sedan
förälder
incheckning
07e84ac941

+ 14 - 6
Form/DataTransformer/BooleanToSonataBooleanTransformer.php

@@ -1,22 +1,31 @@
 <?php
 
+/*
+ * This file is part of the Sonata project.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+
 namespace Sonata\AdminBundle\Form\DataTransformer;
 
 use Symfony\Component\Form\DataTransformerInterface;
 use Sonata\AdminBundle\Form\Type\BooleanType;
 
-class BooleanToSonataBooleanTransformer implements DataTransformerInterface
+class BooleanTypeToBooleanTransformer implements DataTransformerInterface
 {
-
     /**
      * {@inheritdoc}
      */
     public function transform($value)
     {
-        if ($value === true) {
+        if ($value === true or (int)$value === BooleanType::TYPE_YES) {
             return BooleanType::TYPE_YES;
         }
-        
+
         return BooleanType::TYPE_NO;
     }
 
@@ -28,8 +37,7 @@ class BooleanToSonataBooleanTransformer implements DataTransformerInterface
         if ($value === BooleanType::TYPE_YES) {
             return true;
         }
-        
+
         return false;
     }
-
 }

+ 10 - 4
Form/Type/BooleanType.php

@@ -13,7 +13,7 @@ namespace Sonata\AdminBundle\Form\Type;
 
 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilderInterface;
-use Sonata\AdminBundle\Form\DataTransformer\BooleanToSonataBooleanTransformer;
+use Sonata\AdminBundle\Form\DataTransformer\BooleanTypeToBooleanTransformer;
 
 use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
@@ -23,11 +23,16 @@ class BooleanType extends AbstractType
 
     const TYPE_NO = 2;
 
+    /**
+     * {@inheritDoc}
+     */
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->addModelTransformer(new BooleanToSonataBooleanTransformer());
+        if ($options['transform']) {
+            $builder->addModelTransformer(new BooleanTypeToBooleanTransformer());
+        }
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -38,7 +43,8 @@ class BooleanType extends AbstractType
             'choices'   => array(
                 self::TYPE_YES  => 'label_type_yes',
                 self::TYPE_NO   => 'label_type_no'
-            )
+            ),
+            'transform' => false
         ));
     }
 

+ 50 - 0
Tests/Form/DataTransformer/BooleanTypeToBooleanTransformerTest.php

@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sonata\AdminBundle\Tests\Form\DataTransformer;
+
+use Sonata\AdminBundle\Form\Type\BooleanType;
+use Sonata\AdminBundle\Form\DataTransformer\BooleanTypeToBooleanTransformer;
+
+class BooleanTypeToBooleanTransformerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getReverseTransformData
+     */
+    public function testReverseTransform($value, $expected)
+    {
+        $transformer = new BooleanTypeToBooleanTransformer();
+
+        $this->assertEquals($expected, $transformer->transform($value));
+    }
+
+    public function testTransform()
+    {
+        $transformer = new BooleanTypeToBooleanTransformer();
+        $this->assertTrue($transformer->reverseTransform(BooleanType::TYPE_YES));
+        $this->assertTrue($transformer->reverseTransform(1));
+        $this->assertFalse($transformer->reverseTransform('asd'));
+        $this->assertFalse($transformer->reverseTransform(BooleanType::TYPE_NO));
+    }
+
+    public function getReverseTransformData()
+    {
+        return array(
+            array(true, BooleanType::TYPE_YES),
+            array(false, BooleanType::TYPE_NO),
+            array("wrong", BooleanType::TYPE_NO),
+            array("1", BooleanType::TYPE_YES),
+            array("2", BooleanType::TYPE_NO),
+
+            array("3", BooleanType::TYPE_NO), // default value is false ...
+        );
+    }
+}

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

@@ -31,4 +31,34 @@ class BooleanTypeTest extends TypeTestCase
 
         $this->assertEquals(2, count($options['choices']));
     }
+
+    public function testAddTransformerCall()
+    {
+        $type = new BooleanType();
+
+        $type->setDefaultOptions($optionResolver = new OptionsResolver());
+
+        $builder = $this->getMock('Symfony\Component\Form\Test\FormBuilderInterface');
+        $builder->expects($this->once())->method('addModelTransformer');
+
+        $type->buildForm($builder, $optionResolver->resolve(array(
+            'transform' => true,
+        )));
+    }
+
+    /**
+     * The default behavior is not to transform to real boolean value .... don't ask
+     *
+     */
+    public function testDefaultBehavior()
+    {
+        $type = new BooleanType();
+
+        $type->setDefaultOptions($optionResolver = new OptionsResolver());
+
+        $builder = $this->getMock('Symfony\Component\Form\Test\FormBuilderInterface');
+        $builder->expects($this->never())->method('addModelTransformer');
+
+        $type->buildForm($builder, $optionResolver->resolve(array()));
+    }
 }

+ 1 - 1
Tests/Form/Type/CollectionTypeTest.php

@@ -12,7 +12,7 @@
 namespace Sonata\AdminBundle\Tests\Form\Type;
 
 use Sonata\AdminBundle\Form\Type\CollectionType;
-use Symfony\Component\Form\Tests\Extension\Core\Type\TypeTestCase;
+use Symfony\Component\Form\Test\TypeTestCase;
 use Symfony\Component\OptionsResolver\OptionsResolver;
 
 class CollectionTypeTest extends TypeTestCase