树枝变量中的树枝变量 [英] Twig variables in twig variable

查看:33
本文介绍了树枝变量中的树枝变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个树枝变量 html.为了在树枝模板中显示它,我执行 {{html}}.

那个变量看起来像:

{{region_top}}

{{region_center}}

region_* 也是一个变量.当 Twig 解析我的 html 变量时,它不会解析内部变量(区域).

我该怎么办?

解决方案

我有树枝变量 html.为了在树枝模板中显示它,我做了 {{html}}.该变量看起来像 {{region_top}}{{region_center}}.region_* 也是变量.当树枝解析我的 html 变量时,他没有解析内部变量(区域).我该怎么办?

Twig 将您的字符串作为文字字符串,这意味着您将看到变量的内容,已转义.如果您希望它也能够显示 {{region_top}},我建议您这样做:

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

如果你的 html 变量的内容也是动态的(意味着它可以包含的不仅仅是这两个变量),我会写一个可以做你想做的事情的 twig 插件.编写插件非常容易.

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

EDIT 2:扩展现在使用环境来呈现字符串,因此它评估字符串,而不仅仅是替换变量.这意味着您的变量可以包含模板可以包含的任何内容,并且它会被 Twig 本身渲染和转义.我很厉害.

<?php/*** 一个树枝扩展,将添加一个评估"过滤器,用于动态评估.*/类 EvaluateExtension 扩展 \Twig_Extension {/*** 将内部变量过滤器附加到树枝环境.** @return 数组*/公共函数 getFilters() {返回数组('评估' =>new \Twig_Filter_Method( $this, 'evaluate', array('needs_environment' =>真的,'needs_context' =>真的,'is_safe' =>大批('评估' =>真的))));}/*** 此函数将通过 $environment 评估 $string,并返回其结果.** @param 数组 $context* @param 字符串 $string*/公共函数评估( \Twig_Environment $environment, $context, $string ){$loader = $environment->getLoader();$parsed = $this->parseString( $environment, $context, $string );$environment->setLoader( $loader );返回 $parsed;}/*** 将环境的解析器设置为 Twig_Loader_String,并解析字符串 $string.** @param \Twig_Environment $environment* @param 数组 $context* @param 字符串 $string* @return 字符串*/受保护的函数 parseString( \Twig_Environment $environment, $context, $string ) {$environment->setLoader( new \Twig_Loader_String( ) );返回 $environment->render( $string, $context );}/*** 返回此扩展的名称.** @return 字符串*/公共函数 getName( ) {返回评估";}}

示例用法:

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

在模板中:

{% set var = '内部变量' %}{{'这是一个带有 {{var}}'|evaluate}} 的字符串

I have a twig variable html. To show it in a twig template I do {{html}}.

That variable looks like:

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

region_* is a variable too. When Twig parses my html variable, it doesn't parse the inner variables (regions).

What I should do?

解决方案

I have twig variable html. To show it in twig template I do {{html}}. That variable look like {{region_top}}{{region_center}}. region_* is variables too. When twig parse my html variable he didn't parse inner variables (regions). What can I should do?

Twig takes your strings as a literal string, meaning you'll see the content of the variable, escaped. If you want it to be able to display {{region_top}} as well, I'd recommend something like this:

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

If the content of your html variable is also dynamic (meaning it can contain more than just those two variables), I'd write a twig plugin which can do what you want. Writing plugins is pretty easy to do.

EDIT: Here's the extension I just finished writing.

EDIT 2: The extension now uses the environment to render the string, so it evaluates the string, instead of just replacing variables. This means your variable can contain anything a template can, and it will be render and escaped by Twig itself. I'm awesome.

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

Example usage:

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

In the template:

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

这篇关于树枝变量中的树枝变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆