Comparación de los paradigmas PHPTemplate y Twig
Sobre Twig
Twig es un lenguaje de plantillas compilado basado en PHP. Cuando se muestra tu página web, el motor Twig toma la plantilla y la convierte en una plantilla PHP “compilada”, que se guarda en un directorio protegido en sites/default/files/php/twig. La compilación se realiza una vez, los archivos de plantilla se almacenan en caché para reutilización y se recompilan al limpiar la caché de Twig.
La iniciativa Drupal Twig tiene la misma motivación que la iniciativa Symfony: implementar un motor moderno, potente y basado en OOP que permita a los desarrolladores centrarse correctamente en Drupal.
1. Docblock
PHPTemplate:
<?php /** * @file * Descripción del archivo */ ?>
Twig:
{# /** * @file * Descripción del archivo */ #}
2. Nombres de archivos y funciones
Archivo PHPTemplate: node--article.tpl.php
Archivo Twig: node--article.html.twig
Función PHPTemplate: THEME_node_links()
Archivo Twig: node-links.html.twig
3. Variables
Imprimir variable:
PHPTemplate: <div class="content"><?php print $content; ?></div>
Twig: <div class="content">{{ content }}</div>
Imprimir elemento de clave hash [1]
PHPTemplate: <?php print $item['#item']['alt']; ?>
Twig: {{ item['#item'].alt }}
Asignar variable:
PHPTemplate: <?php $custom_var = $content->comments; ?>
Twig: {% set custom_var = content.comments %}
Asignar array:
PHPTemplate: <?php $args = array('@author' => $author, '@date' => $created); ?>
Twig: {% set args = {'@author': author, '@date': created} %}
4. Condicionales
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. Estructuras de control
PHPTemplate: <?php foreach ($users as $user) {} ?>
Twig: {% for user in users %} {% endfor %}
6. Filtros
Caracteres especiales HTML escapados:
PHPTemplate: <?php print check_plain($title); ?>
Twig[2]: {{ title }}
Valores sin procesar:
PHPTemplate: <?php print $title; ?>
Twig: {{ title|raw }}
Traducción:
PHPTemplate: <?php print t('Home'); ?>
Twig: {{ 'Home' | t }}
Traducción con sustituciones:
PHPTemplate: <?php print t('Welcome, @username', array('@username' => $user->name)); ?>
Twig: {{ 'Welcome, @username'|t({ '@username': user.name }) }}
Drupal 8 Twig (con la extensión del tag trans):
{% set username = user.name %} {% trans %} Welcome, {{ username }} {% endtrans %}
Unir lista:
PHPTemplate: <?php echo implode(',', $usernames); ?>
Twig: {{ usernames | join(', ') }}
Unir lista con marcado:
Twig: {{ usernames | safe_join(', ') }}
El ejemplo PHPTemplate requiere que $usernames sea un array de cadenas. Lo mismo para el ejemplo Twig original, donde "usernames" es un array de cadenas. Por otro lado, el ejemplo Drupal 8 Twig requiere un array de objetos renderizables. Esta es una diferencia fundamental entre Drupal 8 Twig y Twig original. Drupal 8 Twig "imprime" tanto texto simple como arrays renderizables.
Otro aspecto de este ejemplo es que se espera que los tres ejemplos produzcan la misma salida, pero no es así (por defecto). Considera este ejemplo:
{% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %} {{ numbers }}
Lo anterior supone que los elementos se imprimen separados por comas. Pero la salida es: OneTwoThree
7. Control de espacios
Twig tiene control de espacios que permite eliminar los espacios usados para estructurar el archivo de plantilla.
<div class="body"> {{- block.content -}} </div>
Esto es igual a:
<div class="body">{{ block.content }}</div>
Advertencia
- El ejemplo de elemento de clave hash puede cambiar en el futuro
- En el segundo ejemplo mostramos cómo Twig se encarga de sanear los datos. Antes esto se hacía en el archivo de plantilla o en la función preprocess. Este último cambio es importante para quienes quieran crear temas PHPTemplate para Drupal 8: deben sanear sus propios datos. ↩︎︎
Para más información, consulta:
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.