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}}
In un primo momento accetta le risposte alle vostre precedenti domande ... – jkucharovic
È Wright, spiacente per quello – Meliborn