205
TWIG EL NUEVO MOTOR DE PLANTILLAS PARA DRUPAL 8 JAVIER EGUILUZ DRUPALCAMPSPAIN 26 OCTUBRE 2013

Twig, el nuevo motor de plantillas de Drupal 8

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Twig, el nuevo motor de plantillas de Drupal 8

TWIGEL NUEVO MOTOR DEPLANTILLAS PARA

DRUPAL 8JAVIER EGUILUZDRUPALCAMPSPAIN 26 OCTUBRE 2013

Page 2: Twig, el nuevo motor de plantillas de Drupal 8

Licencia de esta presentación

creativecommons.org/licenses/by-nc-sa/3.0/es

Page 3: Twig, el nuevo motor de plantillas de Drupal 8

Muchas gracias a los patrocinadores

Asociación Española de Drupal

Page 4: Twig, el nuevo motor de plantillas de Drupal 8

ME PRESENTO

Page 5: Twig, el nuevo motor de plantillas de Drupal 8

Formador especializado en

nuevas tecnologías

Javier Eguiluz

Diseño y programación web Comunidad sobre el framework Symfony

Programador entusiasta del framework Symfony

+

Page 6: Twig, el nuevo motor de plantillas de Drupal 8

también explica Twig

empieza desde cero

actualizaciones gratuitas incluidas

soporta todas las versiones de Symfony2

Page 7: Twig, el nuevo motor de plantillas de Drupal 8

AGENDA

Page 8: Twig, el nuevo motor de plantillas de Drupal 8

PRIMERA PARTE

APRENDIENDO TWIGSEGUNDA PARTE

TWIG AVANZADOTERCERA PARTE

APLICANDO TWIG

Page 9: Twig, el nuevo motor de plantillas de Drupal 8

PRIMERA PARTE

APRENDIENDO TWIG

Page 10: Twig, el nuevo motor de plantillas de Drupal 8

• Twig es un motor y lenguaje de plantillas (como PHP, Smarty, Moustache, etc.)

• Twig es el sistema de plantillas utilizado por Drupal 8.

¿Qué es Twig?

Page 11: Twig, el nuevo motor de plantillas de Drupal 8

Integrando Twig desde julio 2012

Page 12: Twig, el nuevo motor de plantillas de Drupal 8

TWIG ENDRUPAL 8

Page 13: Twig, el nuevo motor de plantillas de Drupal 8

Nueva forma de pensar$variables['table'] = theme('table', array( 'header' => $header, 'rows' => $rows));

$variables['table'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows,);

D7

D8

Page 14: Twig, el nuevo motor de plantillas de Drupal 8

SINTAXIS

Page 15: Twig, el nuevo motor de plantillas de Drupal 8

core/modules/node/templates/node.html.twig

<div {{ attributes }}> {# hide the comments to render them later #}

{% hide(content.comments) %} {{ content }}</div>

Page 16: Twig, el nuevo motor de plantillas de Drupal 8

core/modules/node/templates/node.html.twig

<div {{ attributes }}> {# hide the comments to render them later #}

{% hide(content.comments) %} {{ content }}</div>

{{ ... }} mostrar información

Page 17: Twig, el nuevo motor de plantillas de Drupal 8

core/modules/node/templates/node.html.twig

<div {{ attributes }}> {# hide the comments to render them later #}

{% hide(content.comments) %} {{ content }}</div>

{# ... #} añadir comentarios

Page 18: Twig, el nuevo motor de plantillas de Drupal 8

core/modules/node/templates/node.html.twig

<div {{ attributes }}> {# hide the comments to render them later #}

{% hide(content.comments) %} {{ content }}</div>

{% ... %} ejecutarcódigo

Page 19: Twig, el nuevo motor de plantillas de Drupal 8

Sintaxis de Twig

{{ mostrar información }}

{% ejecutar código %}

{# añadir comentario #}

Page 20: Twig, el nuevo motor de plantillas de Drupal 8

MOSTRANDO INFORMACIÓN

Page 21: Twig, el nuevo motor de plantillas de Drupal 8

Variables simples

{{ titulo_articulo }}{{ nombre_usuario }}{{ precio }}

Page 22: Twig, el nuevo motor de plantillas de Drupal 8

Variables de cada plantilla{# core/modules/node/templates/node.html.twig #}{# Default theme implementation to display a node. Available variables: - node: Full node entity. - id: The node ID - bundle: The type of the node, for example, "page" or "article". - authorid: The user ID of the node author. - createdtime: Formatted creation date. ... #}<article id="node-{{ node.id }}" class="{{ attributes.class }} clearfix"{{ attributes }}>

{{ title_prefix }} {% if not page %} <h2{{ title_attributes }}> <a href="{{ node_url }}" rel="bookmark">{{ label }}</a> </h2> {% endif %} {{ title_suffix }}

{% if display_submitted %} <footer> {{ user_picture }}

las plantillas de Drupal 8 listan todas sus variables

Page 23: Twig, el nuevo motor de plantillas de Drupal 8

Variables complejas

{{ articulo.titulo }}{{ usuario.nombre }}{{ producto.precio }}

Page 24: Twig, el nuevo motor de plantillas de Drupal 8

{{ usuario.nombre }}

1. $usuario['nombre']2. $usuario->nombre3. $usuario->nombre()4. $usuario->getNombre()5. $usuario->isNombre()6. null

Page 25: Twig, el nuevo motor de plantillas de Drupal 8

Concatenando variables

{{ "El producto " ~ producto.titulo ~ " cuesta " ~ producto.precio ~ " euros" }}

El producto XXX cuesta NNN euros

concatena variables

Page 26: Twig, el nuevo motor de plantillas de Drupal 8

Interpolando variables

{{ "El producto #{producto.titulo} cuesta #{producto.precio} euros" }}

El producto XXX cuesta NNN euros

interpola variables

Page 27: Twig, el nuevo motor de plantillas de Drupal 8

CREANDO VARIABLES

Page 28: Twig, el nuevo motor de plantillas de Drupal 8

Creando una nueva variable

{% set numero = 3 %}El número elegido es {{ numero }}

{% set nombreCompleto = nombre ~ ' ' ~ apellidos %}

Page 29: Twig, el nuevo motor de plantillas de Drupal 8

Tipos de variables

{% set entero = 3 %}

{% set decimal = 3.14 %}

{% set cadena = "..." %}

{% set booleano = false %}

{% set array = [1, 2, 3, 4, 5] %}

{% set hash = {'a': 1, 'b': 2} %}

Page 30: Twig, el nuevo motor de plantillas de Drupal 8

Ejemplo de variable compleja{# core/modules/node/templates/node.html.twig #}node = { 'id': 1, 'bundle': 'page', 'authorid': 23, 'promoted': false, 'sticky': false, 'published': true, 'comment': 2, 'comment_count': 0}

Page 31: Twig, el nuevo motor de plantillas de Drupal 8

truco

Page 32: Twig, el nuevo motor de plantillas de Drupal 8

Trozos de código como variables

{% set navegacion %} <a href="...">Anterior</a> ... ... <a href="...">Siguiente</a>{% endset %}

Page 33: Twig, el nuevo motor de plantillas de Drupal 8

Trozos de código como variables

{% set navegacion %} <a href="...">Anterior</a> ... ... <a href="...">Siguiente</a>{% endset %}

{{ navegacion }}

{{ navegacion }}

Page 34: Twig, el nuevo motor de plantillas de Drupal 8

FILTROS

Page 35: Twig, el nuevo motor de plantillas de Drupal 8

Los filtros de Twig

Modifican la información antes de mostrarla por pantalla.

Page 36: Twig, el nuevo motor de plantillas de Drupal 8

Sintaxis

{{ variable|filtro }}

Page 37: Twig, el nuevo motor de plantillas de Drupal 8

Ejemplo de filtros para texto

{{ "..."|lower }}

{{ "..."|upper }}

{{ "..."|title }}

{{ "..."|capitalize }}

lorem ipsum

LOREM IPSUM

Lorem Ipsum

Lorem ipsum

lorEm iPsUm

Page 38: Twig, el nuevo motor de plantillas de Drupal 8

Los filtros que define Twigabsbatchcapitalizeconvert_encodingdatedate_modifydefaultescapefirstformatjoin

json_encodekeyslastlengthlowermergenl2brnumber_formatrawreplacereverse

slicesortsplitstriptagstitletrimupperurl_encode

Page 39: Twig, el nuevo motor de plantillas de Drupal 8

Filtros con argumentos

{{ descripcion|striptags }}{{ descripcion|striptags('<p>') }}

{{ precio|number_format }}{{ precio|number_format(3) }}{{ precio|number_format(3, '.') }}

Page 40: Twig, el nuevo motor de plantillas de Drupal 8

Tienes {{ amigos|length }} amigos

Tu nombre tiene {{ nombre|length }} letras

Los filtros se adaptan

Page 41: Twig, el nuevo motor de plantillas de Drupal 8

Tienes {{ amigos|length }} amigos

Tu nombre tiene {{ nombre|length }} letras

Los filtros se adaptan

count()

strlen()

Page 42: Twig, el nuevo motor de plantillas de Drupal 8

{{ titulo|striptags|title }}

{{ direcciones|first|trim|capitalize }}

Encadenando filtros

Page 43: Twig, el nuevo motor de plantillas de Drupal 8

truco

Page 44: Twig, el nuevo motor de plantillas de Drupal 8

<p>{{ nombre|striptags|trim }}</p>

<p>{{ apellidos|striptags|trim }}</p>

<p>{{ biografia|striptags|trim }}</p>

Aplicando filtros a varios elementos

Page 45: Twig, el nuevo motor de plantillas de Drupal 8

{% filter striptags|trim %}

<p>{{ nombre }}</p> <p>{{ apellidos }}</p> <p>{{ biografia }}</p>

{% endfilter %}

Aplicando filtros a varios elementos

Page 46: Twig, el nuevo motor de plantillas de Drupal 8

LOS FILTROS DE DRUPAL 8

Page 47: Twig, el nuevo motor de plantillas de Drupal 8

El filtro para traducir contenidos

{{ '...'|t }}

Page 48: Twig, el nuevo motor de plantillas de Drupal 8

Traduciendo contenidos fijos{# core/modules/aggregator/templates/aggregator-item.html.twig #}

{{ 'Categories'|t }}: {{ categories|join(', ') }}

{# core/modules/comment/templates/comment-wrapper.html.twig #}

<h3>{{ 'Comments are displayed in a list.'|t }}</h3>

<h2 class="title">{{ 'Comments'|t }}</h2>

<h2 class="title comment-form">{{ 'Add comment'|t }}</h2>

Page 49: Twig, el nuevo motor de plantillas de Drupal 8

Traduciendo contenidos variables

'More posts about Drupal 8''More posts about Twig''More posts about Symfony'

Page 50: Twig, el nuevo motor de plantillas de Drupal 8

Traduciendo contenidos variables

'More posts about Drupal 8''More posts about Twig''More posts about Symfony'

traducir la parte fija

considerarlo una variable

Page 51: Twig, el nuevo motor de plantillas de Drupal 8

Traduciendo contenidos variables{# core/modules/aggregator/templates/aggregator-summary-items.html.twig #}

<a href="{{ source_url }}">

{{ 'More posts about %title'|t({ '%title': title }) }}</a>

{# core/modules/locale/templates/locale-translation-last-check.html.twig #}

{{ 'Last checked: @time ago'|t({'@time': time}) }}

Page 52: Twig, el nuevo motor de plantillas de Drupal 8

Traduciendo contenidos variables{# core/modules/aggregator/templates/aggregator-summary-items.html.twig #}

<a href="{{ source_url }}">

{{ 'More posts about %title'|t({ '%title': title }) }}</a>

{# core/modules/locale/templates/locale-translation-last-check.html.twig #}

{{ 'Last checked: @time ago'|t({'@time': time}) }}

Page 53: Twig, el nuevo motor de plantillas de Drupal 8

FUNCIONES

Page 54: Twig, el nuevo motor de plantillas de Drupal 8

Las funciones de Twig

Generan información para mostrarla por pantalla.

Page 55: Twig, el nuevo motor de plantillas de Drupal 8

Sintaxis

{{ funcion() }}{{ funcion('...') }}{{ funcion('...', '...') }}

Page 56: Twig, el nuevo motor de plantillas de Drupal 8

Ejemplo de función de Twig

{{ random() }}

{{ random(10) }}

{{ random("abcde") }}

{{ random([1, 2, 3]) }}

Page 58: Twig, el nuevo motor de plantillas de Drupal 8

ETIQUETAS

Page 59: Twig, el nuevo motor de plantillas de Drupal 8

Las etiquetas de Twig

Ejecutan operaciones complejas como la herencia de plantillas y controlan la ejecución de la plantilla.

Page 60: Twig, el nuevo motor de plantillas de Drupal 8

Las etiquetas que define Twig

autoescapeblockdoembedextendsfilterflush

forfromifimportincludemacrosandbox

setspacelessuseverbatim

Page 61: Twig, el nuevo motor de plantillas de Drupal 8

Las etiquetas de control de flujo

if ... elseswitchreturnbreakcontinue

forforeachwhiledo ... whilegoto

if ... else for

PHP

TWIG

Page 62: Twig, el nuevo motor de plantillas de Drupal 8

LA ETIQUETAIF

Page 63: Twig, el nuevo motor de plantillas de Drupal 8

La etiqueta IF básica{# core/modules/block/templates/block.html.twig #}<div> {{ title_prefix }}

{% if label %} <h2 {{ attributes }}>{{ label }}</h2>

{% endif %} {{ title_suffix }}</div>

Page 64: Twig, el nuevo motor de plantillas de Drupal 8

La etiqueta IF básica{# core/modules/block/templates/block.html.twig #}<div> {{ title_prefix }}

{% if label %} <h2 {{ attributes }}>{{ label }}</h2>

{% endif %} {{ title_suffix }}</div>

✔ Existe la variable✔ No es null✔ No es cadena vacía

Page 65: Twig, el nuevo motor de plantillas de Drupal 8

La etiqueta IF

{% if variable %}

...

{% endif %}

Page 66: Twig, el nuevo motor de plantillas de Drupal 8

Tomando decisiones{# core/modules/system/templates/page.html.twig #}

{% if title %} <b><a href="...">{{ site_name }}</a></b>

{% else %} <h1 class="site-name"> <a href="...">{{ site_name }}</a> </h1>

{% endif %}

Page 67: Twig, el nuevo motor de plantillas de Drupal 8

La etiqueta IF

{% if variable %}

...

{% else %}

...

{% endif %}

Page 68: Twig, el nuevo motor de plantillas de Drupal 8

Tomando varias decisiones{# core/modules/locale/templates/locale-translation-update-info.html.twig #}

{% if modules %} <span>{{ 'Updates for: modules' }}</span>

{% elseif missing_updates_status %} <span>{{ missing_updates_status }}</span>

{% endif %}

Page 69: Twig, el nuevo motor de plantillas de Drupal 8

La etiqueta IF

{% if variable %} ...{% elseif variable %} ...{% else %} ...{% endif %}

Page 70: Twig, el nuevo motor de plantillas de Drupal 8

Condiciones múltiples{# core/modules/book/templates/book-navigation.html.twig #}

{% if tree or has_links %} <nav class="book-navigation"> {{ tree }}

{% if has_links %} ... {% endif %} </nav>

{% endif %}

Page 71: Twig, el nuevo motor de plantillas de Drupal 8

Condiciones múltiples{# core/modules/book/templates/book-navigation.html.twig #}

{% if tree or has_links %} <nav class="book-navigation"> {{ tree }}

{% if has_links %} ... {% endif %} </nav>

{% endif %}

Operadores lógicos

andornot

b-andb-orb-xor

Page 72: Twig, el nuevo motor de plantillas de Drupal 8

Condiciones múltiples

{% if not label_hidden %}

{% if not label_hidden or user.is_admin %}

{% if label_hidden and not user.is_admin %}

{% if (label_hidden or user.is_admin) and node.is_published %}

Page 73: Twig, el nuevo motor de plantillas de Drupal 8

Comparaciones{# core/modules/views/templates/views-view-grid.html.twig #}

{% if options.alignment == 'horizontal' %}

{# core/modules/views/templates/views-view-list.html.twig #}

{% if list.type == 'ul' %}

Page 74: Twig, el nuevo motor de plantillas de Drupal 8

Comparaciones{# core/modules/views/templates/views-view-grid.html.twig #}

{% if options.alignment == 'horizontal' %}

{# core/modules/views/templates/views-view-list.html.twig #}

{% if list.type == 'ul' %}Operadores de comparación

==!=<

>>=<=

=== starts with ends withmatches

Page 75: Twig, el nuevo motor de plantillas de Drupal 8

FECHAS

Page 76: Twig, el nuevo motor de plantillas de Drupal 8

Intentando mostrar una fecha

{{ usuario.fechaNacimiento }}

Page 77: Twig, el nuevo motor de plantillas de Drupal 8

ERRORAn exception has been thrown during the rendering of a template:

"Catchable Fatal Error: Object of class DateTime could not be converted to string in [...] line XX"

Page 78: Twig, el nuevo motor de plantillas de Drupal 8

Intentando mostrar una fecha

{{ usuario.fechaNacimiento }}

variable de tipoDateTime

Page 79: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando fechas

{{ usuario.fechaNacimiento|date }}

Page 80: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando fechas

{{ usuario.fechaNacimiento|date }}

{{ ...|date('d/m/Y') }}{{ ...|date('d/m/Y H:i:s') }}

Page 81: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando fechas

{{ usuario.fechaNacimiento|date }}

{{ ...|date('d/m/Y') }}{{ ...|date('d/m/Y H:i:s') }}{{ ...|date('d \\d\\e F \\d\\e Y') }}

Page 82: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando fechas

{{ usuario.fechaNacimiento|date }}

{{ ...|date('d/m/Y') }}{{ ...|date('d/m/Y H:i:s') }}{{ ...|date('d \\d\\e F \\d\\e Y') }}

26 de Octubre de 2013

Page 83: Twig, el nuevo motor de plantillas de Drupal 8

truco

Page 84: Twig, el nuevo motor de plantillas de Drupal 8

Creando fechas

{{ 'now'|date }}{{ 'today'|date }}{{ 'next Monday'|date }}{{ '+ 10 minutes'|date }}

Page 85: Twig, el nuevo motor de plantillas de Drupal 8

Creando fechas

{{ 'now'|date }}{{ 'today'|date }}{{ 'next Monday'|date }}{{ '+ 10 minutes'|date }}

strtotime()

Page 86: Twig, el nuevo motor de plantillas de Drupal 8

Creando fechas

<footer> © {{ 'now'|date('Y') }} ACME.org</footer>

Page 87: Twig, el nuevo motor de plantillas de Drupal 8

Modificando fechas

{{ usuario.fechaNacimiento |date_modify('-9 months')|date }}

{{ usuario.fechaNacimiento |date_modify('+18 years')|date }}

Page 88: Twig, el nuevo motor de plantillas de Drupal 8

Modificando fechas

<p> Activa tu cuenta antes del {{ usuario.fechaRegistro |date_modify('+1 week')|date }}</p>

Page 89: Twig, el nuevo motor de plantillas de Drupal 8

SEGUNDA PARTE

TWIGAVANZADO

Page 90: Twig, el nuevo motor de plantillas de Drupal 8

BUCLES Y COLECCIONES

Page 91: Twig, el nuevo motor de plantillas de Drupal 8

Colecciones

Array (asociativo o numérico) o un objeto que implemente la interfaz Traversable.

Page 92: Twig, el nuevo motor de plantillas de Drupal 8

Secuencias

{{ 1..3 }} [1, 2, 3]{{ 5..2 }} [5, 4, 3, 2]{{ 'a'..'d' }} ['a', 'b', 'c', 'd']

Page 93: Twig, el nuevo motor de plantillas de Drupal 8

Las migas de pan del foro{# core/modules/forum/lib/Drupal/forum/ForumBreadcrumbBuilder.php #}

function forumPostBreadcrumb($node) {

$vocabulary = $this->entityManager->...->load('...');

$breadcrumb[] = l(t('Home'), NULL);

$breadcrumb[] = l($vocabulary->label(), 'forum');

// ...

return $breadcrumb;}

Page 94: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando las migas de pan<nav class="breadcrumb" role="navigation"> <ol>

{% for item in breadcrumb %} <li>{{ item }}</li>

{% endfor %} </ol></nav>

Page 95: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando las migas de pan<nav class="breadcrumb" role="navigation"> <ol>

{% for item in breadcrumb %} <li>{{ item }}</li>

{% endfor %} </ol></nav>

Page 96: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando las migas de pan<nav class="breadcrumb" role="navigation"> <ol>

{% for item in breadcrumb %} <li>{{ item }}</li>

{% endfor %} </ol></nav>

Page 97: Twig, el nuevo motor de plantillas de Drupal 8

El bucle FOR

{% for valor in coleccion %}

...

{% endfor %}

Page 98: Twig, el nuevo motor de plantillas de Drupal 8

El listado de libros{# core/modules/book/book.module #}function template_preprocess_book_all_books_block(&$variables) { // Remove all non-renderable elements. $elements = $variables['book_menus']; $variables['book_menus'] = array(); foreach (element_children($elements) as $index) { $variables['book_menus'][$index] = $elements[$index]; }}

Page 99: Twig, el nuevo motor de plantillas de Drupal 8

El listado de libros{# core/modules/book/book.module #}function template_preprocess_book_all_books_block(&$variables) { // Remove all non-renderable elements. $elements = $variables['book_menus']; $variables['book_menus'] = array(); foreach (element_children($elements) as $index) { $variables['book_menus'][$index] = $elements[$index]; }}

$book_menus[$index] = ...

Page 100: Twig, el nuevo motor de plantillas de Drupal 8

Mostrando el listado de libros

{% for book_id, menu in book_menus %} <nav id="book-block-menu-{{ book_id }}"> {{ menu }} </nav>

{% endfor %}

Page 101: Twig, el nuevo motor de plantillas de Drupal 8

El bucle FOR

{% for clave, valor in coleccion %}

...

{% endfor %}

Page 102: Twig, el nuevo motor de plantillas de Drupal 8

Accediendo a las claves de la colección

{% for clave in coleccion|keys %}

...

{% endfor %}

Page 103: Twig, el nuevo motor de plantillas de Drupal 8

truco

Page 104: Twig, el nuevo motor de plantillas de Drupal 8

La variable especial LOOP

{% for ... in coleccion %} {{ loop.index }} {{ loop.index0 }} {{ loop.first }} {{ loop.last }} {{ loop.length }}

{% endfor %}

Page 105: Twig, el nuevo motor de plantillas de Drupal 8

La variable especial LOOP

{% for ... in coleccion %} {{ loop.index }} {{ loop.index0 }} {{ loop.first }} {{ loop.last }} {{ loop.length }}

{% endfor %}

1, 2, 3, 4, 5, ...0, 1, 2, 3, 4, ...true, false, false, ......, false, false, true5

Page 106: Twig, el nuevo motor de plantillas de Drupal 8

¿Y si no hay libros?

{% for book_id, menu in book_menus %} <nav id="book-block-menu-{{ book_id }}"> {{ menu }} </nav>

{% else %} <p>No se ha publicado todavía ningún libro.</p>

{% endfor %}

Page 107: Twig, el nuevo motor de plantillas de Drupal 8

El bucle FOR

{% for valor in coleccion %}

...

{% else %}

...

{% endfor %}

Page 108: Twig, el nuevo motor de plantillas de Drupal 8

Indentando los mensajes del foro<div class="indent"> <div class="indent"> <div class="indent"> <div class="indent"> Lorem ipsum dolor sit amet, consectetur adipisic

ingelit, sed do eiusmodtempor incididunt ut labore

et dolore magna aliqua.

</div> </div> </div></div>

forum.depth

Page 109: Twig, el nuevo motor de plantillas de Drupal 8

Indentando los mensajes del foro<div class="indent"> <div class="indent"> <div class="indent"> <div class="indent"> Lorem ipsum dolor sit amet, consectetur adipisic

ingelit, sed do eiusmodtempor incididunt ut labore

et dolore magna aliqua.

</div> </div> </div></div>

forum.depth

sólo si depth es mayor que cero

Page 110: Twig, el nuevo motor de plantillas de Drupal 8

Indentando los mensajes del foro

{% for i in 1..forum.depth if forum.depth > 0 %} <div class="indent">

{% endfor %}

Page 111: Twig, el nuevo motor de plantillas de Drupal 8

El bucle FOR

{% for valor in coleccion if condicion %}

...

{% endfor %}

Page 112: Twig, el nuevo motor de plantillas de Drupal 8

El bucle FOR completo

{% for clave, valor in coleccion if condicion %} ...

{% else %}

...

{% endfor %}

Page 113: Twig, el nuevo motor de plantillas de Drupal 8

Los filtros para colecciones

{% for ... in coleccion|sort %}

{% for ... in coleccion|reverse %}

{% for ... in coleccion|merge(otra_coleccion) %}

{% for ... in coleccion|slice(1, 3) %}

Page 114: Twig, el nuevo motor de plantillas de Drupal 8

ESCAPANDO INFORMACIÓN

Page 115: Twig, el nuevo motor de plantillas de Drupal 8

Este código es peligroso

<p> <?php echo $descripcion; ?></p>

Page 116: Twig, el nuevo motor de plantillas de Drupal 8

Código mal formado

<p> <div> Lorem ipsum ... y no cierro el div</p>

Page 117: Twig, el nuevo motor de plantillas de Drupal 8

Código mal formado

<p> <div> Lorem ipsum ... y no cierro el div</p>

esto destroza tu página

Page 118: Twig, el nuevo motor de plantillas de Drupal 8

La solución PHP

<p><?php echo htmlspecialchars( $descripcion, ENT_QUOTES, 'UTF-8') ?></p>

Page 119: Twig, el nuevo motor de plantillas de Drupal 8

La solución Twig

<p> {{ descripcion }}</p>

Page 120: Twig, el nuevo motor de plantillas de Drupal 8

Twig escapa todo por defecto

<strong>Lorem ipsum</strong> dolor sit <em>amet</em>

{{ descripcion }}

&lt;strong&gt;Lorem ipsum&lt;/strong&gt; dolor sit &lt;em&gt;amet&lt;/em&gt;

Page 121: Twig, el nuevo motor de plantillas de Drupal 8

<h1>{{ titulo }}</h1><h1><?php echo $titulo; ?></h1>

La gran diferencia entre Twig y PHP

SEGUROPOR DEFECTO

INSEGUROPOR DEFECTO

PHPTWIG

Page 122: Twig, el nuevo motor de plantillas de Drupal 8

El filtro raw

{{ descripcion|raw }}

<strong>Lorem ipsum</strong> dolor sit <em>amet</em>

Page 123: Twig, el nuevo motor de plantillas de Drupal 8

El filtro escape

{{ descripcion|e }}

&lt;strong&gt;Lorem ipsum&lt;/strong&gt; dolor sit &lt;em&gt;amet&lt;/em&gt;

Page 124: Twig, el nuevo motor de plantillas de Drupal 8

Diferentes estrategias de escape

{{ descripcion|e('html') }}&lt;strong&gt;Lorem ipsum&lt;/strong&gt; dolor sit &lt;em&gt;amet&lt;/em&gt;

{{ descripcion|e('js') }}\x3Cstrong\x3ELorem\x20ipsum\x3C\x2Fstrong\x3E\x20dolor\x20sit\x20\x3Cem\x3Eamet\x3C\x2Fem\x3E

Page 125: Twig, el nuevo motor de plantillas de Drupal 8

BATCH

Page 126: Twig, el nuevo motor de plantillas de Drupal 8

Segmentando listas

1 2 3

4 5 6

7 8 9

Page 127: Twig, el nuevo motor de plantillas de Drupal 8

Utilizando bucles normales

<table>

{% for i in 1..9 %} <td>{{ i }}</td>

{% endfor %}</table>

Page 128: Twig, el nuevo motor de plantillas de Drupal 8

<table>

{% for i in 1..9 %}

{% if 0 == i % 3 %}<tr>{% endif %} <td>{{ i }}</td>

{% if 0 == i % 3 %}</tr>{% endif %}

{% endfor %}</table>

Utilizando bucles normales

Page 129: Twig, el nuevo motor de plantillas de Drupal 8

El filtro batch<table>

{% for fila in 1..9|batch(3) %} <tr>

{% for columna in fila %} <td> {{ columna }} </td>

{% endfor %} </tr>

{% endfor %}</table>

Page 130: Twig, el nuevo motor de plantillas de Drupal 8

El filtro batch<table>

{% for fila in 1..9|batch(3) %} <tr>

{% for columna in fila %} <td> {{ columna }} </td>

{% endfor %} </tr>

{% endfor %}</table>

saca los elementos de tres en tres

Page 131: Twig, el nuevo motor de plantillas de Drupal 8

Rellenando los huecos<table>

{% for fila in 1..7|batch(3, '-') %} <tr> {% for columna in fila %} <td> {{ columna }} </td> {% endfor %} </tr>

{% endfor %}</table>

Page 132: Twig, el nuevo motor de plantillas de Drupal 8

Rellenando los huecos<table>

{% for fila in 1..7|batch(3, '-') %} <tr> {% for columna in fila %} <td> {{ columna }} </td> {% endfor %} </tr>

{% endfor %}</table>

1 2 3

4 5 6

7 - -

Page 133: Twig, el nuevo motor de plantillas de Drupal 8

DEPURACIÓN

Page 134: Twig, el nuevo motor de plantillas de Drupal 8

DEPURACIÓN

EN DESARROLLOTODO ESTO PODRÍA CAMBIAR EN LA VERSIÓN ESTABLE DE DRUPAL 8!

Page 135: Twig, el nuevo motor de plantillas de Drupal 8

Mostrar el contenido de variables

{{ dump(variable) }}

{{ dump(variable1, variable2) }}

{{ dump() }}

Page 136: Twig, el nuevo motor de plantillas de Drupal 8

Mostrar el contenido de variables

{{ dump(variable) }}

{{ dump(variable1, variable2) }}

{{ dump() }} muestra TODAS las variables

Page 137: Twig, el nuevo motor de plantillas de Drupal 8

Activar la función dump()

// sites/default/settings.php$settings['twig_debug'] = true;

Page 138: Twig, el nuevo motor de plantillas de Drupal 8

Activar la función dump()

// sites/default/settings.php$settings['twig_debug'] = true;

twig_debug = false twig_debug = true

Page 139: Twig, el nuevo motor de plantillas de Drupal 8

Activar la función dump()

// sites/default/settings.php$settings['twig_debug'] = true;

twig_debug = false twig_debug = true

<!-- THEME DEBUG --><!-- CALL: theme('html') --><!-- FILE NAME SUGGESTIONS: [o] html--node.html.twig [o] html--node--.html.twig [o] html--node--1.html.twig [x] html.html.twig --><!-- BEGIN OUTPUT from 'core/modules/system/templates/html.html.twig' --><!DOCTYPE html><html ...

Page 140: Twig, el nuevo motor de plantillas de Drupal 8

Mejorando la depuración• dump( ) es muy útil, pero no deja de

ser un simple var_dump( ).

• Resulta muy difícil depurar variables complejas.

• Drupal 8 podría integrar el proyecto LadyBug.

Page 141: Twig, el nuevo motor de plantillas de Drupal 8

Raúl Fraile

github.com/raulfraile/Ladybug

LadyBugDepurando aplicaciones PHP como un profesional.

Page 142: Twig, el nuevo motor de plantillas de Drupal 8

Depurando con LadyBug$result = mysql_query('SELECT * FROM user', $conn);ladybug_dump($result);

Page 143: Twig, el nuevo motor de plantillas de Drupal 8

Depurando con LadyBug$var = new Foo();ladybug_dump($var);

Page 144: Twig, el nuevo motor de plantillas de Drupal 8

FRAGMENTOS DE PLANTILLAS

Page 145: Twig, el nuevo motor de plantillas de Drupal 8

Plantillas con fragmentos repetidos

Page 146: Twig, el nuevo motor de plantillas de Drupal 8

Plantillas con fragmentos repetidos

Page 147: Twig, el nuevo motor de plantillas de Drupal 8

Fragmento de código repetido{# anuncio.twig #}<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="..." data-ad-client="..." data-ad-slot="..."></ins><script> (adsbygoogle = window.adsbygoogle || []).push({});</script>

Page 148: Twig, el nuevo motor de plantillas de Drupal 8

Incluyendo un fragmento

...

{{ include('anuncio.twig') }}

...

Page 149: Twig, el nuevo motor de plantillas de Drupal 8

Fragmento de código repetido{# anuncio.twig #}<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle"

style="{{ ad.style }}"

data-ad-client="{{ ad.client }}"

data-ad-slot="{{ ad.slot }}"></ins>

<script> (adsbygoogle = window.adsbygoogle || []).push({});</script>

Page 150: Twig, el nuevo motor de plantillas de Drupal 8

Incluyendo un fragmento con variables

...

{{ include('anuncio.twig', { ... }) }}

...

Page 151: Twig, el nuevo motor de plantillas de Drupal 8

Incluyendo un fragmento con variables

...

{{ include('anuncio.twig', { ad: { 'style': '...', 'client': '...', 'slot': '...'}}) }}

...

Page 152: Twig, el nuevo motor de plantillas de Drupal 8

Fragmentos sin variables

{{ include( 'anuncio.twig', with_context = false) }}

{{ include( 'anuncio.twig', { ... }, with_context = false) }}

Page 153: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla con muchos fragmentos

Page 154: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla con muchos fragmentos

include

Page 155: Twig, el nuevo motor de plantillas de Drupal 8

HERENCIA DE PLANTILLAS

Page 156: Twig, el nuevo motor de plantillas de Drupal 8

plantilla padre

Page 157: Twig, el nuevo motor de plantillas de Drupal 8

plantilla padre igual para todas

las páginas

Page 158: Twig, el nuevo motor de plantillas de Drupal 8

plantilla padre

huecos

igual para todas las páginas

Page 159: Twig, el nuevo motor de plantillas de Drupal 8

plantillas hija

Herencia de plantillas

plantilla padre

Page 160: Twig, el nuevo motor de plantillas de Drupal 8

plantillas hija

Herencia de plantillas

plantilla padre

en Twig se llaman bloques

Page 161: Twig, el nuevo motor de plantillas de Drupal 8

Cómo funciona la herencia en Twig• Cada plantilla puede definir tantos

bloques como quiera.

• La herencia permite, pero no obliga, a rellenar los huecos.

• La plantilla padre puede rellenar sus huecos con contenido por defecto.

Page 162: Twig, el nuevo motor de plantillas de Drupal 8

Creando la plantilla padre.twig<header> ... </header>

<div class="row"> <div class="span3"> HUECO 1 </div> <div class="span6"> HUECO 2 </div> <div class="span3"> ... </div></div>

<footer> ... </footer>

Page 163: Twig, el nuevo motor de plantillas de Drupal 8

Creando la plantilla padre.twig<header> ... </header>

<div class="row"> <div class="span3"> side </div> <div class="span6"> main </div> <div class="span3"> ... </div></div>

<footer> ... </footer>

Page 164: Twig, el nuevo motor de plantillas de Drupal 8

Creando la plantilla padre.twig<header> ... </header>

<div class="row"> <div class="span3">

{% block side %} {% endblock %} </div> <div class="span6">

{% block main %} {% endblock %} </div> <div class="span3"> ... </div></div>

<footer> ... </footer>

Page 165: Twig, el nuevo motor de plantillas de Drupal 8

Creando la plantilla padre.twig<header> ... </header>

<div class="row"> <div class="span3">

{% block side %} {% endblock %} </div> <div class="span6">

{% block main %} {% endblock %} </div> <div class="span3"> ... </div></div>

<footer> ... </footer>

Page 166: Twig, el nuevo motor de plantillas de Drupal 8

Creando la plantilla padre.twig<header> ... </header>

<div class="row"> <div class="span3">

{% block side %} {% endblock %} </div> <div class="span6">

{% block main %} {% endblock %} </div> <div class="span3"> ... </div></div>

<footer> ... </footer>

los nombres NO llevan comillas

Page 167: Twig, el nuevo motor de plantillas de Drupal 8

Creando la plantilla hija.twig

{% extends 'padre.twig' %}

Page 168: Twig, el nuevo motor de plantillas de Drupal 8

Creando la plantilla hija.twig

{% extends 'padre.twig' %}

{% block main %} ...{% endblock %}

{% block side %} ...{% endblock %}

Page 169: Twig, el nuevo motor de plantillas de Drupal 8

plantilla hija

C D

plantilla padre

A B

Page 170: Twig, el nuevo motor de plantillas de Drupal 8

plantilla hija

<div>{% block uno %} A {% endblock %}</div>

<div>{% block dos %} B{% endblock %}</div>

C D

plantilla padre

A B

Page 171: Twig, el nuevo motor de plantillas de Drupal 8

plantilla hija

<div>{% block uno %} A {% endblock %}</div>

<div>{% block dos %} B{% endblock %}</div>

C D

{% extends 'padre.twig' %}{% block uno %} C {% endblock %}{% block dos %} D{% endblock %}

plantilla padre

A B

Page 172: Twig, el nuevo motor de plantillas de Drupal 8

plantilla hija

<div>{% block uno %} A {% endblock %}</div>

<div>{% block dos %} B{% endblock %}</div>

A D

plantilla padre

A B

Page 173: Twig, el nuevo motor de plantillas de Drupal 8

plantilla hija

<div>{% block uno %} A {% endblock %}</div>

<div>{% block dos %} B{% endblock %}</div>

A D

{% extends 'padre.twig' %}{% block dos %} D{% endblock %}

plantilla padre

A B

Page 174: Twig, el nuevo motor de plantillas de Drupal 8

plantilla padre plantilla hija

<div>{% block uno %} A {% endblock %}</div>

<div>{% block dos %} B{% endblock %}</div>

A BA

DC

Page 175: Twig, el nuevo motor de plantillas de Drupal 8

plantilla padre plantilla hija

<div>{% block uno %} A {% endblock %}</div>

<div>{% block dos %} B{% endblock %}</div>

A BA

D

{% extends 'padre.twig' %}{% block uno %} {{ parent() }} C {% endblock %}{% block dos %} D{% endblock %}

C

Page 176: Twig, el nuevo motor de plantillas de Drupal 8

plantilla padre plantilla hija

<div>{% block uno %} A {% endblock %}</div>

<div>{% block dos %} B{% endblock %}</div>

A BA

D

{% extends 'padre.twig' %}{% block uno %} {{ parent() }} C {% endblock %}{% block dos %} D{% endblock %}

C

Page 177: Twig, el nuevo motor de plantillas de Drupal 8

RENDIMIENTO

Page 178: Twig, el nuevo motor de plantillas de Drupal 8

esta es la parte más lenta de Twig

Page 179: Twig, el nuevo motor de plantillas de Drupal 8

Instalando la extensión de Twig

$ pear channel-discover pear.twig-project.org

$ pear install twig/CTwig

; php.iniextension=twig.so

Page 180: Twig, el nuevo motor de plantillas de Drupal 8

Instalando la extensión de Twig

+15%

SIN extensión CON extensión

Page 181: Twig, el nuevo motor de plantillas de Drupal 8

TERCERA PARTE

APLICANDO TWIG

Page 182: Twig, el nuevo motor de plantillas de Drupal 8

DISEÑANDO SITIOS COMPLEJOS

Page 183: Twig, el nuevo motor de plantillas de Drupal 8

Jerarquía de plantillas

layout.twig

pagina1.twig

pagina2.twig+

layout.twig

seccion1.twig

seccion2.twig+pagina1.twig

pagina2.twig+

Page 184: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>{% block title %}Lorem ipsum dolor.{% endblock %}</title> {% if block('description') != '' %} <meta name="description" content="{% block description %}{% endblock %}"> {% endif %} <link href="..." rel="stylesheet" type="text/css"> {% block head_css %}{% endblock %} {% block head_javascript %}{% endblock %} </head> ...

Page 185: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>{% block title %}Lorem ipsum dolor.{% endblock %}</title> {% if block('description') != '' %} <meta name="description" content="{% block description %}{% endblock %}"> {% endif %} <link href="..." rel="stylesheet" type="text/css"> {% block head_css %}{% endblock %} {% block head_javascript %}{% endblock %} </head> ...

Page 186: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>{% block title %}Lorem ipsum dolor.{% endblock %}</title> {% if block('description') != '' %} <meta name="description" content="{% block description %}{% endblock %}"> {% endif %} <link href="..." rel="stylesheet" type="text/css"> {% block head_css %}{% endblock %} {% block head_javascript %}{% endblock %} </head> ...

Page 187: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>{% block title %}Lorem ipsum dolor.{% endblock %}</title> {% if block('description') != '' %} <meta name="description" content="{% block description %}{% endblock %}"> {% endif %} <link href="..." rel="stylesheet" type="text/css"> {% block head_css %}{% endblock %} {% block head_javascript %}{% endblock %} </head> ...

Page 188: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla pagina1.twig

{% extends 'layout.twig' %}

{% block title %}Mi título{% endblock %}{% block description %} Lorem ipsum dolor sit amet.{% endblock %}

...

Page 189: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla pagina2.twig

{% extends 'layout.twig' %}

{% block title %}Otro título{% endblock %}{% block head_css %} <link href="/css/micrositio_especial.css" rel="stylesheet" type="text/css">{% endblock %}

...

Page 190: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<body id="{% block body_id %}{% endblock %}"> <div id="content">

{% block content %} <div id="main">

{% block main %}{% endblock %} </div>

<div id="side">

{% block side %}{% endblock %} </div>

{% endblock %} </div></body>

Page 191: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<body id="{% block body_id %}{% endblock %}"> <div id="content">

{% block content %} <div id="main">

{% block main %}{% endblock %} </div>

<div id="side">

{% block side %}{% endblock %} </div>

{% endblock %} </div></body>

Page 192: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<body id="{% block body_id %}{% endblock %}"> <div id="content">

{% block content %} <div id="main">

{% block main %}{% endblock %} </div>

<div id="side">

{% block side %}{% endblock %} </div>

{% endblock %} </div></body>

Page 193: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<body id="{% block body_id %}{% endblock %}"> <div id="content">

{% block content %} <div id="main">

{% block main %}{% endblock %} </div>

<div id="side">

{% block side %}{% endblock %} </div>

{% endblock %} </div></body>

Page 194: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla layout.twig<body id="{% block body_id %}{% endblock %}"> <div id="content">

{% block content %} <div id="main">

{% block main %}{% endblock %} </div>

<div id="side">

{% block side %}{% endblock %} </div>

{% endblock %} </div></body>

Page 195: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla pagina1.twig

{% extends 'layout.twig' %}{% block title %}Mi título{% endblock %}{% block description %}Lorem ipsum dolor sit amet.{% endblock %}

{% block main %} <h1>...</h1> <p>...</p>{% endblock %}

{% block side %} <ul>...</ul>{% endblock %}

Page 196: Twig, el nuevo motor de plantillas de Drupal 8

Plantilla pagina2.twig

{% extends 'layout.twig' %}{% block title %}Otro título{% endblock %}{% block head_css %} <link href="/css/micrositio_especial.css" rel="stylesheet" type="text/css">{% endblock %}

{% block content %} <div> ... </div>{% endblock %}

Page 197: Twig, el nuevo motor de plantillas de Drupal 8

CONCLUSIONES

Page 198: Twig, el nuevo motor de plantillas de Drupal 8

Conclusiones• Twig mejora tu productividad y hace

que tus plantillas sean seguras.

Page 199: Twig, el nuevo motor de plantillas de Drupal 8

Conclusiones• Twig mejora tu productividad y hace

que tus plantillas sean seguras.

• Drupal 8 utiliza actualmente el 10% de las posibilidades de Twig.

Page 200: Twig, el nuevo motor de plantillas de Drupal 8

Conclusiones• Twig mejora tu productividad y hace

que tus plantillas sean seguras.

• Drupal 8 utiliza actualmente el 10% de las posibilidades de Twig.

• Twig es la parte más sencilla y divertida de la symfonización de Drupal.

Page 201: Twig, el nuevo motor de plantillas de Drupal 8

REFERENCIAS

Page 202: Twig, el nuevo motor de plantillas de Drupal 8

Referencias• Documentación:

twig.sensiolabs.org

• Recursos sobre Drupal + Twig:drupal.org/node/2008464

Page 203: Twig, el nuevo motor de plantillas de Drupal 8

CONTACTO

Page 204: Twig, el nuevo motor de plantillas de Drupal 8

Contacto

Javier Eguiluz

javiereguiluz.com

twitter.com/javiereguiluz

github.com/javiereguiluz

linkedin.com/in/javiereguiluz

Page 205: Twig, el nuevo motor de plantillas de Drupal 8