Comment détecter correctement si la région est vide? [fermé]

11

J'ai des conditions pour imprimer des régions dans mon modèle de page car il n'est pas vide , mais il imprimera toujours les régions vides quoi qu'il arrive. Quelle est la bonne façon de détecter les régions vides?

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

Si je rend la région themename_preprocess_page()avec var_dump(drupal_render($variables['page']['highlighted']));, j'obtiendrai SafeString avec un jeton d'espace réservé:

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

Donc, techniquement, la région n'est pas vide mais je ne peux rien y faire.

kiamlaluno
la source
Que page.local_taskscontient-il lorsque vous pensez qu'il doit être vide?
Clive
C'est une région pour le bloc de tâches locales.
D'accord, mais que contient l'objet? Il n'est pas vide, alors regardez pour voir quelles autres propriétés il pourrait vous faire savoir qu'il n'y a pas de contenu (contient-il essentiellement une chaîne ou un tableau non rendu?)
Clive
J'ai le même problème, et il semble que ce soit un bug
Yusef

Réponses:

10

TL; DR car il n'y a aucun moyen de vérifier de manière fiable si la région est vide ou non dans le modèle.

Dans Drupal 8, au moment où nous sommes au niveau du modèle, nous ne pouvons pas dire si la région a du contenu ou non parce que le contenu est rendu paresseusement. Il y a un problème ouvert avec Drupal 8 pour cela.

Ce que vous devrez probablement faire pour y parvenir est d'écrire du CSS qui teste si la région est vide. Vous pouvez essayer d'utiliser en utilisant : pseudo-sélecteur vide .

lauriii
la source
J'ai conclu que le moyen le plus fiable de contourner ce problème consiste à ajouter des suggestions de modèles dans hook_theme_suggestions_HOOK_alter et à supprimer entièrement les régions du modèle où elles ne sont pas censées être visibles.
Johan
10

essayez d'appliquer des filtres après le rendu, comme ceci:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}
just_like_good_vibes
la source
cela a fonctionné pour moi
Andrew Kozoriz
C'est assez utile.
ACanadianCoder
2
Cette approche ne fonctionne pas car elle ne tient pas compte du fait que certaines régions peuvent être rendues en espaces réservés, qui seront ensuite remplacés par le balisage réel. Il n'y a tout simplement aucun moyen de déterminer si une région est vide ou non dans le fichier html.html.twig. Si vous voulez lire l'arrière-plan complet de ce problème, je vous suggère de lire ce numéro Drupal Core
lauriii
Comme l'a dit @lauriii, cela ne fonctionne pas avec les espaces réservés drupal (mes vues dans les blocs sont généralement filtrées en raison du strip_tagsfiltre).
Dakwamine
2

En brindille, vous devriez vraiment pouvoir faire:

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

Cependant, il y a peut-être quelque chose dans page.local_tasks (comme un balisage vide). S'il vous plaît essayez ce qui suit:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}
La reine victoria
la source
Cet extrait de débogage n'affiche rien (c'est-à-dire, rien à afficher, la variable est vide).
Quand tu dis debugque tu veux dire dump? Que se passe-t-il si vous le faites {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria
En lisant votre question, je vois que ce page.local_tasksn'est pas vide. Il est plein de HTML. Je mettrai à jour ma réponse.
Queenvictoria
Votre extrait ne rend-il pas le contenu deux fois s'il y a du contenu? Ou s'il est rendu, il est mis en cache et n'a aucun impact sur les performances? De plus, je ne comprends pas pourquoi je dois faire des solutions de contournement. Cela devrait fonctionner hors de la boîte dans le noyau. @Berdir un commentaire à ce sujet?
Le problème est que les tâches locales ne sont pas vides. Comme twig et drupal suivent tous deux MVC, rien ne dit que twig est vide (ce n'est pas vide). Soit vous pouvez écrire un préprocesseur qui remplace ce que les tâches locales fournissent lorsqu'il est vide, fournit une autre valeur avec une propriété de type 'count' contre laquelle vous pouvez tester, ou quelque chose comme je suggère. Quelque part, vous allez en prendre un coup. Je pense que la bosse de performance sera négligeable.
Queenvictoria
1

Cela a fonctionné pour moi.

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

Assez simple.

Shalo
la source
Je ne suis pas sûr, mais cela pourrait rendre votre barre latérale deux fois (une fois pour l'évaluation et l'autre pour l'affichage).
Jigarius
-1

essaye ça :

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

Cela fonctionne réellement dans mon cas

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

striptags accepte une chaîne de balises à conserver, vous pouvez donc également ajouter toutes les balises sans contenu que vous attendez, comme <form><img>etc.

Gene Scoff
la source
-1

Ce qui suit fonctionne également lorsque le débogage de brindilles est activé:

{% 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
la source
-3

Pour détecter si la région est vide ou pas un code comme celui-ci:

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

Dans le code ci-dessus, il vérifie si la région local_tasks est vide ou non et s'il est vide, il n'imprimera pas cette région

Sachin
la source
1
pas travaillé, c'est toujours vrai
Yusef
Le rendu paresseux des blocs est à l'origine du non-fonctionnement de cet extrait. Parce que le tableau n'est pas vide, mais le rendu ne renvoie rien.
Renrhaf