Dans mon modèle, je veux sortir le fuseau horaire du serveur.
Mon modèle a quelque chose comme
{{ getservertimezone }}
Ensuite, dans la configuration services.yml pour ce bundle que j'ai
my.twig.extension:
class: My\WebsiteBundle\Extensions\Twig\SomeTemplateHelper
tags:
- { name: twig.extension }
Et mon SomeTemplateHelper
ressemble à
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';
}
}
Mais je ne peux pas appeler cette méthode à moins qu'elle ne soit utilisée comme un filtre {{ someval | getservertimezone }}
, Y a-t-il un moyen de simplement faire un appel direct {{ getservertimezone() }}
?
Utilisez getFunctions()
au lieu de getFilters()
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('server_time_zone', array($this, 'getServerTimeZone')),
);
}
Les filtres à brindilles sont utilisés pour filtrer une valeur.
{{ "some value" | filter_name_here }}
Btw, vous pouvez définir à la fois des filtres et des fonctions dans la même classe.
Au lieu de getFilters
, remplacez getFunctions
et utilisez Twig_Function_Method
au lieu de Twig_Filter_Method
.
Dans les versions plus récentes de Twig il devrait utiliser Twig_SimpleFunction au lieu de Twig_Function_Method et Twig_SimpleFilter au lieu de Twig_Filter_Method, puisque la méthode Twig _ * _ est déconseillée (j'utilise Twig v 1.24.0 avec Symfony 2.8.2)
Voir l'exemple ci-dessous
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 }
C'est ainsi que j'ai utilisé des fonctions personnalisées dans Twig dans l'un de mes anciens projets, je ne sais pas si c'est une meilleure pratique, mais cela a fonctionné pour moi.
Ressources: Twig Documentation - Extending Twig