¿Cómo detecto correctamente si la región está vacía? [cerrado]

11

Tengo condiciones para imprimir regiones en mi plantilla de página, ya que no está vacía , pero siempre imprimirá regiones vacías sin importar qué. ¿Cuál es la forma correcta de detectar regiones vacías?

Por ejemplo, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}imprime <div class="region region-local-tasks"></div>.

Si renderizo la región themename_preprocess_page()con var_dump(drupal_render($variables['page']['highlighted']));, obtendré SafeString con token de marcador de posición:

<div class="region region-highlighted"><drupal-render-placeholder callback="Drupal\Core\Render\Element\StatusMessages::renderMessages" arguments="0" token="a8c34b5e"></drupal-render-placeholder></div>

Entonces, técnicamente la región no está vacía, pero no puedo hacer nada al respecto.

kiamlaluno
fuente
¿Qué page.local_taskscontiene cuando sientes que debería estar vacío?
Clive
Esa es una región para el bloque de tareas locales.
Correcto, pero ¿qué contiene el objeto? No está vacío, así que mire para ver qué otras propiedades tiene que podrían indicarle que no hay contenido (¿contiene esencialmente una cadena o una matriz no renderizada?)
Clive
Tengo el mismo problema, y ​​parece que esto es un error
Yusef

Respuestas:

10

TL; DR para esto es que no hay forma de verificar de manera confiable si la región está vacía o no en la plantilla.

En Drupal 8 en el momento en que estamos en el nivel de plantilla, no podemos decir si la región tiene contenido o no porque el contenido se presenta de forma perezosa. Hay un problema abierto de Drupal 8 para esto.

Lo que probablemente tendrá que hacer para lograr esto es escribir CSS que pruebe si la región está vacía. Puede intentar usar usando : pseudo-selector vacío .

lauriii
fuente
Llegué a la conclusión de que la forma más confiable de solucionar este problema es agregar sugerencias de plantilla en hook_theme_suggestions_HOOK_alter y eliminar las regiones completamente de la plantilla donde no se supone que sea visible.
Johan
10

intenta aplicar filtros después de renderizar, así:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}
just_like_good_vibes
fuente
esto funcionó para mí
Andrew Kozoriz
Esto es bastante útil.
ACanadianCoder
2
Este enfoque no funciona porque no tiene en cuenta que algunas regiones podrían convertirse en marcadores de posición, que luego se reemplazarán con el marcado real. Simplemente no hay forma de determinar si una región está vacía o no en el archivo html.html.twig. Si desea leer los antecedentes completos de este problema, le sugiero que lea este número de Drupal Core
lauriii, el
Como dijo @lauriii, esto no funciona con los marcadores de posición de drupal (mis vistas en bloques generalmente se filtran debido al strip_tagsfiltro).
Dakwamine
2

En Twig realmente deberías poder hacer:

{% if page.local_tasks %}{{ page.local_tasks }}{% endif %}

Sin embargo, tal vez haya algo dentro de page.local_tasks (como marcado vacío). Por favor intenta lo siguiente:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}
Reina Victoria
fuente
Ese fragmento de depuración no muestra nada (es decir, nada que mostrar, la variable está vacía).
Cuando dices, debug¿quieres decir dump? ¿Qué pasa si lo haces {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria
Leyendo tu pregunta veo que page.local_tasksno está vacía. Está lleno de HTML. Actualizaré mi respuesta.
Queenvictoria
¿Su fragmento no muestra el contenido dos veces si hay contenido? ¿O si se procesa se almacena en caché y no tiene ningún impacto en el rendimiento? Además, no entiendo por qué necesito hacer alguna solución. Esto debería estar funcionando fuera de la caja en el núcleo. @Berdir algún comentario sobre esto?
El problema es que las tareas locales no están vacías. Como twig y drupal siguen a MVC, no hay nada que indique que twig esté vacío (no está vacío). Puede escribir un preprocesador que anule lo que las tareas locales proporcionan cuando está vacío, proporciona otro valor con una propiedad de tipo 'contar' con la que puede probar, o algo como lo que sugiero. En algún lugar u otro vas a recibir un golpe. Creo que el aumento de rendimiento será insignificante.
Queenvictoria
1

Esto funcionó para mí.

{% if page.sidebar_first|render|striptags %}
<aside id="sidebar-first" class="sidebar sidebar-first layout-sidebar-first" role="complementary">{{ page.sidebar_first }}</aside>
{% endif %}

Suficientemente simple.

Shalo
fuente
No estoy seguro, pero eso podría hacer que su barra lateral se procese dos veces (una para evaluación y otra para visualización).
Jigarius
-1

prueba esto :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}
Matoeil
fuente
-1

Esto realmente funciona en mi caso

{% if page.sidebar_second|render|striptags('<drupal-render-placeholder>')|trim|length > 0 %}

striptags acepta una cadena de etiquetas para guardar, por lo que también puede agregar las etiquetas sin contenido que espera tener, como <form><img>etc.

Gene Scoff
fuente
-1

Lo siguiente también funciona cuando la depuración de ramitas está habilitada:

{% set sidebarLength = page.sidebar_first|render|trim|striptags|length %}
{% if sidebarLength > 1 %}
  {% set has_sidebar_first = page.sidebar_first %}
{% else %}
  {% set has_sidebar_first = null %}
{% endif %}
Stef Van Looveren
fuente
-3

Para detectar si la región está vacía o no código como este:

{% if page.local_tasks%}
   {{page.local_tasks}}
{% terminara si %}

En el código anterior, comprueba si la región local_tasks está vacía o no y, si está vacía, no imprimirá esa región

Sachin
fuente
1
no funcionó, esto siempre es cierto
Yusef
La representación diferida de los bloques es la causa de que este fragmento no funcione. Porque la matriz no está vacía, pero al representarla no devuelve nada.
Renrhaf