在树枝中使用自定义功能

时间:2012-11-07 20:14:21

标签: php symfony twig

在我的模板中,我想输出服务器时区。

我的模板有类似

的内容
{{ getservertimezone }}

然后在该捆绑包的services.yml配置中我有

my.twig.extension:
    class: My\WebsiteBundle\Extensions\Twig\SomeTemplateHelper
    tags:
           - { name: twig.extension }

我的SomeTemplateHelper看起来像

namespace My\WebsiteBundle\Extensions\Twig;

class SomeTemplateHelper extends \Twig_Extension
{

    public function getFilters() 
    {
        return array(
            'getservertimezone'  => new \Twig_Filter_Method($this, 'getServerTimeZone'),
        );
    }


    public function getServerTimeZone()
    {
        if (date_default_timezone_get()) {
            return date_default_timezone_get();
        } else if (ini_get('date.timezone')) {
            return ini_get('date.timezone');
        } else {
            return false;
        }
    }

    public function getName()
    {
        return 'some_helper';
    }

}

但我无法调用此方法,除非它像过滤器{{ someval | getservertimezone }}一样使用,是否可以直接进行直线{{ getservertimezone() }}调用?

4 个答案:

答案 0 :(得分:41)

使用getFunctions()代替getFilters()

public function getFunctions()
{
    return array(
        new \Twig_SimpleFunction('server_time_zone', array($this, 'getServerTimeZone')),
    );
}

Twig过滤器用于过滤某些值。

{{ "some value" | filter_name_here }}

顺便说一下,你可以在同一个类中定义过滤器和函数。

答案 1 :(得分:6)

而不是getFilters,覆盖getFunctions并使用Twig_Function_Method代替Twig_Filter_Method

答案 2 :(得分:6)

在较新版本的Twig中,他应该使用Twig_SimpleFunction而不是Twig_Function_Method和Twig_SimpleFilter而不是Twig_Filter_Method,因为弃用了Twig _ * _ Method(我使用的是Twig v.1.24.0和Symfony 2.8.2)

答案 3 :(得分:0)

Symfony ^ 2.6-树枝^ 1.38

请参见下面的示例


AppExtension.php

namespace Your/NameSpace;

class AppExtension extends \Twig_Extension {

    public function getFilters() 
    {
        return array(
            new \Twig_SimpleFilter('cdn_asset_filter', array($this, 'cdn_asset_filter')),
        );
    }

    public function getFunctions()
    {
        return array(
            new \Twig\TwigFunction('cdn_asset_function', array($this, 'cdn_asset_function')),
        );
    }


    public function cdn_asset_filter($path) 
    {
        return "https://cdn.example.com/$path";
    }


    public function cdn_asset_function($path) 
    {
        return "https://cdn.example.com/$path";
    }
}

view.html.twig

// Filter

<img src="{{ 'path/to/image.png'|cdn_asset_filter }}">

// result : <img src="https://cdn.example.com/path/to/image.png">


// Function

<img src="{{ cdn_asset_function('path/to/image.png') }}">

// result : <img src="https://cdn.example.com/path/to/image.png">

app / config / services.yml

services:
    my_global_filters_and_functions:
        class: Your/NameSpace/AppExtension
        tags:
            - { name: twig.extension }

这就是我在旧项目中的Twig中使用自定义函数的方式,我不知道这是否是最佳实践,但这对我有用。


资源:Twig文档-Extending Twig