Twig(在Symfony中):从twig扩展访问模板参数

时间:2015-09-17 09:53:10

标签: php symfony templates twig

我想从我的twig扩展(过滤器,函数...)访问Twig模板参数,而不明确地传递它。

我的所有树枝扩展中总是需要一个“displayPreferences”变量,以便改变显示和转换值的方式。

可以将此变量作为模板参数传递,并将其作为我运行的每个Twig过滤器/函数的参数传递,但这会使模板难以阅读。

这样的事情会很棒:

/**
 * Twig filter (render a date using the user defined format)
 *
 * @param Date $date
 */
public function renderUserDate ($date) {
    // Somehow, get a template parameter, without receiving it as argument
    $renderPreference = $this->accessTemplateParameter('displayPreferences');

    switch ($renderPreference['dateFormat']) {
        // Do something
    }
}

2 个答案:

答案 0 :(得分:8)

您可以定义Context-aware Filters

  

如果要访问过滤器中的当前上下文,请设置   needs_context选项为true; Twig会将当前上下文传递给   过滤器调用的第一个参数(或第二个参数)   needs_environment也设置为true):

传递的上下文包括模板中定义的变量。

因此,更改过滤器的定义,添加所需的need_context参数:

public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('price', array($this, 'renderUserDate', ,array('needs_context' => true)),
        );
    }

然后用作例子:

/**
 * Twig filter (render a date using the user defined format)
 *
 * @param array $context: injected by twig
 * @param Date $date
 */
public function renderUserDate ($context, $date) {
    // defined in the template
    $renderPreference = $context['displayPreferences'];

    switch ($renderPreference['dateFormat']) {
        // Do something
    }
}

答案 1 :(得分:1)

除了能够定义允许您引用已接受答案中提到的模板变量的上下文感知过滤器之外,您还可以定义上下文感知功能。 twig documentation on functions提到了这一点:

  

除了过滤器功能外,其他功能与过滤器的功能相同。   pre_escape和preserves_safety选项。

此外,如果您查看twig's code for functions,它会显示“ needs_context”作为可用选项之一。

下面是一个函数示例,该函数在传递函数调用时提供一个传递的值,否则,使用上下文变量(模板变量)中的值:

public function getFunctions()
{
    return array(
        new \Twig_SimpleFunction('photobox', function($context, $page = false) {
            $page = $page ? $page : $context['page'];
            return $this->app['helper.theme']->photobox($page);
        }, array('needs_context' => true))
    );
}

使用上下文的另一条快速提示对我有帮助:如果您想查看上下文中存在哪些变量供您在twig函数中进行引用或过滤,只需引用twig的dump function {{ dump() }}在您的模板中。