瀏覽代碼

[Form] Fixed: ChoiceFields never validated

Bernhard Schussek 14 年之前
父節點
當前提交
2276b98fc1
共有 2 個文件被更改,包括 37 次插入17 次删除
  1. 18 17
      src/Symfony/Component/Form/Form.php
  2. 19 0
      tests/Symfony/Tests/Component/Form/FormTest.php

+ 18 - 17
src/Symfony/Component/Form/Form.php

@@ -855,28 +855,29 @@ class Form extends Field implements \IteratorAggregate, FormInterface
      */
     public function validateData(ExecutionContext $context)
     {
-        $groups = $this->getValidationGroups();
-        $propertyPath = $context->getPropertyPath();
-        $graphWalker = $context->getGraphWalker();
+        if (is_object($this->getData()) || is_array($this->getData())) {
+            $groups = $this->getValidationGroups();
+            $propertyPath = $context->getPropertyPath();
+            $graphWalker = $context->getGraphWalker();
 
-        if (null === $groups) {
-            $groups = array(null);
-        }
+            if (null === $groups) {
+                $groups = array(null);
+            }
 
-        // The Execute constraint is called on class level, so we need to
-        // set the property manually
-        $context->setCurrentProperty('data');
+            // The Execute constraint is called on class level, so we need to
+            // set the property manually
+            $context->setCurrentProperty('data');
 
-        // Adjust the property path accordingly
-        if (!empty($propertyPath)) {
-            $propertyPath .= '.';
-        }
+            // Adjust the property path accordingly
+            if (!empty($propertyPath)) {
+                $propertyPath .= '.';
+            }
 
-        $propertyPath .= 'data';
+            $propertyPath .= 'data';
 
-        foreach ($groups as $group) {
-            // Don't use potential overridden versions of getData()!
-            $graphWalker->walkReference(Form::getData(), $group, $propertyPath, true);
+            foreach ($groups as $group) {
+                $graphWalker->walkReference($this->getData(), $group, $propertyPath, true);
+            }
         }
     }
 

+ 19 - 0
tests/Symfony/Tests/Component/Form/FormTest.php

@@ -1111,6 +1111,25 @@ class FormTest extends \PHPUnit_Framework_TestCase
         $form->validateData($context);
     }
 
+    public function testValidateDataDoesNotWalkScalars()
+    {
+        $graphWalker = $this->createMockGraphWalker();
+        $metadataFactory = $this->createMockMetadataFactory();
+        $context = new ExecutionContext('Root', $graphWalker, $metadataFactory);
+        $valueTransformer = $this->createMockTransformer();
+        $form = new Form('author', array('value_transformer' => $valueTransformer));
+
+        $graphWalker->expects($this->never())
+                ->method('walkReference');
+
+        $valueTransformer->expects($this->atLeastOnce())
+                ->method('reverseTransform')
+                ->will($this->returnValue('foobar'));
+
+        $form->submit(array('foo' => 'bar')); // reverse transformed to "foobar"
+        $form->validateData($context);
+    }
+
     /**
      * Create a group containing two fields, "visibleField" and "hiddenField"
      *