I couldn’t find a decent tutorial online that explained twig extensions in a simple way so for those of you in need here is a step by step guide on how to create a twig extension for Symfony2.
The first thing to know is the difference between twig global, filter and functions (or just how the look in twig templates).
Global
{% raw %}
{{ global_variable }}
{% endraw %}
Filter
{% raw %}
{{ 'some sort of text'|filter }}
{% endraw %}
Function
{% raw %}
{% function('some variable or text') %}
{% endraw %}
If you want more information look here: http://twig.sensiolabs.org/doc/templates.html
For the following steps remember to change the ‘Bundle’ and ‘NameBundle’ to your bundles values. Also note that the following code is just for creating filters.
Step 1: Create the filter
Create a file Bundle/NameBundle/Extension/MyTwigExtension.php
and use the following code inside it.
<?php
namespace Bundle\NameBundle\Extension;
use Symfony\Component\HttpKernel\KernelInterface;
class MyTwigExtension extends \Twig_Extension
{
public function getFilters()
{
return array(
'uppercase_first_letter' => new \Twig_Filter_Method($this, 'uppercase_first_letter'),
'var_dump' => new \Twig_Filter_Function('var_dump')
);
}
function uppercase_first_letter($var){
return ucwords($var);
}
public function getName()
{
return 'recensus_twig_extension';
}
}
So I’ve created two filters that I can use in my twig templates, uppercase_first_letter and var_dump. var_dump is already a function within php so that just works without having to create the method within the MyTwigExtension class. uppercase_first_letter require me to create a public method within the class.
Notice the different classes used, Twig_Filter_Method for a custom methods and Twig_Filter_Function for a php method.
Step 2: Register with config
Then you need to add the following code to the bottom of the config file (/app/config/config.yml).
services:
anywordyouwant.twig.extension.mytwigextension:
class: Bundle\NameBundle\Extension\MyTwigExtension
tags:
- { name: twig.extension }
Step 3: Use the filters
Inside your twig templates
{% raw %}
{{ 'what ever you want'|uppercase_first_letter }}
{% endraw %}