Confronto tra le paradigmi PHPTemplate e Twig
Informazioni su Twig
Twig è un linguaggio di template compilato basato su PHP. Quando la tua pagina web viene renderizzata, il motore Twig prende il template e lo trasforma in un template PHP “compilato”, che viene memorizzato in una cartella protetta in sites/default/files/php/twig. La compilazione avviene una sola volta, i file dei template vengono messi in cache per il riutilizzo e ricompilati quando la cache Twig viene svuotata.
L’iniziativa Drupal Twig ha la stessa motivazione dell’iniziativa Symfony: introdurre un motore moderno, potente e orientato agli oggetti, che permetta agli sviluppatori di concentrarsi correttamente su Drupal.
1. Docblock
PHPTemplate:
<?php /** * @file * Descrizione del file */ ?>
Twig:
{#
/**
* @file
* Descrizione del file
*/
#}
2. Nomi di file e funzioni
File PHPTemplate: node--article.tpl.php
File Twig: node--article.html.twig
Funzione PHPTemplate: THEME_node_links()
File Twig: node-links.html.twig
3. Variabili
Stampare una variabile:
PHPTemplate: <div class="content"><?php print $content; ?></div>
Twig: <div class="content">{{ content }}</div>
Stampare un elemento di una chiave hash [1]
PHPTemplate: <?php print $item['#item']['alt']; ?>
Twig: {{ item['#item'].alt }}
Assegnare una variabile:
PHPTemplate: <?php $custom_var = $content->comments; ?>
Twig: {% set custom_var = content.comments %}
Assegnare un array:
PHPTemplate: <?php $args = array('@author' => $author, '@date' => $created); ?>
Twig: {% set args = {'@author': author, '@date': created} %}
4. Condizioni
PHPTemplate: <?php if ($content->comments): endif; ?>
Twig: {% if content.comments %} {% endif %}
PHPTemplate: <?php if (!empty($content->comments)): endif; ?>
Twig: {% if content.comments is not empty %} {% endif %}
PHPTemplate: <?php if (isset($content->comments)): endif; ?>
Twig: {% if content.comments is defined %} {% endif %}
PHPTemplate: <?php if ($count > 0): endif; ?>
Twig: {% if count > 0 %} {% endif %}
5. Strutture di controllo
PHPTemplate: <?php foreach ($users as $user) {} ?>
Twig: {% for user in users %} {% endfor %}
6. Filtri
Escape dei caratteri speciali HTML:
PHPTemplate: <?php print check_plain($title); ?>
Twig [2]: {{ title }}
Valori non trattati:
PHPTemplate: <?php print $title; ?>
Twig: {{ title|raw }}
Traduzione:
PHPTemplate: <?php print t('Home'); ?>
Twig: {{ 'Home'|t }}
Traduzione con sostituzioni:
PHPTemplate: <?php print t('Welcome, @username', array('@username' => $user->name)); ?>
Twig: {{ 'Welcome, @username'|t({ '@username': user.name }) }}
Drupal 8 Twig (con estensione trans tag):
{% set username = user.name %}
{% trans %}
Welcome, {{ username }}
{% endtrans %}
Unire una lista:
PHPTemplate: <?php echo implode(',', $usernames); ?>
Twig: {{ usernames|join(', ') }}
Unire una lista con markup:
Twig: {{ usernames|safe_join(',') }}
L’esempio PHPTemplate richiede che $usernames sia un array di stringhe. Lo stesso vale per l’esempio Twig originale, dove “usernames” è un array di stringhe. D’altra parte, l’esempio Twig di Drupal 8 richiede un array di oggetti renderizzabili. Questa è in realtà una differenza fondamentale tra Twig in Drupal 8 e Twig originale. Drupal 8 Twig “stampa” sia testo semplice che array renderizzabili.
Un altro aspetto di questo esempio è che ci si aspetterebbe che tutti e tre gli esempi producano lo stesso output, ma non è così (di default). Considera questo esempio:
{% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
{{ numbers }}
Quanto sopra suggerisce che gli elementi vengano stampati separati da virgole. Ma l’output è: OneTwoThree
7. Gestione degli spazi
Twig permette di controllare gli spazi, consentendo di rimuovere quelli usati per la strutturazione del file del template.
<div class="body">
{{- block.content -}}
</div>
Questo è equivalente a:
<div class="body">{{ block.content }}</div>
Attenzione
- L’esempio della chiave hash potrebbe cambiare in futuro
- Nel secondo esempio mostriamo come Twig gestisce la sanitizzazione dei dati. In precedenza, questo veniva gestito nel file del template o nella funzione di preprocess. Questo cambiamento è molto importante per chi spera di portare un tema PHPTemplate su Drupal 8 – dovrai pulire manualmente i tuoi dati. ↩︎︎