Problem/Motivation
In #953034: [meta] Themes improperly check renderable arrays when determining visibility 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_content }} {# This contains the rendered content. #}
{% endsection %}
Remaining tasks
- Discuss technical solution
Comments
Comment #2
Fabianx CreditAttribution: Fabianx as a volunteer and at Tag1 Consulting commentedOverall it feels similar to the inline template approach, because in the end the twig template itself it mostly feels like a wrapper around the inner section content.
Section attributes are needed, because for a JS solution to work, we need a data- attribute to work with.
e.g. Thinking about it as a render / filter chain it is like the rendered output being the input to the template:
However for 3) it is needed that we know if the render result contained placeholders or not.
e.g. code would need to look more like:
But that is still not ideal, more in the next issue.
Comment #3
Fabianx CreditAttribution: Fabianx as a volunteer and at Tag1 Consulting commented