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]
+
'
);
}