Estendere Twig su October CMS

Luca Benati

Estendere Twig con filtri e funzioni personalizzate in 5 minuti


Pubblicato da Luca Benati il 31 luglio 2019

Su October possiamo estendere facilmente il template engine Twig aggiungendo filtri e funzioni personalizzare in modo molto semplice.

Sia funzioni che filtri personalizzati possono essere registrati nella classe Plugin tramite il metodo registerMarkupTags

In questo esempio registriamo un nuovo filtro (octoberize) e una nuova funzione (branding)


use System\Classes\PluginBase;
use Config;

class Plugin extends PluginBase
{

    public function registerMarkupTags()
    {
        return [
            'filters' => [

                'octoberize' => [$this, 'octoberizeFilter']
            ],
            'functions' => [

                'branding' => [$this, 'brandingFunction'],
            ]
        ];
    }

    public function octoberizeFilter($text){

        return 'Questo testo è stato Octoberizzato! ' . $text;
    }

    public function brandingFunction($value){

        return Config::get($value);
    }

}

Come vediamo, in completo stile October, è tutto piuttosto semplice e intuitivo, ora possiamo già utilizzare il nostro filtro in questo modo


{{ 'Il mio testo' | octoberize }}

che verrà renderizzato in:

Questo testo è stato Octoberizzato! Il mio testo

Come vediamo il testo passato al filtro è la variabile $text attesa dalla funzione octoberizeFilter chiamata dal filtro octoberize

In modo analogo possiamo chiamare la funzione branding passando l'argomento desiderato


{{ branding('app.name') }}

Anche in questo caso app.name sarà il valore di $value atteso dalla funzione brandingFunction chiamata dalla funzione (di Twig) branding

In entrambi i casi visti sopra chiamiamo una funzione locale usando $this come primo argomento dell'array che definisce il nuovo filtro e funzione di Twig, ma in realtà possiamo chiamare anche funzioni globali come ad esempio


'filters' => [

                'cammellizza' => 'camel_case'
            ]

Possiamo passare il namespace completo della classe da invocare e come secondo parametro il metodo che andremo ad esguire che anche in questo caso riceverò come parametro/i i valori passati nel template


'functions' => [
                'config_get' => ['October\Rain\Support\Facades\Config', 'get']
            ]

che potremo utilizzare nel tempalte come di consueto:


{{ config_get('app.name') }}

Un'ulteriore possibilità è quella di utilizzare una funzione anonima inline


'functions' => [
                'saluti' => function() { return 'Ciao Mondo!'; }
            ]

Naturalmente uno non esclude l'altro quindi il codice completo del nostro metodo registerMarkupTags sarà:



use System\Classes\PluginBase;
use Config;

class Plugin extends PluginBase
{

    public function registerMarkupTags()
    {
        return [
            'filters' => [

                'octoberize' => [$this, 'octoberizeFilter']
            ],
            'functions' => [
                'branding' => [$this, 'brandingFunction'],
                'config_get' => ['October\Rain\Support\Facades\Config', 'get'],
                'saluti' => function() { return 'Ciao Mondo!'; }
            ]
        ];
    }

    public function octoberize($text){

        return 'Questo testo è stato Octoberizzato! ' . $text;
    }

    public function brandingFunction($value){

        return Config::get($value);
    }

}

Questo è tutto, ora non ci resta che espandere Twig con tutti i filtri e funzioni che ci servono e riutilizzarle facilmente da un progetto all'altro magari creando un plugin apposito che li riunisce tutti quanti.

Buon October a tutti!


Lunga vita e prosperità

Ti interessa un argomento non trattato?