diff --git a/src/Symfony/Bridge/Twig/Extension/FormExtension.php b/src/Symfony/Bridge/Twig/Extension/FormExtension.php index b954d8d1c836..25004e90fd0e 100644 --- a/src/Symfony/Bridge/Twig/Extension/FormExtension.php +++ b/src/Symfony/Bridge/Twig/Extension/FormExtension.php @@ -223,7 +223,7 @@ protected function render(FormView $view, $section, array $variables = array()) } } - $custom = '_'.$view->get('proto_id', $view->get('id')); + $custom = '_'.$view->get('id'); $rendering = $custom.$section; $blocks = $this->getBlocks($view); diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig index 0fb71766670a..d2e70b800e89 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig @@ -9,6 +9,15 @@ {% endspaceless %} {% endblock form_widget %} +{% block collection_widget %} +{% spaceless %} + {% if prototype is defined %} + {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %} + {% endif %} + {{ block('form_widget') }} +{% endspaceless %} +{% endblock collection_widget %} + {% block textarea_widget %} {% spaceless %} @@ -222,12 +231,6 @@ {% endspaceless %} {% endblock field_row %} -{% block prototype_row %} -{% spaceless %} - -{% endspaceless %} -{% endblock prototype_row %} - {% block hidden_row %} {{ form_widget(form) }} {% endblock hidden_row %} diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/collection_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/collection_widget.html.php new file mode 100644 index 000000000000..9f6a94bcefc9 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/collection_widget.html.php @@ -0,0 +1,4 @@ + + escape($view['form']->row($prototype)) ?> + +widget($form, array('attr' => $attr)) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/prototype_row.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/prototype_row.html.php deleted file mode 100644 index ca0b1a26fdab..000000000000 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/prototype_row.html.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php b/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php index 6c3f3e8b609e..276fcdac5985 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php +++ b/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php @@ -199,7 +199,7 @@ protected function renderSection(FormView $view, $section, array $variables = ar $template = null; - $custom = '_'.$view->get('proto_id', $view->get('id')); + $custom = '_'.$view->get('id'); $rendering = $custom.$section; if (isset($this->varStack[$rendering])) { diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php b/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php index 1559cd393a40..c75c2549c758 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php @@ -27,7 +27,8 @@ public function buildForm(FormBuilder $builder, array $options) { if ($options['allow_add'] && $options['prototype']) { $prototype = $builder->create('$$name$$', $options['type'], $options['options']); - $builder->setAttribute('prototype', $prototype); + $builder->setAttribute('prototype', $prototype->getForm()); + $builder->add($prototype); } $dataClass = isset($options['options']['data_class']) ? $options['options']['data_class'] : null; @@ -63,7 +64,7 @@ public function buildView(FormView $view, FormInterface $form) ; if ($form->hasAttribute('prototype')) { - $view->set('prototype', $form->getAttribute('prototype')); + $view->set('prototype', $form->getAttribute('prototype')->createView($view)); } } diff --git a/src/Symfony/Component/Form/Form.php b/src/Symfony/Component/Form/Form.php index 51794b20184c..f3af5f53df81 100644 --- a/src/Symfony/Component/Form/Form.php +++ b/src/Symfony/Component/Form/Form.php @@ -925,16 +925,6 @@ public function createView(FormView $parent = null) $childViews[$key] = $child->createView($view); } - if (null !== $prototype = $view->get('prototype')) { - $protoView = $prototype->getForm()->createView($view); - $protoTypes = $protoView->get('types'); - $protoTypes[] = 'prototype'; - $childViews[$prototype->getName()] = $protoView - ->set('types', $protoTypes) - ->set('proto_id', $view->get('id').'_prototype'); - ; - } - $view->setChildren($childViews); foreach ($types as $type) { diff --git a/tests/Symfony/Tests/Component/Form/AbstractLayoutTest.php b/tests/Symfony/Tests/Component/Form/AbstractLayoutTest.php index 1a1ae172ad98..8d7cfc9d1fda 100644 --- a/tests/Symfony/Tests/Component/Form/AbstractLayoutTest.php +++ b/tests/Symfony/Tests/Component/Form/AbstractLayoutTest.php @@ -1692,9 +1692,10 @@ public function testCollectionPrototype() $html = $this->renderWidget($form); $this->assertMatchesXpath($html, -'//script - [@id="na&me_items_prototype"] - [@type="text/html"] + '//div[@id="na&me_items"][@data-prototype] + | + //table[@id="na&me_items"][@data-prototype] + ' ); }