Drupal is a registered trademark of Dries Buytaert
Protected Pages 3.0.0 Major update available for module protected_pages (3.0.0). Commerce Core 3.3.8 Minor update available for module commerce (3.3.8). Search API HTML Element Filter 1.0.7 Minor update available for module search_api_html_element_filter (1.0.7). Layout Builder Reorder 2.0.1 Minor update available for module layout_builder_reorder (2.0.1). Ban 1.1.0 Minor update available for module ban (1.1.0). Field Formatter Range 2.0.0 Major update available for module field_formatter_range (2.0.0). Field Formatter Range 8.x-1.8 Minor update available for module field_formatter_range (8.x-1.8). Varbase Media Header 9.2.1 Minor update available for module varbase_media_header (9.2.1). Search API Solr 4.3.11 Module search_api_solr updated after 14 months of inactivity (4.3.11). Content Translation Redirect Module content_translation_redirect crossed 1,000 active installs.

This module automatically fixes a common bug in Twig templates where rendering content within an `if` statement could cause it to be rendered twice, leading to performance issues or unexpected behavior like form double submissions. It optimizes by capturing the rendered content in a variable for a single output.

Enabling this module has no visible effect whatsoever to end users and even developers need to read the compiled twig files to see any changes so almost always it is completely invisible. It is, however a bugfix to a common bug and a potential performance boost.

The bug is in a common pattern used to check whether a render array is empty followed by printing the variable (#327 and #333 in this core issue):

{% if content.body | render %}
<div>
{{ content.body }}
</div>
{% endif %}

TLDR for the rest: this code can be kept like as is despite it has a bug and this module automatically fixes the bug.

This code will render content.body twice any time it is not empty -- that's the bug. Most of the time this bug avoids detection because it's merely a performance hit. However, if it hits a form (for example a webform) that form will double submit. Any number of subtler issues might occur because of the unexpected double rendering -- for example if a form has an id "foo" then the expectation is <form id="foo"> but <form id="foo--1"> will appear instead. When the form is rendered first, Drupal will think the HTML ID "foo" is used and won't realize the {% if %} throws this HTML away and so it assigns a unique ID to the form when it is rendered the second time.

The recommended bugfix is something like:

{% set body_rendered = content.body | render %}
{% if  body_rendered %}
<div>
{{ body_rendered }}
</div>
{% endif %}

Writing this manually every time an empty check is followed by a print is extremely tedious and bug prone. The module does this conversion automatically: it captures the result of the render filter in a variable and if the same thing is later printed then it prints the variable containing the capture instead.

Activity

Total releases
1
First release
Feb 2025
Latest release
1 year ago
Releases (12 mo)
0 ▼ from 1
Maintenance
Dormant

Releases

Version Type Release date
1.0.3 Stable Feb 19, 2025