diff --git a/src/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php b/src/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php index b72a5739f843d..d3f5da7894ce7 100644 --- a/src/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php +++ b/src/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php @@ -256,7 +256,7 @@ public function serialize() case 'resolved_options': case 'default_data': case 'submitted_data': - if ($v) { + if (is_array($v)) { $form[$k] = array_map($cloneVar, $v); } break; diff --git a/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php b/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php index 0fddf14dc57bc..83c3d1d94d49a 100644 --- a/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php @@ -342,6 +342,114 @@ public function testBuildFinalFormTree() ), $this->dataCollector->getData()); } + public function testSerializeWithFormAddedMultipleTimes() + { + $form1 = $this->createForm('form1'); + $form2 = $this->createForm('form2'); + $child1 = $this->createForm('child1'); + + $form1View = new FormView(); + $form2View = new FormView(); + $child1View = new FormView(); + $child1View->vars['is_selected'] = function ($choice, array $values) { + return in_array($choice, $values, true); + }; + + $form1->add($child1); + $form2->add($child1); + + $form1View->children['child1'] = $child1View; + $form2View->children['child1'] = $child1View; + + $this->dataExtractor->expects($this->at(0)) + ->method('extractConfiguration') + ->with($form1) + ->will($this->returnValue(array('config' => 'foo'))); + $this->dataExtractor->expects($this->at(1)) + ->method('extractConfiguration') + ->with($child1) + ->will($this->returnValue(array('config' => 'bar'))); + + $this->dataExtractor->expects($this->at(2)) + ->method('extractDefaultData') + ->with($form1) + ->will($this->returnValue(array('default_data' => 'foo'))); + $this->dataExtractor->expects($this->at(3)) + ->method('extractDefaultData') + ->with($child1) + ->will($this->returnValue(array('default_data' => 'bar'))); + + $this->dataExtractor->expects($this->at(4)) + ->method('extractSubmittedData') + ->with($form1) + ->will($this->returnValue(array('submitted_data' => 'foo'))); + $this->dataExtractor->expects($this->at(5)) + ->method('extractSubmittedData') + ->with($child1) + ->will($this->returnValue(array('submitted_data' => 'bar'))); + + $this->dataExtractor->expects($this->at(6)) + ->method('extractViewVariables') + ->with($form1View) + ->will($this->returnValue(array('view_vars' => 'foo'))); + + $this->dataExtractor->expects($this->at(7)) + ->method('extractViewVariables') + ->with($child1View) + ->will($this->returnValue(array('view_vars' => $child1View->vars))); + + $this->dataExtractor->expects($this->at(8)) + ->method('extractConfiguration') + ->with($form2) + ->will($this->returnValue(array('config' => 'foo'))); + $this->dataExtractor->expects($this->at(9)) + ->method('extractConfiguration') + ->with($child1) + ->will($this->returnValue(array('config' => 'bar'))); + + $this->dataExtractor->expects($this->at(10)) + ->method('extractDefaultData') + ->with($form2) + ->will($this->returnValue(array('default_data' => 'foo'))); + $this->dataExtractor->expects($this->at(11)) + ->method('extractDefaultData') + ->with($child1) + ->will($this->returnValue(array('default_data' => 'bar'))); + + $this->dataExtractor->expects($this->at(12)) + ->method('extractSubmittedData') + ->with($form2) + ->will($this->returnValue(array('submitted_data' => 'foo'))); + $this->dataExtractor->expects($this->at(13)) + ->method('extractSubmittedData') + ->with($child1) + ->will($this->returnValue(array('submitted_data' => 'bar'))); + + $this->dataExtractor->expects($this->at(14)) + ->method('extractViewVariables') + ->with($form2View) + ->will($this->returnValue(array('view_vars' => 'foo'))); + + $this->dataExtractor->expects($this->at(15)) + ->method('extractViewVariables') + ->with($child1View) + ->will($this->returnValue(array('view_vars' => $child1View->vars))); + + $this->dataCollector->collectConfiguration($form1); + $this->dataCollector->collectDefaultData($form1); + $this->dataCollector->collectSubmittedData($form1); + $this->dataCollector->collectViewVariables($form1View); + $this->dataCollector->buildFinalFormTree($form1, $form1View); + + $this->dataCollector->collectConfiguration($form2); + $this->dataCollector->collectDefaultData($form2); + $this->dataCollector->collectSubmittedData($form2); + $this->dataCollector->collectViewVariables($form2View); + $this->dataCollector->buildFinalFormTree($form2, $form2View); + + $this->dataCollector->serialize(); + } + public function testFinalFormReliesOnFormViewStructure() { $this->form->add($child1 = $this->createForm('first'));