Come posso rilevare correttamente se la regione è vuota? [chiuso]


11

Ho delle condizioni per la stampa di aree nel mio modello di pagina poiché non è vuota , ma stampa sempre aree vuote, qualunque cosa accada. Qual è il modo corretto di rilevare regioni vuote?

Ad esempio, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}stampa <div class="region region-local-tasks"></div>.

Se eseguo il rendering della regione themename_preprocess_page()con var_dump(drupal_render($variables['page']['highlighted']));ottengo SafeString con token segnaposto:

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

Quindi, tecnicamente la regione non è vuota ma non posso farci nulla.


Cosa page.local_taskscontiene quando ritieni che dovrebbe essere vuoto?
Clive

Questa è una regione per il blocco di attività locali.

Giusto, ma cosa contiene l'oggetto? Non è vuoto, quindi guarda per vedere quali altre proprietà ha che potrebbero farti notare che non c'è contenuto (contiene essenzialmente una stringa o un array non renderizzato?)
Clive

Ho lo stesso problema e sembra che si tratti di un bug
Yusef,

Risposte:


10

TL; DR per questo è che non c'è modo di verificare in modo affidabile se l'area è vuota o no nel modello.

In Drupal 8 nel momento in cui siamo a livello di modello non siamo in grado di dire se la regione ha o meno contenuti perché il contenuto è reso pigramente. Per questo c'è un problema di Drupal 8 aperto .

Ciò che probabilmente dovrai fare per raggiungere questo obiettivo è scrivere CSS che verifichi se la regione è vuota. Puoi provare a utilizzare : pseudo-selettore vuoto .


Ho concluso che il modo più affidabile per aggirare questo problema è aggiungere suggerimenti di template in hook_theme_suggestions_HOOK_alter e rimuovere completamente le regioni dal template dove non dovrebbe essere visibile.
Johan,

10

prova ad applicare i filtri dopo il rendering, in questo modo:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}

questo ha funzionato per me
Andrew Kozoriz,

Questo è abbastanza utile.
ACanadianCoder

2
Questo approccio non funziona perché non tiene conto del fatto che alcune aree potrebbero essere convertite in segnaposto, che verranno successivamente sostituite con il markup effettivo. Semplicemente non c'è modo di determinare se una regione è vuota o meno nel file html.html.twig. Se vuoi leggere l'intero background di questo problema, ti suggerisco di leggere questo numero di Drupal Core
lauriii

Come ha detto @lauriii, questo non funziona con i segnaposto drupal (le mie visualizzazioni in blocchi vengono generalmente filtrate a causa del strip_tagsfiltro).
Dakwamine,

2

In un ramoscello dovresti davvero essere in grado di fare:

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

Tuttavia forse c'è qualcosa all'interno di page.local_tasks (come markup vuoto). Si prega di provare quanto segue:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}

Lo snippet di debug non mostra nulla (ovvero, nulla da visualizzare, la variabile è vuota).

Quando dici debugche vuoi dire dump? Cosa succede se lo fai {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria,

Leggendo la tua domanda vedo che page.local_tasksnon è vuoto. È pieno di HTML. Aggiornerò la mia risposta.
Queenvictoria,

Il tuo frammento non esegue il rendering del contenuto due volte se c'è del contenuto? O se viene riprodotto viene memorizzato nella cache e non ha alcun impatto sulle prestazioni? Inoltre non capisco perché devo fare qualche soluzione alternativa. Questo dovrebbe funzionare fuori dal comune. @Berdir qualche commento al riguardo?

Il problema è che le attività locali non sono vuote. Poiché ramoscello e drupal seguono entrambi MVC, non c'è nulla che dica che il ramoscello è vuoto (non è vuoto). O puoi scrivere un preprocessore che sovrascrive quali attività locali fornisce quando è vuoto, fornisce un altro valore con una proprietà di tipo 'count' su cui puoi testare, o qualcosa come io suggerisco. In un modo o nell'altro avrai un colpo. Penso che il dosso delle prestazioni sarà trascurabile.
Queenvictoria,

1

Questo ha funzionato per me.

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

Abbastanza semplice.


Non sono sicuro, ma potrebbe essere il rendering della barra laterale due volte (una volta per la valutazione e l'altra volta per la visualizzazione).
Jigarius,


-1

prova questo :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}

-1

Questo in realtà funziona nel mio caso

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

striptags accetta una stringa di tag per mantenere, in modo da poter anche aggiungere qualsiasi senza contenuto tag si aspetta di avere, come <form><img>etc.


-1

Quanto segue funziona anche quando è abilitato il debug del ramoscello:

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

Per rilevare se la regione è vuota o no in questo modo:

{% if page.local_tasks%}
   {{page.local_tasks}}
{% finisci se %}

Nel codice sopra verifica se la regione local_tasks è vuota o meno e se vuota non stampa quella regione


1
non ha funzionato, questo è sempre vero
Yusef

Il rendering pigro dei blocchi è la causa per cui questo frammento non funziona. Perché l'array non è vuoto, ma il rendering non restituisce nulla.
Renrhaf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.