Problem/Motivation
In
π±
[meta] Themes improperly check renderable arrays when determining visibility
Needs work
the second case is that a region does contain empty blocks, but no placeholders.
It must be rendered (and html tags stripped?) to determine if it is empty or not, but we don't want to render it twice.
Proposed resolution
Use a new twig tag, so instead of:
Old:
{% if content.sidebar_first %}
<div class="sidebar-first">
{{ content.sidebar_first }}
</div>
{% endif %}
use new:
{% section content.sidebar_first %}
{# This whole section will only be shown if the passed variable is not empty #}
<div class="sidebar-first"{{- section_attributes -}}>{# section_attributes and section_content are required to be present #}
{{ section_content }} {# This contains the rendered content. #}
{% endsection %}
</div>
Internally in the template this would be a twig block:
function block__internal_[hash]($context, $blocks) {
$context['section_content'] = render_var($context['sidebar_first']);
if ($this->extension('drupal_core')->emptySection($context)) {
return;
}
print '<div class="sidebar-first"';
print $context['section_attributes'];
print '>' . PHP_EOL;
print $context['section_content'] . PHP_EOL;
print '</div>' . PHP_EOL;
}
For a more advanced example we could allow:
{% section content.sidebar_first|strip_tags('html')|trim %}
{# This whole section will only be shown if the rendered variable filtered by the filters is not empty #}
{# section_attributes and section_content are required to be present #}
{{ section_content }} {# This contains the rendered content. #}
{% endsection %}
Remaining tasks
- Discuss technical solution
User interface changes
API changes
Data model changes