2012-12-08 8 views
35

Immaginate ho qualcosa di simile nel mio modello ramoscelloCome verificare se un blocco esiste in un modello ramoscello - Symfony2

{% block posLeft %} 
    ----- 
{%endblock%} 

C'è un modo per verificare esistenza del blocco posLeft senza chiamare a:

block("posLeft") 

E controllare il valore di ritorno di posBlock per chiarire l'esistenza. Sono un principiante in Symfony2 + Twig.

+3

Perché vuoi farlo? Mi sembra che tu stia aggiungendo logica alle tue visualizzazioni che probabilmente appartengono al tuo controller. Se si desidera visualizzare determinati contenuti basati su alcune variabili, è sufficiente iniettare tale variabile nella vista e quindi visualizzare blocchi diversi secondo necessità. – lifo

risposta

69

È possibile risolverlo in questo modo, se si desidera visualizzare un determinato blocco solo se ha contenuto. Spero, questo è quello che stai cercando.

Esempio index.html.twig

{% set _block = block('dynamic') %} 
{% if _block is not empty %} 
    {{ _block|raw }} 
{% endif %} 

Esempio part.html.twig

{% extends "index.html.twig" %} 

{% block dynamic %} 
    Block content goes here. 
{% endblock %} 
+1

Non esiste un tag integrato per questo? ottenere il valore del blocco e ricontrollarlo una stringa vuota richiede molto codice. Sembra davvero brutto. –

+3

Non penso che ci sia un altro modo. E come ha detto @lifo, probabilmente stai mettendo molta logica nei tuoi modelli. Essere consapevoli di non mettere questa istruzione a 2 righe in un controllo a riga singola, in quanto ciò può causare nuove richieste secondarie. Ecco una discussione simile su Twig Google Group: https://groups.google.com/forum/?fromgroups=#!topic/twig-users/FHDTknu5n2M – insertusernamehere

16

Si può fare in questo modo:

{% if block('posLeft') %} 
    ... 
{% endif %} 

Ma è n o efficiente se hai bisogno dell'output del blocco renderizzato. Quindi se avrete bisogno di uscita del blocco si dovrebbe assegnare alla variabile, in primo luogo e poi fare affermazioni

+1

Penso che questo sia il modo più pulito! – Dandy

+2

Downvoted. Vedi link nel commento http://stackoverflow.com/questions/13774384/how-to-check-if-a-block-exist-in-twig-template-symfony2#comment19015938_13806784 – Im0rtality

+0

Per me lì dove a volte gli spazi nel "vuoto" "blocco (a causa della formazione). Quindi l'ho spostato usando: if block ('posLeft') | trim! = '' –

0

Voglio solo quello di fornire un altro esempio, che ha lavorato per me.

<body 
{% if block('ngapp') is not empty %}ng-app="{% block ngapp %}{% endblock %}"{% endif %} 
> 

Questo mi permette a template figli dichiarare {% block ngapp 'myApp' %} e lo hanno visualizzato all'interno genitore.

Questo era necessario perché su alcune pagine mi è stato bootstrapping angolare manualmente tramite (angular.bootstrap('moduleName', rootElement)) e angolare non piace vuoto direttiva ng-app='' e si rompe in modi strani.

2

primo controllo, quale versione Ramoscello in uso all'interno del vostro progetto symfony, perché le risposte qui sono solo per Twig 1.

Se si utilizza Twig 2 si è fortunati. In base alla documentazione di Twig, è possibile utilizzare il test definito per verificare se il blocco esiste nel contesto del modello corrente.

{% if block("dynamic") is defined %} 
    ... 
{% endif %} 

ho scritto un po 'di TwigExtension per verificare se il blocco viene chiamato all'interno del if e sembra che Ramoscello davvero solo controlla se l'exsists blocchi e non chiamarlo.

Il link per la documentazione: http://twig.sensiolabs.org/doc/2.x/functions/block.html

Se usate Ramoscello 1, il vecchio risposta a https://stackoverflow.com/a/13806784/6458657 è ancora corretto.

5

Le altre risposte qui non funzionano per ramoscello 2.1 (Non ho testato su ~ 2.0), quindi ecco un piccolo aggiornamento:

{% if block('dynamic') is defined %} 
    {{ block('dynamic')|raw }} 
{% endif %} 

noti che la linea per rendere il blocco è non:

{% block dynamic %} 
    {# this wont work #} 
{% endblock %} 

Questo non funzionerà perché il blocco sarà reso durante la compilazione, e così il test restituirà true che esiste (come testato in fase di runtime). Pertanto, è necessario eseguire il rendering del blocco con {{ block('dynamic')|raw }} poiché in realtà questo non definisce il blocco nel modello.

+0

Il '| raw' è superfluo qui, poiché l'uso di' block ('dynamic') 'gestisce già l'escape e non viene impostato su una variabile prima di essere visualizzato. – lookbadgers

5

Ramoscello 2.x

{{ (block("posLeft")) ?? '' }} 

Se si desidera visualizzare un blocco se è definita o no in una sola riga. Potrebbe essere un po 'scontroso, ma soddisfa i miei bisogni senza un sacco di se ... questa logica.

Problemi correlati