2012-06-08 17 views
15

Ho una variabile di ramoscello html. Per mostrarlo in un modello di ramoscello faccio {{html}}.Variabili di ramoscello nella variabile di ramoscello

quella variabile assomiglia:

<div>{{region_top}}</div><div>{{region_center}}</div>

region_* è una variabile troppo. Quando Twig analizza la mia variabile html, non analizza le variabili interne (regioni).

Cosa dovrei fare?

+0

In un primo momento accetta le risposte alle vostre precedenti domande ... – jkucharovic

+1

È Wright, spiacente per quello – Meliborn

risposta

24

Ho twig variabile html. Per mostrarlo nel modello di ramoscello faccio {{html}}. Quella variabile assomiglia a {{region_top}} {{region_center}}. region_ * è anche variabile. Quando twig analizza la mia variabile html non ha analizzato le variabili interne (regioni). Cosa posso fare?

Twig prende le stringhe come una stringa letterale, ovvero vedrai il contenuto della variabile, fuggito. Se si vuole che sia in grado di visualizzare {{}} region_top così, vi consiglio qualcosa di simile:

{{html|replace({'{{region_top}}': region_top, '{{region_center}}': region_center})}} 

Se il contenuto della variabile html è anche dinamica (che significa che può contenere più di una semplice quelle due variabili), vorrei scrivere un plugin di ramoscello che può fare quello che vuoi. Scrivere i plugin è abbastanza semplice.

EDIT: Ecco l'estensione che ho appena finito di scrivere.

EDIT 2: L'estensione ora utilizza l'ambiente per il rendering della stringa, quindi valuta la stringa, anziché sostituire semplicemente le variabili. Ciò significa che la tua variabile può contenere tutto ciò che un modello può, e sarà renderizzata ed evasa da Twig stessa. Sono bellissimo.

<?php 

/** 
* A twig extension that will add an "evaluate" filter, for dynamic evaluation. 
*/ 
class EvaluateExtension extends \Twig_Extension { 
    /** 
    * Attaches the innervars filter to the Twig Environment. 
    * 
    * @return array 
    */ 
    public function getFilters() { 
     return array(
      'evaluate' => new \Twig_Filter_Method($this, 'evaluate', array(
       'needs_environment' => true, 
       'needs_context' => true, 
       'is_safe' => array(
        'evaluate' => true 
       ) 
      )) 
     ); 
    } 

    /** 
    * This function will evaluate $string through the $environment, and return its results. 
    * 
    * @param array $context 
    * @param string $string 
    */ 
    public function evaluate(\Twig_Environment $environment, $context, $string) { 
     $loader = $environment->getLoader(); 

     $parsed = $this->parseString($environment, $context, $string); 

     $environment->setLoader($loader); 
     return $parsed; 
    } 

    /** 
    * Sets the parser for the environment to Twig_Loader_String, and parsed the string $string. 
    * 
    * @param \Twig_Environment $environment 
    * @param array $context 
    * @param string $string 
    * @return string 
    */ 
    protected function parseString(\Twig_Environment $environment, $context, $string) { 
     $environment->setLoader(new \Twig_Loader_String()); 
     return $environment->render($string, $context); 
    } 

    /** 
    * Returns the name of this extension. 
    * 
    * @return string 
    */ 
    public function getName() { 
     return 'evaluate'; 
    } 
} 

Esempio di utilizzo:

$twig_environment->addExtension(new EvaluateExtension()); 

Nel modello:

{% set var = 'inner variable' %} 
{{'this is a string with an {{var}}'|evaluate}} 
+1

Plugin o estensione? – Meliborn

+0

Forse è possibile utilizzare il filtro di sostituzione come preg_replace con il segnaposto? Qualcosa come questo {{html | replace ({'{{$ 1}}': $ 1})}} Non ho idea di cosa dovrebbe fare il plugin :( – Meliborn

+0

@Meliborn intendevo un'estensione. Ho appena controllato, ma sembra Non riesco a ottenere il valore di una variabile da un'estensione, abbastanza stranamente. Continuerò a cercare: potrei aver bisogno di qualcosa del genere io stesso. –

4

Una possibilità è quella di rendere i modelli come stringhe. Potete farlo in questo modo:

$env = new \Twig_Environment(new \Twig_Loader_String()); 
echo $env->render(
    "Hello {{ name }}", 
    array("name" => "World") 
); 

Lascio a voi decidere come esattamente per strutturare il codice per fare questo lavoro, ma potrebbe andare qualcosa come questo: 1) Fetch il testo del modello interno che contiene le variabili che non vengono sostituite. 2) Rendi il testo del modello interno in una variabile $ html. Assicurati di inserire tutti i vars di cui hai bisogno. 3) Rendi il tuo modello originale che contiene {{html}}. Essere sicuri di passare a 'html' => $ html nella matrice Vars

14

Vedi http://twig.sensiolabs.org/doc/functions/template_from_string.html

Sembra che questo è spesso mancato come la maggior parte della gente pensa (e cercare) "eval" quando prevedono un filtro/funzione da valutare nella lingua corrente in cui stanno redigendo. Il modello da stringa non è la prima query di ricerca che viene in mente.

+0

rocking - ho imparato qualcosa di nuovo qui. Grazie – ejuhjav

Problemi correlati