Jeśli chcesz dodać do szablonu Twiga niestandardowe funkcje, filtry itp, musisz utworzyć własne rozszerzenie. Przed tym upewnij się, że Twoje rozszerzenie nie jest już zaimplementowane w standardzie Twiga. Pozwoli to uniknąć niepotrzebnych kolizji 😉
Aby korzystać z rozszerzeń Twiga musimy wpierw je zainstalować:
1 |
$ composer require twig/extensions |
1. FUNKCJE
W pierwszym przykładzie dodamy funkcję, która będzie losować kolor w zapisie RGB (np: #c00d25). W Twigu jej postać będzie następująca:
1 |
{{ color() }} |
W katalogu src/Twig/ tworzymy plik AppExtension.php i wklejamy do niego poniższą zawartość:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php // src/Twig/AppExtension.php namespace App\Twig; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; class AppExtension extends AbstractExtension { public function getFunctions() { return array( new TwigFunction('color', array($this, 'randColor')), ); } public function randColor() { return '#'.dechex(rand(0x000000, 0xFFFFFF)); } } ?> |
W metodzie randColor() użyłem dwóch funkcji znanych z języka PHP:
- dechex(int $number) – zwróci ciąg znaków zawierający szesnastkową reprezentację argumentu $number,
- rand(int $min, int $max) – wylosuje liczbę z podanego przedziału: 0x000000, 0xFFFFFF.
Aby nasza funkcja randColor była widoczna w szablonie musimy dopisać ją do metody getFunctions z klasy TwigFunction:
1 |
new TwigFunction('color', array($this, 'randColor')) |
Nazwa color będzie używana przez nas w szablonie Twiga. Oczywiście możesz podać dowolną, inną nazwę. Na koniec, gdzieś w szablonie wstawiamy funkcję color() np:
1 2 3 4 5 6 7 |
{% extends 'base.html.twig' %} {% block body %} <h1 style="color:{{ color() }};">{{ color() }}</h1> {% endblock %} |
Odśwież kilka razy stronę i podziwiaj efekt swojej pracy 😉
2. FILTRY
Zasada tworzenia filtrów jest podobna do funkcji. W tym przypadku musimy dołączyć klasę z filtrami use Twig\TwigFilter oraz dopisać filtr do funkcji getFilters(). Dla przykładu dodamy filtr, który pierwszą literę w tekście zamieni na duży znak (Uppercase):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php // src/Twig/AppExtension.php namespace App\Twig; use Twig\Extension\AbstractExtension; use Twig\TwigFilter; class AppExtension extends AbstractExtension { public function getFilters() { return array( new TwigFilter('ucf', array($this, 'upperCaseFirst')), ); } public function upperCaseFirst($text) { return ucfirst($text); } } |
Zastosowanie filtra w szablonie:
1 |
{{ 'test'|ucf }} |
Efekt będzie taki:
1 |
Test |
Więcej o rozszerzeniach Twiga przeczytasz na stronie dokumentacji.