In my template I want to output the server timezone.
My template has something like
{{ getservertimezone }}
Then in the services.yml co
See example below
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";
}
}
// 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">
services:
my_global_filters_and_functions:
class: Your/NameSpace/AppExtension
tags:
- { name: twig.extension }
This is how i used custom functions in Twig in one my old projects, i don't know if it's a best practice, but it worked for me.
Resources : Twig Documentation - Extending Twig
Use getFunctions()
instead of getFilters()
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('server_time_zone', array($this, 'getServerTimeZone')),
);
}
Twig filters are used to filter some value.
{{ "some value" | filter_name_here }}
Btw, you can define both filters and functions in the same class.
In the newer versions of Twig he should be using Twig_SimpleFunction instead of Twig_Function_Method and Twig_SimpleFilter instead of Twig_Filter_Method, since Twig_*_Method are deprecated (I am using Twig v. 1.24.0 along with Symfony 2.8.2)
Instead of getFilters
, override getFunctions
and use Twig_Function_Method
instead of Twig_Filter_Method
.