2012-06-08 166 views
15

我有枝條變量html。要顯示它在一個樹枝模板中,我做{{html}}枝條變量中的枝條變量

該變量的樣子:

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

region_*是一個變量太多。當Twig解析我的html變量時,它不解析內部變量(區域)。

我該怎麼辦?

+0

起初接受的答案您以前的問題... – jkucharovic

+1

你賴特,遺憾的是 – Meliborn

回答

24

我有樹枝變量html。爲了在樹枝模板中顯示它,我做了{{html}}。該變量看起來像{{region_top}} {{region_center}}。 region_ *也是變量。當樹枝解析我的html變量時,他沒有解析內部變量(區域)。我該怎麼做?

Twig將您的字符串作爲文字字符串,這意味着您將看到變量的內容轉義。如果你希望它能夠顯示{{region_top}}還有,我建議是這樣的:

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

如果您的HTML變量的內容也是動態的(這意味着它可以包含多隻這兩個變量),我會寫一個可以做你想做的事情的樹枝插件。編寫插件很容易。

編輯:這是我剛寫完的擴展。

編輯2:擴展現在使用的環境渲染字符串,所以它的計算結果,而不是僅僅更換變量的字符串。這意味着你的變量可以包含模板可以包含的任何東西,並且它將被Twig自身渲染和轉義。我真棒。

<?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'; 
    } 
} 

用法示例:

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

在模板:

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

插件或擴展? – Meliborn

+0

也許替換過濾器可以使用如preg_replace和佔位符?像這樣的{{html | replace({'{{$ 1}}':$ 1})}}我不知道插件應該做什麼:( – Meliborn

+0

@Meliborn我的意思是擴展名。我不能從一個擴展中獲得一個變量的價值,我會繼續尋找:我可能自己需要這樣的東西 –

4

一種選擇是使你的模板爲字符串。你可以是這樣做的:

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

我將讓你來決定究竟如何構造代碼,以使這項工作,但它可能會去是這樣的: 1)取內模板文本包含未被替換的變量。 2)將內部模板文本渲染到$ html變量中。一定要通過你需要的任何變量。 3)渲染包含{{html}}的原始模板。一定要在「HTML」 => $ HTML傳遞瓦爾數組中