¿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.


¿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 .


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 %}

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 %}

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.


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 %}

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


-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 %}

-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.