web-dev-qa-db-ja.com

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() }}呼び出しを行う方法はありますか?

24
ed209

getFunctions()の代わりにgetFilters()を使用します

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

Twigフィルターは、値をフィルタリングするために使用されます。

{{ "some value" | filter_name_here }}

ところで、同じクラスでフィルターと関数の両方を定義できます。

41
Vadim Ashikhman

getFiltersの代わりに、getFunctionsをオーバーライドし、Twig_Function_Method の代わりに Twig_Filter_Method

6

Twigの新しいバージョンでは、Twig _ * _ Methodは廃止されているため、Twig_Function_Methodの代わりにTwig_SimpleFunctionを使用し、Twig_Filter_Methodの代わりにTwig_SimpleFilterを使用する必要があります(私はTwig v 。1.24.0とSymfony 2.8.2)

6
twigger

Symfony ^ 2.6-twig ^ 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 Documentation- Extending Twig

1
chebaby