树枝在树枝可变变量树枝在树枝可变变量(Twig variables in twig variable

2019-05-17 11:45发布

我有一个树枝变量的HTML。 要显示它在树枝模板我{{html}}

该变量的样子:

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

region_*是一个变量太多。 当枝条解析我的html变量,它不解析内部变量(地区)。

我该做什么?

Answer 1:

我已经小枝变量HTML。 要显示它在树枝模板怎么办{{HTML}}。 该变量的样子{{region_top}} {{region_center}}。 region_ *是变量太多。 当树枝解析我的HTML变量,他不解析内部变量(地区)。 我能应该怎么办?

树枝需要你的字符串作为一个字符串,这意味着你会看到变量的内容,逃过一劫。 如果你希望它能够显示{{region_top}}还有,我建议是这样的:

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

如果您的HTML变量的内容也是动态的(这意味着它可以包含的不仅仅是这两个变量更多),我会写一个树枝插件,它可以做你想做的。 编写插件是很容易做到的。

编辑 :这是我刚写完的扩展。

编辑2:扩展现在使用的环境渲染字符串,所以它的计算结果,而不是仅仅更换变量的字符串。 这意味着你的变量可以包含任何模板就可以了,它会被渲染和嫩枝自身逃脱。 我真棒。

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


Answer 2:

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

看来,这是频频失手,因为大多数人认为(和搜索)期待一个过滤器/功能时,在他们的。模板从字符串起草当前的语言来评价“EVAL”是不是涉及到第一搜索查询心神。



Answer 3:

一种选择是使你的模板为字符串。 你可以是这样做的:

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

我将让你来决定究竟如何构造代码,以使这项工作,但它可能会去是这样的:1)获取包含不被替换的变量内模板文本。 2)渲染内模板文本到$ HTML变量。 要确保在任何你需要的增值经销商通过。 3)渲染包含您的原始模板{{HTML}}。 一定要在“HTML” => $ HTML传递瓦尔数组中



Answer 4:

还可以传递数组或一个目的是视图,然后用树枝attribute()方法: http://twig.sensiolabs.org/doc/functions/attribute.html

{% if attribute(array, key) is defined %}
    {{ attribute(array, key) }}
{% endif %}


文章来源: Twig variables in twig variable
标签: twig