2011-10-05 9 views
9

Sto lavorando a un progetto in Symfony2 e ho molti piccoli pezzi di codice HTML che devono essere inclusi in una delle mie principali viste. Secondo la documentazione ufficiale di Twig dovrei essere in grado di usare semplicemente {% include 'filename.html' %} ma in Symfony a meno che il nome del file non finisca in ".html.twig" e l'errore non lo trovi. Mi piacerebbe evitare di utilizzare i modelli Twig per questi file poiché non hanno contenuti dinamici e un sacco di doppie parentesi (sono modelli javascript) e richiedono che il template designer debba avvolgere ognuno di questi file nei tag {% raw %} sembra un modo davvero Kludgey per farlo.Come posso includere file HTML non elaborati nei modelli Symfony2/Twig?

+0

Se la documentazione ufficiale dice che dovrebbe funzionare, allora forse dovresti provare ad aggiornare twig e il bundle twig a una versione più recente (modifica il file deps). – greg0ire

+0

Ho provato ma penso che questo problema abbia a che fare con come Symfony gestisce il percorso/tipo di template piuttosto che un problema di Twig. – wdh

+0

Allora dovresti forse scrivere un bug report. – greg0ire

risposta

7

un breve riepilogo sulle estensioni dei file ramoscello (preso dalla documentazione):

Ogni nome del modello ha anche due estensioni che specificano il formato e il motore per questo modello.

AcmeBlogBundle:Blog:index.html.twig - HTML format, Twig engine 
AcmeBlogBundle:Blog:index.html.php - HTML format, PHP engine 
AcmeBlogBundle:Blog:index.css.twig - CSS format, Twig engine 

Per impostazione predefinita, qualsiasi modello Symfony2 può essere scritto sia in Twig o PHP, e l'ultima parte dell'estensione (ad es .twig o .php) specifica quale di questi due motori da utilizzare . La prima parte dell'estensione (ad esempio .html, .css, ecc.) È il formato finale generato dal modello.

Quindi ha senso per me che includere un file come .html sia per lo meno ambiguo anche se non ha generato un errore.

in modo da avere 3 scelte:

  1. Se i file sono puramente javascript poi li comprendono come tag script nella vostra pagina.

  2. Se sono mescolati HTML e JS, sfuggire al JS con {% raw%} e includere i file come modelli foo.html.twig. Se ci sono molti script in questo modo, molto probabilmente i tuoi progettisti potrebbero fare un piccolo refactoring e spostare la maggior parte dei loro script in file esterni (vedi opzione 1)

  3. Se davvero insisti, potresti sempre scrivere un Estensione Twig per includere file HTML non elaborati. (MODIFICA: Vedi la risposta di Haprog qui sotto per maggiori dettagli su questa opzione).

    {{include_html ('foo/bar.html')}}

  4. AGGIORNAMENTO 2015 ramoscello da allora ha aggiunto la funzione di fonte:

{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}

Complimenti a @ Nigel Angel nei commenti qui sotto per l'opzione 4.

+1

Quello che sto cercando di fare è un modo per i modelli di baffi da includere nella pagina per l'uso da javascript. Inserirli direttamente nel template contornati dai tag '{% raw%}' funziona ma ritengo che sia piuttosto disorganizzato e possa diventare poco maneggevole quando ci sono molti piccoli bit di template. Il caricamento dei bit del template tramite ajax rallenta inutilmente le cose sul client poiché ci sono più richieste. Mettendo i template in un file ramoscello che non ha un vero markup ramoscello (diverso da '{% raw%}') insinua lo sviluppatore OCD in me ma sembra l'opzione più semplice in questo caso. Grazie. Il ramoscello – wdh

+5

ha aggiunto la funzione 'source'' {{source ('AcmeSomeBundle: Default: somefile.html.twig')}} ' –

+0

È possibile utilizzare invece i file ** phtml **? –

10

Mi sono imbattuto nello stesso problema cercando di trovare una soluzione per includere file (modelli di baffi) come grezzi nei modelli Twig, quindi Twig non prova ad analizzarli.

Inizialmente avevo i miei file modello di baffi chiamati semplicemente sometemplate.html e avvolti nei tag {% raw %}. Questo ha funzionato per un po ', ma poi ho iniziato a utilizzare PhpStorm IDE con il plugin Handlebars (per la sintassi dei baffi).Affinché PhpStorm riconosca i file come sintassi dei baffi, devono avere un'estensione di file univoca (.mustache per impostazione predefinita), quindi ho rinominato il mio sometemplate.html in sometemplate.mustache ma non mi piaceva l'idea che i miei modelli di baffi dovessero essere avvolti con Tag di ramoscello. Così ho finito per fare ciò che @rdjs ha detto nella sua opzione 3. Questa è la soluzione migliore.

Ecco la funzione di estensione Twig lavoro che ho fatto:

function twig_include_raw(Twig_Environment $env, $template) { 
    return $env->getLoader()->getSource($template); 
} 
$twig->addFunction('include_raw', new Twig_Function_Function('twig_include_raw', array('needs_environment' => true))); 

Con questo in luogo si può facilmente includere file come "grezza" senza Twig loro analisi facendo:

{{ include_raw('sometemplate.mustache')|raw }} 

Ho anche fatto una macro Twig per la semplificazione tra cui i modelli baffi alle sezioni testa HTML:

{% macro mustache_script(id, file) -%} 
<script id="{{ id }}" type="text/x-mustache-template"> 
{{ include_raw(file)|raw }} 
</script> 
{%- endmacro %} 

E dopo aver importato il file con la macro sopra nel tuo modello Twig ({% import "macros.twig" %} per esempio), puoi facilmente importare i file template dei baffi nei tuoi modelli Twig semplicemente facendo {{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }} all'interno di una sezione HTML <head>.

Spero che questo aiuti qualcuno che sta cercando una soluzione allo stesso problema.

+0

Sembra che risolva un problema che sto osservando, ma non ho idea di dove debba essere definita la funzione twig_include_raw e che cosa/quando dovrebbe chiamare $ twig-> addFunction. Puoi spiegarlo un po 'oltre. – Craig

+0

@Craig Spiacente, non ho risposto prima. Puoi definire la funzione ovunque tu voglia. Assicurati di chiamare '$ twig-> addFunction()' ovunque dopo aver configurato Twig con '$ twig = new Twig_Environment ($ loader);' Di solito ho la mia funzione 'twigInit()' che gestisce la configurazione del Twig ambiente compreso il caricamento delle estensioni che uso.Potresti anche voler leggere la pagina della documentazione sull'estensione di Twig su http://twig.sensiolabs.org/doc/advanced.html – Haprog

+2

Questo è fantastico. È possibile ignorare la necessità di "| raw" se si aggiunge "'is_safe' => array ('all')" alle opzioni dopo 'needs_environment'. –

4

Follow-up su Kari, se sei in un'estensione .. puoi applicarla in questo modo.

public function getFunctions() { 
    return [ 
     'include_raw' => new \Twig_Function_Method($this, 'twig_include_raw', array('needs_environment'=> true, 'is_safe'=> array('all'))) 
    ]; 
} 

E questo sarebbe un $ this-> twig_include_raw metodo di tipo. Dovresti includere all'interno del modello come:

{{ include_raw("my/file/here.html.twig") }} 

Nessuna necessità di "| raw".

Problemi correlati