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_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

Comments

Fabianx created an issue. See original summary.

Fabianx’s picture

Overall 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:

render | 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:


function renderIfNotEmpty($build) { 
  $markup = $this->renderer->render($build);
  if (!isset($build['#attached']['placeholders'])) {
    return [ 'section_content' => $markup, 'section_attributes' => [] ];
  }

  // Special code to wrap the section_content.  
}

But that is still not ideal, more in the next issue.

Fabianx’s picture

Issue summary: View changes

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.0-alpha1 will be released the week of January 30, 2017, which means new developments and disruptive changes should now be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.0-alpha1 will be released the week of July 31, 2017, which means new developments and disruptive changes should now be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.0-alpha1 will be released the week of January 17, 2018, which means new developments and disruptive changes should now be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.6.x-dev » 8.7.x-dev

Drupal 8.6.0-alpha1 will be released the week of July 16, 2018, which means new developments and disruptive changes should now be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.7.x-dev » 8.8.x-dev

Drupal 8.7.0-alpha1 will be released the week of March 11, 2019, which means new developments and disruptive changes should now be targeted against the 8.8.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.0-alpha1 will be released the week of October 14th, 2019, which means new developments and disruptive changes should now be targeted against the 8.9.x-dev branch. (Any changes to 8.9.x will also be committed to 9.0.x in preparation for Drupal 9’s release, but some changes like significant feature additions will be deferred to 9.1.x.). For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.1.x-dev

Drupal 8.9.0-beta1 was released on March 20, 2020. 8.9.x is the final, long-term support (LTS) minor release of Drupal 8, which means new developments and disruptive changes should now be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 9.1.x-dev » 9.2.x-dev

Drupal 9.1.0-alpha1 will be released the week of October 19, 2020, which means new developments and disruptive changes should now be targeted for the 9.2.x-dev branch. For more information see the Drupal 9 minor version schedule and the Allowed changes during the Drupal 9 release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Drupal 9.2.0-alpha1 will be released the week of May 3, 2021, which means new developments and disruptive changes should now be targeted for the 9.3.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.0-rc1 was released on November 26, 2021, which means new developments and disruptive changes should now be targeted for the 9.4.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.0-alpha1 was released on May 6, 2022, which means new developments and disruptive changes should now be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.5.x-dev » 10.1.x-dev

Drupal 9.5.0-beta2 and Drupal 10.0.0-beta2 were released on September 29, 2022, which means new developments and disruptive changes should now be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 10.1.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch, which currently accepts only minor-version allowed changes. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.