2013-01-01 8 views
12

C'è un modo per farlo? Ho un modello che genera un articolo sul blog.Twig incluso il modello che estende il blocco padre una volta

Ora, indice pagina I Mostra 10 articoli includendo tale modello in per loop e su mostrano pagina mi mostra solo uno.

indice:

{% block stylesheets %} 
    {# some stylesheets here #} 
{% endblock %} 

{% for article in articles %} 
     {% include VendorBundle:article.html.twig with { 'article': article } %} 
{% endfor %} 

spettacolo:

{% block stylesheets %} 
     {# some stylesheets here #} 
{% endblock %} 

{% include VendorBundle:article.html.twig with { 'article': article } %} 

Ora c'è un modo per rendere article.html.twig aggiungere qualcosa a {% block stylesheets %} di modelli che hanno incluso automaticamente? Se è possibile, come posso evitare di aggiungere 10 volte quando si utilizza il ciclo for?

Sto cercando di rendere i miei modelli di "frammento" (modelli utilizzati per l'inclusione) definiscono fogli di stile che usano e li fanno "iniettare" quelli nella pagina.

+0

Come ho capito, non si sta tentando di estendere il blocco genitore (l'articolo non misura indice o mostra?), Ma il blocco del modello che lo include. È corretto? –

+0

Sì, questo è corretto, l'articolo non estende nulla. –

+0

È semplicemente un "frammento" di pagina se posso chiamarlo così, riceve un oggetto "articolo" e lo "disegna" (titolo, contenuto, immagini, tag, autore, data, ecc.). –

risposta

0

è possibile utilizzare un nuovo blocco (non testato):

{# index.html.twig #} 
{% block stylesheets -%} 
    {% block article_styles '' %} 
{%- endblock %} 

{% for ... -%} 
    {% include VendorBundle:template.html.twig with {'article': article} %} 
{%- endfor %} 

{# template.html.twig #} 
{% block article_styles -%} 
    {{ parent() }} 
    <link rel=stylesheet href=...> 
{%- endblock %} 

{# ... #} 

Edit: Aggiunto {{ parent() }}, questa stamperà ogni contenuto il blocco ha già.

+0

Non molto utile in quanto, se andassi in quel modo, potrei semplicemente aggiungere il foglio di stile dell'articolo direttamente in index.html.twig e show.html.twig, senza fare un altro blocco per questo. Voglio che l'articolo lo faccia da solo, quindi quando ho una pagina con 10 modelli inclusi (articoli, tag, barre laterali, utenti ecc. Ecc.) Di per sé non devo preoccuparmi di loro all'interno del modello principale, ma consentire a ciascun modello incluso di definirne Dipendenze CSS. –

+0

@igorpan ah, ho frainteso la tua domanda. Ho cambiato la mia risposta. –

+0

Questa è stata la prima cosa che ho provato, sfortunatamente, non funziona e genera un errore: "Chiamare" genitore "su un modello che non estende né" usa "un altro modello è vietato. –

16

Hai provato a utilizzare use? Sfortunatamente non sono completamente sicuro di aver ricevuto la domanda giusta ma il {% use %} non è stato menzionato qui.

Come ho capito la domanda che hai il tuo article.html.twig e includerlo in, ad es. index.html.twig. Ora vuoi aggiungere qualcosa da article.html.twig a index.html.twig? Vale a dire il blocco {% stylesheets %}.

Se ho avuto modo di utilizzare {% use %}, si potrebbe provare in questo modo.

article.html.twig

{% block stylesheets %} 
    <link rel="stylesheet" href="{{ asset('bundles/mybundle/css/article.css') }}" type="text/css" /> 
{% endblock %} 
{% block article %} 
    {# whatever you do here #} 
{% endblock %} 

index.html.twig

{% use "VendorBundle:article.html.twig" with stylesheets as article_styles %} 
{% block stylesheets %} 
    {{ block('article_styles') }} 
    {# other styles here #} 
{% endblock %} 
{% for article in articles %} 
     {% include VendorBundle:article.html.twig with { 'article': article } %} 
{% endfor %} 

non ho la possibilità di testarlo, ma il docu Uniti un paio di cose molto interessanti e sembra che questo potrebbe essere il modo di farlo.

Horizontal reuse is an advanced Twig feature that is hardly ever needed in regular templates. It is mainly used by projects that need to make template blocks reusable without using inheritance.

Sono piuttosto nuovo allo stackoverflow. Quindi, per favore se la mia risposta è completamente inutile potresti semplicemente postare un commento prima di votare e lo cancello? Tuttavia, se è d'aiuto e ci sono solo alcuni errori nel mio esempio, informatemi e correggerò il problema.

+0

Ho guardato 'include',' extends', 'use', ecc. Per troppo tempo ...' use' funziona davvero. Tuttavia, tre cose: ** 1. ** Sembra impossibile estendere il blocco di un genitore senza modificare il genitore (aggiungi 'block ('...')'). ** 2. ** Il tuo esempio (anche se non mi riguarda) non funzionerà: 'use' si rifiuta di caricare template con corpi, mentre' include' non avrebbe molto senso qui. Due modelli sarebbero necessari allora. ** 3. ** Le risposte non vengono mai cancellate perché errate;). Avrai la taglia, ma aspetterò - forse qualcun altro conosce un'altra soluzione. Grazie, comunque. – Lukas

+0

L'esempio dell'OP mi ha solo confuso un po '. Non sapevo esattamente come avrebbe voluto che funzionasse (all'inizio di post e i commenti sopra sono un po 'contraddittori) ma mi è venuto in mente anche il tuo ** 2. ** punto. È possibile sostituire l'inclusione con un altro uso di quel modello e solo avvolgere il ciclo '{% for ...%}' in un altro blocco? ** 3. ** Sono solo un po 'cauto perché, come ho detto, non ero abbastanza sicuro di come l'OP vuole che si comporti/funzioni. In effetti ci sono 7 giorni per andare e su SO ... ci sono dei geni in ogni angolo: D – SirDerpington

+1

Vedo che non sono solo su questo. E non ho ancora trovato un modo per farlo. Il caso di utilizzo più comune per me sarebbe il "caricamento lento" dei fogli di stile. Quindi, abbiamo "modello principale" che utilizza include su un mucchio di "modelli di frammenti". Ogni modello di frammento può definire i propri fogli di stile che verranno quindi aggiunti alla testa del padrone. –

Problemi correlati