diff --git a/UPGRADE-4.2.md b/UPGRADE-4.2.md index 743543a1c8..3ec02f3478 100644 --- a/UPGRADE-4.2.md +++ b/UPGRADE-4.2.md @@ -6,6 +6,25 @@ Cache * Deprecated `CacheItem::getPreviousTags()`, use `CacheItem::getMetadata()` instead. +Form +---- + + * Deprecated calling `FormRenderer::searchAndRenderBlock` for fields which were already rendered. + Instead of expecting such calls to return empty strings, check if the field has already been rendered. + + Before: + ```twig + {% for field in fieldsWithPotentialDuplicates %} + {{ form_widget(field) }} + {% endfor %} + ``` + + After: + ```twig + {% for field in fieldsWithPotentialDuplicates if not field.rendered %} + {{ form_widget(field) }} + {% endfor %} + ``` Security -------- 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 0094a1cde1..02c86fddc2 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 @@ -398,7 +398,7 @@ {# Support #} {%- block form_rows -%} - {% for child in form %} + {% for child in form if not child.rendered %} {{- form_row(child) -}} {% endfor %} {%- endblock form_rows -%} diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_rows.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_rows.html.php index 8c3ba86f7a..4de226f2b8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_rows.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_rows.html.php @@ -1,3 +1,5 @@ - row($child) ?> + isRendered()): ?> + row($child) ?> + diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index e290e3a4c2..30a3e7a994 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +4.2.0 +----- + + * deprecated calling `FormRenderer::searchAndRenderBlock` for fields which were already rendered + 4.1.0 ----- diff --git a/src/Symfony/Component/Form/FormRenderer.php b/src/Symfony/Component/Form/FormRenderer.php index 92f042de2c..87e612d9a5 100644 --- a/src/Symfony/Component/Form/FormRenderer.php +++ b/src/Symfony/Component/Form/FormRenderer.php @@ -132,6 +132,9 @@ class FormRenderer implements FormRendererInterface $renderOnlyOnce = 'row' === $blockNameSuffix || 'widget' === $blockNameSuffix; if ($renderOnlyOnce && $view->isRendered()) { + // This is not allowed, because it would result in rendering same IDs multiple times, which is not valid. + @trigger_error(sprintf('You are calling "form_%s" for field "%s" which has already been rendered before, trying to render fields which were already rendered is deprecated since Symfony 4.2 and will throw an exception in 5.0.', $blockNameSuffix, $view->vars['name']), E_USER_DEPRECATED); + // throw new BadMethodCallException(sprintf('Field "%s" has already been rendered. Save result of previous render call to variable and output that instead.', $view->vars['name'])); return ''; }