Contrary to Drupal 7 you cannot call regular PHP functions in your templates. In Drupal 8 the way to go is by creating filters and functions.
You should use a filter when: you want to transform the data you want to display. Imagine you have a title that you want to always be uppercase. For example, twig has the capitalize
filter by default that allows you to transform any text into its uppercase equivalent.
For this example we will create a filter that will allow us to shuffle a string. The way to create filters and functions is exactly the same as regular Twig.
The main difference between regular Twig and Drupal 8 Twig is that in Drupal 8 you must create a service definition of the class your are creating and the class must also belong to a namespace otherwise it will not be registered as a Twig filter within the Drupal environment.
This example assumes that you have a module called twig_shuffle_extension
.
This will be the basic service definition inn twig_shuffle_extension.services.yml
services:
twig_shuffle_extension.twig_extension:
class: Drupal\twig_shuffle_extension\TwigExtension\TwigShuffleExtension
tags:
- { name: twig.extension }
The tags
key is also absolutely required and is what tells Drupal what this class is supposed to do (i.e. register it as a Twig extension).
And now the source code that must be placed in the path defined in the class
key of the service definition.
// Don't forget the namespace!
namespace Drupal\twig_shuffle_extension\TwigExtension;
use Twig_Extension;
use Twig_SimpleFilter;
class TwigShuffleExtension extends Twig_Extension {
/**
* This is the same name we used on the services.yml file
*/
public function getName() {
return 'twig_shuffle_extension.twig_extension';
}
// Basic definition of the filter. You can have multiple filters of course.
// Just make sure to create a more generic class name ;)
public function getFilters() {
return [
new Twig_SimpleFilter('shuffle', [$this, 'shuffleFilter']),
];
}
// The actual implementation of the filter.
public function shuffleFilter($context) {
if(is_string($context)) {
$context = str_shuffle($context);
}
return $context;
}
}
Clear your caches and now, if everything goes according to plan, you can use the filter in your templates.
{{ "shuffle me!" | shuffle }}