Использование пользовательской функции в веточке
В моем шаблоне я хочу вывести часовой пояс сервера.
Мой шаблон имеет что-то вроде
{{ getservertimezone }}
Затем в config.sys для этого пакета есть
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 }}
, есть ли способ просто вызвать вызов straigh {{ getservertimezone() }}
?
Ответы
Ответ 1
Используйте getFunctions()
вместо getFilters()
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('server_time_zone', array($this, 'getServerTimeZone')),
);
}
Фильтры Twig используются для фильтрации некоторого значения.
{{ "some value" | filter_name_here }}
Btw, вы можете определить как фильтры, так и функции в одном классе.
Ответ 2
Вместо getFilters
переопределить getFunctions
и использовать Twig_Function_Method
вместо Twig_Filter_Method
.
Ответ 3
В новых версиях Twig он должен использовать Twig_SimpleFunction вместо Twig_Function_Method и Twig_SimpleFilter вместо Twig_Filter_Method, так как Twig _ * _ Method устарели (я использую Twig v. 1.24.0 вместе с Symfony 2.8.2)
Ответ 4
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">
приложение /Config/services.yml
services:
my_global_filters_and_functions:
class: Your/NameSpace/AppExtension
tags:
- { name: twig.extension }
Вот как я использовал пользовательские функции в Twig в одном из моих старых проектов, я не знаю, является ли это наилучшей практикой, но это сработало для меня.
Ресурсы: Документация по ветке - Расширение ветки