SlideShare una empresa de Scribd logo
1 de 60
Descargar para leer sin conexión
Twig y otros «themas» en Drupal 8:
quiénes somos, de dónde venimos...
Quienes somos
Cristina
Chumillas
@chumillas
cristina.chumillas @ymbra.com

Pako Garcia
@pakmanlh

pako.garcia@ymbra.com

We are Drupal dreamers!
DISCLAIMER
●

No somos expertos D8

●

NO es una sesión de TWIG (solamente)

●

NADA está 100% cerrado

●

SÍ aprenderemos algo (o eso esperamos)
THEMERS ARE WELLCOME
●

Somos Drupaleros

●

Somos diseñadores

●

Somos themers

●

No somos desarrolladores

●

No somos sysadmins
Themers don't care about...
●

Caching

●

OOP

●

PHP

●

MySQL, MongoDB

●

SOLID
Themers love...
●

Marcado semántico

●

HTML5, SMACSS

●

SASS, compass, CSS3

●

Modernizr, JQueryUI

●

RWD

●

Ponys
Themers hate...
●

DIVITIS

●

Acumulación de classes (estilos)

●

...

●

Drupal ?¿
Themers hate...
●

DIVITIS

●

Acumulación de classes (estilos)

●

...

●

Drupal ?¿

●

WE ARE DRUPAL DREAMERS
Drupal 8 loves themers!!
●

Configuración Archivo .yaml

●

CSS (Arquitectura, nomenclatura, etc)

●

Inspector de plantillas / variables
incorporado.

●

Mismas plantillas front y back

●

...
Archivo de configuración
D7

my_theme.info

name = Bartik
description = A flexible,
Recolorable ...
package = Core
version = VERSION
core = 7.x
stylesheets[all][] = css/layout.css
stylesheets[all][] = css/style.css
regions[header] = Header
regions[help] = Help
regions[page_top] = Page top
regions[page_bottom] = Page bottom
regions[highlighted] = Highlighted
...
settings[shortcut_module_link] = 0

D8

my_theme.info.yaml

name: Bartik
type: theme
description: 'A flexible, recol...
package: Core
version: VERSION
core: 8.x
stylesheets:
all:
- css/layout.css
print:
- css/print.css
ckeditor_stylesheets:
- css/ckeditor-iframe.css
regions:
header: Header
help: Help
settings:
shortcut_module_link: '0'
Archivo de configuración
D7

my_theme.info

; Add a new CSS file:
stylesheets[all][] = layout.css
; Override a CSS file:
; WARNING: The file is moved from its original position to the
;
end of the CSS files stack! Use the PHP override code below.
stylesheets[all][] = system.theme.css
; Remove a module CSS file by *adding* it but without supplying
; the actual file in the filesystem:
stylesheets[all][] = node.css
Archivo de configuración
D7

template.php
<?php
/**
* Implements hook_css_alter().
*/
function mytheme_css_alter(&$css) {
// Override.
if (isset($css['core/misc/vertical-tabs.css'])) {
$css['core/misc/vertical-tabs.css']['data'] =
drupal_get_path('theme', 'mytheme') . '/vertical-tabs.css';
// Remove.
unset($css[drupal_get_path('module','system').'/system.theme.css']);
}
}
?>
Archivo de configuración
D8

mytheme.info.yml
# Add a new CSS file:
stylesheets:
all:
- layout.css
# Override a CSS file:
stylesheets-override:
- system.theme.css
# Remove a CSS file:
stylesheets-remove:
- node.css

http://dgo.to/1876600
Organización archivos CSS
Drupal 8 sigue la guía de estilo SMACSS
para categorizar sus reglas CSS:
●

●

●

●

●

Base — CSS reset.
Layout — estructura general, grid
systems.
Component — elementos UI reusables.
State — estilos que alteran los
elementos según la interacción.
Theme — estilos visuales (“look-andfeel”) de los componentes.
Organización archivos CSS
Base
●

Uso de normalize.css
http://necolas.github.io/normalize.css/

●

Y seguimiento de Boilerplate
http://html5boilerplate.com/
Organización archivos CSS
Layout – Component - State
●

*.module.css

●

*.admin.module.css

●

Borrar referencias a tags (li.first)

●

Sustituir # por .

●

Archivos -rtl.css. separados

●

Uso de selectores descriptivos

●

Reducir «supuestos»
Organización archivos CSS
●

Example Layout – Component - State:

<div class="progress">
<label class="label">Installing Node Module</label>
<div class="progress__track">
<div class="progress__bar js-progress-percent"
style="width: 63%"></div>
</div>
<div class="progress__description">
<div class="l-pull">Installed 15 of 24 modules</div>
<strong class="l-push">63%</strong>
</div>
<button class="progress__cancel" href="#"
title="cancel">cancel</button>
</div>
Organización archivos CSS
●

Example Layout – Component - State:
/**
* Progress Bar component
*/
.progress {}
.progress__track {}
.progress__bar {}
.progress__description {}
.progress__cancel {}
.progress__cancel:focus,
.progress__cancel:hover {}
Organización archivos CSS
●

Example Layout – Component - State:

<div class="progress progress--small">
<label class="label label--small">Uploading syndey-operahouse-sunset.jpg</label>
<div class="progress__track">
<div class="progress__bar" style="width: 29%"></div>
</div>
<div class="progress__description">
<div class="l-pull">Uploaded 221 of 762KB</div>
<strong class="l-push">29%</strong>
</div>
<a class="progress__cancel" href="#" title="cancel"><span
class="visually-hidden">cancel</span></a>
</div>
Organización archivos CSS
●

Example Layout – Component - State:
/**
* Progress Bar small variant
*/
.progress--small .progress__track {}
.progress--small .progress__bar {}
.progress--small .progress__cancel {}
Inspección de plantillas
●

Gracias a Twig tenemos un DEBUG de código:

●

Editando settings.php
$settings['twig_debug'] = TRUE;

●

Obteniendo automáticamente:
<!-- THEME DEBUG -->
<!-- CALL: theme('node') -->
<!-- FILE NAME SUGGESTIONS:
* node--article.html.twig
* node--2.html.twig
x node.html.twig
-->
<!-- BEGIN OUTPUT from
'core/modules/node/templates/node.html.twig' -->
...
<!-- END OUTPUT from
'core/modules/node/templates/node.html.twig' -->
Inspección de variables
●

Gracias a Twig tenemos un DEBUG de código:

●

Editando settings.php
$settings['twig_debug'] = TRUE;

●

Podemos usar:

{{ dump(title) }}

Obteniendo un resultado como krumo
●

BYE BYE DEVEL_THEMER module!
Beneficios inherentes de TWIG

AL NO SER PHP:
●

Podemos usar las mismas plantillas desde el
BACK (PHP) como desde el FRONT (backbone,
underscore, ...).
https://github.com/schmittjoh/twig.js

●

Las plantillas son interpretables (y editables)
desde los navegadores. ¿ Contemplate ?
Puntos flojos de Drupal 7
●

Sintaxis

●

Inconsistencia

●

Complejidad

●

Redundancia

●

Seguridad
Puntos flojos de D7: Sintaxis
<div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?>
clearfix"<?php print $attributes; ?>>
<?php print render($title_prefix); ?>
<?php if (!$page): ?>
<h2<?php print $title_attributes; ?>>
<a href="<?php print $node_url; ?>"><?php print $title; ?></a>
</h2>
<?php endif; ?>
<?php print render($title_suffix); ?>

<?php if ($display_submitted): ?>
<div class="meta submitted">
<?php print $user_picture; ?>
<?php print $submitted; ?>
</div>
<?php endif; ?>
<div class="content clearfix"<?php print $content_attributes; ?>>
<?php
// We hide the comments and links now so that we can render them later
hide($content['comments']);
...

D7

node.tpl.php
Puntos flojos de D7: Sintaxis
Puntos flojos de D7: Sintaxis
<article id="node-{{ node.id }}" class="{{ attributes.class}}
clearfix"{{ attributes }} role="article">
<header>
{{ title_prefix }}
{% if not page %}
<h2{{ title_attributes }}>
<a href="{{ node_url }}">{{ label }}</a>
</h2>
{% endif %}
{{ title_suffix }}
{% if display_submitted %}
<div class="meta submitted">
{{ user_picture }}
{{ submitted }}
</div>
{% endif %}
</header>
...

D7

node.tpl.php
Puntos flojos de D7: Sintaxis

Una única manera, mucho más fácil y reducida!
●

Mostrar variables: {{ title }}

●

Procesar: {% if not page %}

●

Comentar: {# That's just comment #}
Puntos flojos de D7: Inconsistencia
Si queremos modificar el marcado en Drupal
7 tenemos dos opciones:
●

Mediante TPL

●

Mediante funciones theme()
Puntos flojos de D7: Inconsistencia
D7

node.tpl.php

<div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?>
clearfix"<?php print $attributes; ?>>
<?php print render($title_prefix); ?>
<?php if (!$page): ?>
<h2<?php print $title_attributes; ?>>
<a href="<?php print $node_url; ?>"><?php print $title; ?></a>
</h2>
<?php endif; ?>
<?php print render($title_suffix); ?>

<?php if ($display_submitted): ?>
<div class="meta submitted">
<?php print $user_picture; ?>
<?php print $submitted; ?>
</div>
<?php endif; ?>
<div class="content clearfix"<?php print $content_attributes; ?>>
<?php
// We hide the comments and links now so that we can render them later.
hide($content['comments']);
...
Puntos flojos de D7: Inconsistencia
D7

node.pages.inc

función theme_node_preview()
Puntos flojos de D7: Inconsistencia

Si no sabemos PHP ...
Puntos flojos de D7: Inconsistencia

En Drupal 8 *solamente se usarán plantillas!

* A día de hoy se está trabajando en ello
Puntos flojos de D7: Inconsistencia
Render arrays VS theme functions
Puntos flojos de D7: Inconsistencia
En Drupal 8 *solamente se usarán
render_arrays

* A día de hoy se está trabajando en ello
Puntos flojos de D7: Complejidad
Puntos flojos de D7: Complejidad
Puntos flojos de D7: Complejidad

x
x
x x
x

x

x
Puntos flojos de D7: Complejidad

En Drupal 8 se trata de reducir esta
complejidad:
–
–

–

Pensando en casos de uso
Pensando en lo que el usuario (themer)
necesita.

Meta Issue: http://dgo.to/2004872
Puntos flojos de D7: Complejidad
¿De qué manera?
–

1: Build the theme registry

–

2: Callback suggestions alter

–

3: Prepare variables

–

4: Alter variables

–

5: Render output

–

Meta Issue: http://dgo.to/2004872
Puntos flojos de D7: Redundancia
Cuando generamos varios TPL repetimos líneas
de código:
●

node--type.tpl.php

●

node--article.tpl.php

●

node--book.tpl.php

●

node--whatever.tpl.php

●

...
Puntos flojos de D7: Redundancia
Twig permite extender una plantilla,
heredando sus líneas y modificando
solamente las diferencias.
Puntos flojos de D7: Redundancia

Ejemplo comment-wrapper.html.twig
<section id="comments" class="{{ attributes.class }}"{{ attributes }}>
{% if comments %}
{% codeblock title %}
{{ title.prefix }}
<h2 class="title">{{ 'Comments' | t }}</h2>
{{ title.suffix }}
{% endcodeblock %}
{{ comments }}
{% endif %}
{% if form %}
<h2 class="title comment-form">{{ 'Add new comment' | t }}</h2>
{{ form }}
{% endif %}
</section>
Puntos flojos de D7: Redundancia
Ejemplo de otra plantilla
(comment-wrapper-forum.html.twig)
extendiendo la anterior.
{% extends "comment-wrapper.html.twig" %}
{% codeblock title %}
{# code block here is empty to prevent title from showing on forums #}
{% endcodeblock %}
Puntos flojos de D7: Redundancia
Existe un problema «parecido »con las
funciones actuales de theme:
Puntos flojos de D7: Redundancia
Solución D8: Render arrays con herencia
de sugerencias de templates.
Puntos flojos de D7: Seguridad

Posibilidad de usar PHP en las plantillas para:
●

Imprimir cualquier tipo de valor...
<?php print $node->field_whatever['und'][0]['value']; ?>

●

Realizar llamadas MySQL...
<?php db_query(“DROP TABLE {node}”); ?>

...
Puntos flojos de D7: Seguridad

Solución D8: usar Twig para tratar la
información en la presentación y sanear
previamente las variables para restringir los
posibles datos a mostrar:
<h3>{{ node.field_whatever.0 }}</h3>
Mejoras en la API de D8
Nuevos theme hooks

hook
theme

hook

hook

theme
suggestions

theme
suggestions
alter

hook
prepare

default
template

hook
prepare
alter
(preprocess)

drupal
render
template
override

hook
theme
registry

theme
registry
alter

* Todavía en progreso http://dgo.to/2004872
Nuevos theme hooks
NUEVO! hook_theme_suggestions()
hook
theme

hook

hook

theme
suggestions

theme
suggestions
alter

hook
prepare

default
template

hook
prepare
alter
(preprocess)

drupal
render
template
override

hook
theme
registry

theme
registry
alter

* Todavía en progreso http://dgo.to/2004872
Nuevos theme hooks
NUEVO! hook_theme_suggestions_alter()
hook
theme

hook

hook

theme
suggestions

theme
suggestions
alter

hook
prepare

default
template

hook
prepare
alter
(preprocess)

drupal
render
template
override

hook
theme
registry

theme
registry
alter

* Todavía en progreso http://dgo.to/2004872
Nuevos theme hooks
NUEVO! hook_theme_suggestions_alter()
●

Antes:

<?php
/**
* Implements hook_preprocess_HOOK() for node templates.
*/
function MYTHEME_preprocess_node($variables) {
$variables['theme_hook_suggestion'] = 'node__' . 'my_suggestion';
}
?>
●

Después:
<?php
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function MYTHEME_theme_suggestions_node_alter(array &$suggestions, array
$variables) {
$suggestions[] = 'node__' . 'my_suggestion';
}
?>
Nuevos theme hooks
NUEVO! hook_prepare() o
hook_theme_prepare_TEMPLATE_SUGGESTION()
hook
theme

hook

hook

theme
suggestions

theme
suggestions
alter

hook
prepare

hook
prepare
alter
(preprocess)

default
template

drupal
render
template
override

hook
theme
registry

theme
registry
alter

* Todavía en progreso http://dgo.to/2004872
Nuevos theme hooks
NUEVO! hook_prepare_alter() o
hook_theme_prepare_TEMPLATE_SUGGESTION_alter()
hook
theme

hook

hook

theme
suggestions

theme
suggestions
alter

hook
prepare

default
template

hook
prepare
alter
(preprocess)

drupal
render
template
override

hook
theme
registry

theme
registry
alter

Parecido a
hook_form_alter and hook_form_FORM_ID_alter
●

*Todavía en progreso
En D8 todo es «renderizable»
●

●

●

Todo es una Array hasta el final.
Se evita tener que bucear (regexp) en variables
de tipo string para alterar el marcado.
El marcado está en las plantillas SOLAMENTE
Traducción de cadenas en plantillas
●

●

http://dgo.to/2047135
Implementación de t() y format_plural() con
contexto incluido:

{% set count = comments|length %}
{% trans %}
{{ count }} comment was deleted successfully.
{% plural count %}
{{ count }} comments were deleted successfully.
{% endtrans %}

{% trans with {'context': 'Long month name', 'langcode': 'fr'} %}
January
{% endtrans %}
«Theme Component Library»
●

●

Crear un set «standard» de plantillas base para
todos los elementos comunes.
Ahora mismo es una lista de deseos
http://dgo.to/1804488
Conclusiones
●

Con D8 los themers seremos felices (¡al
fin!)

●

...

●

We need Drupal Heros!

●

http://dgo.to/1921610

●

http://dgo.to/1757550

●

Ask to @rteijeiro
¡Gracias!
¿Preguntas?
Cristina
Chumillas
@chumillas
cristina.chumillas @ymbra.com

Pako Garcia
@pakmanlh

pako.garcia@ymbra.com

Más contenido relacionado

La actualidad más candente

Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosGeorge Navarro Gomez
 
Arquitectura de proyectos Drupal
Arquitectura de proyectos DrupalArquitectura de proyectos Drupal
Arquitectura de proyectos DrupalYmbra
 
Desarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con FeaturesDesarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con FeaturesYmbra
 
Metodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con DrupalMetodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con DrupalRuben Teijeiro
 
HTML5, CSS3, Jquery y Boostrap
HTML5, CSS3, Jquery y BoostrapHTML5, CSS3, Jquery y Boostrap
HTML5, CSS3, Jquery y BoostrapAlex Vogager
 

La actualidad más candente (7)

Semana 3 Maquetación CSS
Semana 3   Maquetación CSSSemana 3   Maquetación CSS
Semana 3 Maquetación CSS
 
Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales Conceptos
 
Arquitectura de proyectos Drupal
Arquitectura de proyectos DrupalArquitectura de proyectos Drupal
Arquitectura de proyectos Drupal
 
Desarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con FeaturesDesarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con Features
 
Semana 4 Estructura y componentes SPA
Semana 4  Estructura y componentes SPASemana 4  Estructura y componentes SPA
Semana 4 Estructura y componentes SPA
 
Metodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con DrupalMetodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con Drupal
 
HTML5, CSS3, Jquery y Boostrap
HTML5, CSS3, Jquery y BoostrapHTML5, CSS3, Jquery y Boostrap
HTML5, CSS3, Jquery y Boostrap
 

Similar a Twig y otros "themas" en Drupal 8

Taller de Maquetación Web
Taller de Maquetación WebTaller de Maquetación Web
Taller de Maquetación WebBruno Garcia
 
Taller de Maquetacion web | Jorge Callalle Torres
Taller de Maquetacion web | Jorge Callalle TorresTaller de Maquetacion web | Jorge Callalle Torres
Taller de Maquetacion web | Jorge Callalle TorresJorge Luis Callalle Torres
 
ABC theming en Drupal7
ABC theming en Drupal7ABC theming en Drupal7
ABC theming en Drupal7Jorge Ram
 
#JoomlaIO - Desarrollo de Plantillas para Joomla!
#JoomlaIO - Desarrollo de Plantillas para Joomla!#JoomlaIO - Desarrollo de Plantillas para Joomla!
#JoomlaIO - Desarrollo de Plantillas para Joomla!SergioIglesiasNET
 
Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8Acquia
 
Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...
Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...
Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...SergioIglesiasNET
 
Web corporativa con Drupal
Web corporativa con DrupalWeb corporativa con Drupal
Web corporativa con Drupaleduvega
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPHP Vigo
 
Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018
Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018
Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018nacho mascort
 
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Atenea tech
 
El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2ferdinand13
 
Introducción a Foundation 5
Introducción a Foundation 5Introducción a Foundation 5
Introducción a Foundation 5Cycle-IT
 
Introducción a Foundation 5
Introducción a Foundation 5Introducción a Foundation 5
Introducción a Foundation 5Cycle-IT
 
Frameworks para Php Adwa
Frameworks para Php AdwaFrameworks para Php Adwa
Frameworks para Php AdwaAndres Karp
 
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidadDrupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidadIván Campaña Naranjo
 
Metodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con DrupalMetodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con DrupalRojomorgan
 
Los mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupalLos mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupalSiteGround España
 

Similar a Twig y otros "themas" en Drupal 8 (20)

Taller de Maquetación Web
Taller de Maquetación WebTaller de Maquetación Web
Taller de Maquetación Web
 
Taller de Maquetacion web | Jorge Callalle Torres
Taller de Maquetacion web | Jorge Callalle TorresTaller de Maquetacion web | Jorge Callalle Torres
Taller de Maquetacion web | Jorge Callalle Torres
 
ABC theming en Drupal7
ABC theming en Drupal7ABC theming en Drupal7
ABC theming en Drupal7
 
#JoomlaIO - Desarrollo de Plantillas para Joomla!
#JoomlaIO - Desarrollo de Plantillas para Joomla!#JoomlaIO - Desarrollo de Plantillas para Joomla!
#JoomlaIO - Desarrollo de Plantillas para Joomla!
 
Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8
 
Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...
Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...
Joomla!Day 2013 España - Taller de Desarrollo de Plantillas Joomla! - Sergio ...
 
Web corporativa con Drupal
Web corporativa con DrupalWeb corporativa con Drupal
Web corporativa con Drupal
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigo
 
Python scraping
Python scrapingPython scraping
Python scraping
 
Semana 2 Configuración entorno de desarrollo
Semana 2   Configuración entorno de desarrolloSemana 2   Configuración entorno de desarrollo
Semana 2 Configuración entorno de desarrollo
 
Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018
Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018
Scraping avanzado o Cómo hacer de internet tu base de datos #seoplus2018
 
Drupal Sitebuilding 101
Drupal Sitebuilding 101Drupal Sitebuilding 101
Drupal Sitebuilding 101
 
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012
 
El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2
 
Introducción a Foundation 5
Introducción a Foundation 5Introducción a Foundation 5
Introducción a Foundation 5
 
Introducción a Foundation 5
Introducción a Foundation 5Introducción a Foundation 5
Introducción a Foundation 5
 
Frameworks para Php Adwa
Frameworks para Php AdwaFrameworks para Php Adwa
Frameworks para Php Adwa
 
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidadDrupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
 
Metodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con DrupalMetodologia de Trabajo en Proyectos con Drupal
Metodologia de Trabajo en Proyectos con Drupal
 
Los mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupalLos mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupal
 

Último

Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilJuanGallardo438714
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxlosdiosesmanzaneros
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 

Último (15)

Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 

Twig y otros "themas" en Drupal 8

  • 1. Twig y otros «themas» en Drupal 8: quiénes somos, de dónde venimos...
  • 2. Quienes somos Cristina Chumillas @chumillas cristina.chumillas @ymbra.com Pako Garcia @pakmanlh pako.garcia@ymbra.com We are Drupal dreamers!
  • 3. DISCLAIMER ● No somos expertos D8 ● NO es una sesión de TWIG (solamente) ● NADA está 100% cerrado ● SÍ aprenderemos algo (o eso esperamos)
  • 4. THEMERS ARE WELLCOME ● Somos Drupaleros ● Somos diseñadores ● Somos themers ● No somos desarrolladores ● No somos sysadmins
  • 5. Themers don't care about... ● Caching ● OOP ● PHP ● MySQL, MongoDB ● SOLID
  • 6. Themers love... ● Marcado semántico ● HTML5, SMACSS ● SASS, compass, CSS3 ● Modernizr, JQueryUI ● RWD ● Ponys
  • 7. Themers hate... ● DIVITIS ● Acumulación de classes (estilos) ● ... ● Drupal ?¿
  • 8. Themers hate... ● DIVITIS ● Acumulación de classes (estilos) ● ... ● Drupal ?¿ ● WE ARE DRUPAL DREAMERS
  • 9. Drupal 8 loves themers!! ● Configuración Archivo .yaml ● CSS (Arquitectura, nomenclatura, etc) ● Inspector de plantillas / variables incorporado. ● Mismas plantillas front y back ● ...
  • 10. Archivo de configuración D7 my_theme.info name = Bartik description = A flexible, Recolorable ... package = Core version = VERSION core = 7.x stylesheets[all][] = css/layout.css stylesheets[all][] = css/style.css regions[header] = Header regions[help] = Help regions[page_top] = Page top regions[page_bottom] = Page bottom regions[highlighted] = Highlighted ... settings[shortcut_module_link] = 0 D8 my_theme.info.yaml name: Bartik type: theme description: 'A flexible, recol... package: Core version: VERSION core: 8.x stylesheets: all: - css/layout.css print: - css/print.css ckeditor_stylesheets: - css/ckeditor-iframe.css regions: header: Header help: Help settings: shortcut_module_link: '0'
  • 11. Archivo de configuración D7 my_theme.info ; Add a new CSS file: stylesheets[all][] = layout.css ; Override a CSS file: ; WARNING: The file is moved from its original position to the ; end of the CSS files stack! Use the PHP override code below. stylesheets[all][] = system.theme.css ; Remove a module CSS file by *adding* it but without supplying ; the actual file in the filesystem: stylesheets[all][] = node.css
  • 12. Archivo de configuración D7 template.php <?php /** * Implements hook_css_alter(). */ function mytheme_css_alter(&$css) { // Override. if (isset($css['core/misc/vertical-tabs.css'])) { $css['core/misc/vertical-tabs.css']['data'] = drupal_get_path('theme', 'mytheme') . '/vertical-tabs.css'; // Remove. unset($css[drupal_get_path('module','system').'/system.theme.css']); } } ?>
  • 13. Archivo de configuración D8 mytheme.info.yml # Add a new CSS file: stylesheets: all: - layout.css # Override a CSS file: stylesheets-override: - system.theme.css # Remove a CSS file: stylesheets-remove: - node.css http://dgo.to/1876600
  • 14. Organización archivos CSS Drupal 8 sigue la guía de estilo SMACSS para categorizar sus reglas CSS: ● ● ● ● ● Base — CSS reset. Layout — estructura general, grid systems. Component — elementos UI reusables. State — estilos que alteran los elementos según la interacción. Theme — estilos visuales (“look-andfeel”) de los componentes.
  • 15. Organización archivos CSS Base ● Uso de normalize.css http://necolas.github.io/normalize.css/ ● Y seguimiento de Boilerplate http://html5boilerplate.com/
  • 16. Organización archivos CSS Layout – Component - State ● *.module.css ● *.admin.module.css ● Borrar referencias a tags (li.first) ● Sustituir # por . ● Archivos -rtl.css. separados ● Uso de selectores descriptivos ● Reducir «supuestos»
  • 17. Organización archivos CSS ● Example Layout – Component - State: <div class="progress"> <label class="label">Installing Node Module</label> <div class="progress__track"> <div class="progress__bar js-progress-percent" style="width: 63%"></div> </div> <div class="progress__description"> <div class="l-pull">Installed 15 of 24 modules</div> <strong class="l-push">63%</strong> </div> <button class="progress__cancel" href="#" title="cancel">cancel</button> </div>
  • 18. Organización archivos CSS ● Example Layout – Component - State: /** * Progress Bar component */ .progress {} .progress__track {} .progress__bar {} .progress__description {} .progress__cancel {} .progress__cancel:focus, .progress__cancel:hover {}
  • 19. Organización archivos CSS ● Example Layout – Component - State: <div class="progress progress--small"> <label class="label label--small">Uploading syndey-operahouse-sunset.jpg</label> <div class="progress__track"> <div class="progress__bar" style="width: 29%"></div> </div> <div class="progress__description"> <div class="l-pull">Uploaded 221 of 762KB</div> <strong class="l-push">29%</strong> </div> <a class="progress__cancel" href="#" title="cancel"><span class="visually-hidden">cancel</span></a> </div>
  • 20. Organización archivos CSS ● Example Layout – Component - State: /** * Progress Bar small variant */ .progress--small .progress__track {} .progress--small .progress__bar {} .progress--small .progress__cancel {}
  • 21. Inspección de plantillas ● Gracias a Twig tenemos un DEBUG de código: ● Editando settings.php $settings['twig_debug'] = TRUE; ● Obteniendo automáticamente: <!-- THEME DEBUG --> <!-- CALL: theme('node') --> <!-- FILE NAME SUGGESTIONS: * node--article.html.twig * node--2.html.twig x node.html.twig --> <!-- BEGIN OUTPUT from 'core/modules/node/templates/node.html.twig' --> ... <!-- END OUTPUT from 'core/modules/node/templates/node.html.twig' -->
  • 22. Inspección de variables ● Gracias a Twig tenemos un DEBUG de código: ● Editando settings.php $settings['twig_debug'] = TRUE; ● Podemos usar: {{ dump(title) }} Obteniendo un resultado como krumo ● BYE BYE DEVEL_THEMER module!
  • 23. Beneficios inherentes de TWIG AL NO SER PHP: ● Podemos usar las mismas plantillas desde el BACK (PHP) como desde el FRONT (backbone, underscore, ...). https://github.com/schmittjoh/twig.js ● Las plantillas son interpretables (y editables) desde los navegadores. ¿ Contemplate ?
  • 24. Puntos flojos de Drupal 7 ● Sintaxis ● Inconsistencia ● Complejidad ● Redundancia ● Seguridad
  • 25. Puntos flojos de D7: Sintaxis <div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>> <?php print render($title_prefix); ?> <?php if (!$page): ?> <h2<?php print $title_attributes; ?>> <a href="<?php print $node_url; ?>"><?php print $title; ?></a> </h2> <?php endif; ?> <?php print render($title_suffix); ?> <?php if ($display_submitted): ?> <div class="meta submitted"> <?php print $user_picture; ?> <?php print $submitted; ?> </div> <?php endif; ?> <div class="content clearfix"<?php print $content_attributes; ?>> <?php // We hide the comments and links now so that we can render them later hide($content['comments']); ... D7 node.tpl.php
  • 26. Puntos flojos de D7: Sintaxis
  • 27. Puntos flojos de D7: Sintaxis <article id="node-{{ node.id }}" class="{{ attributes.class}} clearfix"{{ attributes }} role="article"> <header> {{ title_prefix }} {% if not page %} <h2{{ title_attributes }}> <a href="{{ node_url }}">{{ label }}</a> </h2> {% endif %} {{ title_suffix }} {% if display_submitted %} <div class="meta submitted"> {{ user_picture }} {{ submitted }} </div> {% endif %} </header> ... D7 node.tpl.php
  • 28. Puntos flojos de D7: Sintaxis Una única manera, mucho más fácil y reducida! ● Mostrar variables: {{ title }} ● Procesar: {% if not page %} ● Comentar: {# That's just comment #}
  • 29. Puntos flojos de D7: Inconsistencia Si queremos modificar el marcado en Drupal 7 tenemos dos opciones: ● Mediante TPL ● Mediante funciones theme()
  • 30. Puntos flojos de D7: Inconsistencia D7 node.tpl.php <div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>> <?php print render($title_prefix); ?> <?php if (!$page): ?> <h2<?php print $title_attributes; ?>> <a href="<?php print $node_url; ?>"><?php print $title; ?></a> </h2> <?php endif; ?> <?php print render($title_suffix); ?> <?php if ($display_submitted): ?> <div class="meta submitted"> <?php print $user_picture; ?> <?php print $submitted; ?> </div> <?php endif; ?> <div class="content clearfix"<?php print $content_attributes; ?>> <?php // We hide the comments and links now so that we can render them later. hide($content['comments']); ...
  • 31. Puntos flojos de D7: Inconsistencia D7 node.pages.inc función theme_node_preview()
  • 32. Puntos flojos de D7: Inconsistencia Si no sabemos PHP ...
  • 33. Puntos flojos de D7: Inconsistencia En Drupal 8 *solamente se usarán plantillas! * A día de hoy se está trabajando en ello
  • 34. Puntos flojos de D7: Inconsistencia Render arrays VS theme functions
  • 35. Puntos flojos de D7: Inconsistencia En Drupal 8 *solamente se usarán render_arrays * A día de hoy se está trabajando en ello
  • 36. Puntos flojos de D7: Complejidad
  • 37. Puntos flojos de D7: Complejidad
  • 38. Puntos flojos de D7: Complejidad x x x x x x x
  • 39. Puntos flojos de D7: Complejidad En Drupal 8 se trata de reducir esta complejidad: – – – Pensando en casos de uso Pensando en lo que el usuario (themer) necesita. Meta Issue: http://dgo.to/2004872
  • 40. Puntos flojos de D7: Complejidad ¿De qué manera? – 1: Build the theme registry – 2: Callback suggestions alter – 3: Prepare variables – 4: Alter variables – 5: Render output – Meta Issue: http://dgo.to/2004872
  • 41. Puntos flojos de D7: Redundancia Cuando generamos varios TPL repetimos líneas de código: ● node--type.tpl.php ● node--article.tpl.php ● node--book.tpl.php ● node--whatever.tpl.php ● ...
  • 42. Puntos flojos de D7: Redundancia Twig permite extender una plantilla, heredando sus líneas y modificando solamente las diferencias.
  • 43. Puntos flojos de D7: Redundancia Ejemplo comment-wrapper.html.twig <section id="comments" class="{{ attributes.class }}"{{ attributes }}> {% if comments %} {% codeblock title %} {{ title.prefix }} <h2 class="title">{{ 'Comments' | t }}</h2> {{ title.suffix }} {% endcodeblock %} {{ comments }} {% endif %} {% if form %} <h2 class="title comment-form">{{ 'Add new comment' | t }}</h2> {{ form }} {% endif %} </section>
  • 44. Puntos flojos de D7: Redundancia Ejemplo de otra plantilla (comment-wrapper-forum.html.twig) extendiendo la anterior. {% extends "comment-wrapper.html.twig" %} {% codeblock title %} {# code block here is empty to prevent title from showing on forums #} {% endcodeblock %}
  • 45. Puntos flojos de D7: Redundancia Existe un problema «parecido »con las funciones actuales de theme:
  • 46. Puntos flojos de D7: Redundancia Solución D8: Render arrays con herencia de sugerencias de templates.
  • 47. Puntos flojos de D7: Seguridad Posibilidad de usar PHP en las plantillas para: ● Imprimir cualquier tipo de valor... <?php print $node->field_whatever['und'][0]['value']; ?> ● Realizar llamadas MySQL... <?php db_query(“DROP TABLE {node}”); ?> ...
  • 48. Puntos flojos de D7: Seguridad Solución D8: usar Twig para tratar la información en la presentación y sanear previamente las variables para restringir los posibles datos a mostrar: <h3>{{ node.field_whatever.0 }}</h3>
  • 49. Mejoras en la API de D8
  • 51. Nuevos theme hooks NUEVO! hook_theme_suggestions() hook theme hook hook theme suggestions theme suggestions alter hook prepare default template hook prepare alter (preprocess) drupal render template override hook theme registry theme registry alter * Todavía en progreso http://dgo.to/2004872
  • 52. Nuevos theme hooks NUEVO! hook_theme_suggestions_alter() hook theme hook hook theme suggestions theme suggestions alter hook prepare default template hook prepare alter (preprocess) drupal render template override hook theme registry theme registry alter * Todavía en progreso http://dgo.to/2004872
  • 53. Nuevos theme hooks NUEVO! hook_theme_suggestions_alter() ● Antes: <?php /** * Implements hook_preprocess_HOOK() for node templates. */ function MYTHEME_preprocess_node($variables) { $variables['theme_hook_suggestion'] = 'node__' . 'my_suggestion'; } ?> ● Después: <?php /** * Implements hook_theme_suggestions_HOOK_alter(). */ function MYTHEME_theme_suggestions_node_alter(array &$suggestions, array $variables) { $suggestions[] = 'node__' . 'my_suggestion'; } ?>
  • 54. Nuevos theme hooks NUEVO! hook_prepare() o hook_theme_prepare_TEMPLATE_SUGGESTION() hook theme hook hook theme suggestions theme suggestions alter hook prepare hook prepare alter (preprocess) default template drupal render template override hook theme registry theme registry alter * Todavía en progreso http://dgo.to/2004872
  • 55. Nuevos theme hooks NUEVO! hook_prepare_alter() o hook_theme_prepare_TEMPLATE_SUGGESTION_alter() hook theme hook hook theme suggestions theme suggestions alter hook prepare default template hook prepare alter (preprocess) drupal render template override hook theme registry theme registry alter Parecido a hook_form_alter and hook_form_FORM_ID_alter ● *Todavía en progreso
  • 56. En D8 todo es «renderizable» ● ● ● Todo es una Array hasta el final. Se evita tener que bucear (regexp) en variables de tipo string para alterar el marcado. El marcado está en las plantillas SOLAMENTE
  • 57. Traducción de cadenas en plantillas ● ● http://dgo.to/2047135 Implementación de t() y format_plural() con contexto incluido: {% set count = comments|length %} {% trans %} {{ count }} comment was deleted successfully. {% plural count %} {{ count }} comments were deleted successfully. {% endtrans %} {% trans with {'context': 'Long month name', 'langcode': 'fr'} %} January {% endtrans %}
  • 58. «Theme Component Library» ● ● Crear un set «standard» de plantillas base para todos los elementos comunes. Ahora mismo es una lista de deseos http://dgo.to/1804488
  • 59. Conclusiones ● Con D8 los themers seremos felices (¡al fin!) ● ... ● We need Drupal Heros! ● http://dgo.to/1921610 ● http://dgo.to/1757550 ● Ask to @rteijeiro