175
Twig, los mejores trucos y técnicas avanzadas Javier Eguíluz Universitat Jaume I · Castellón · 15-16 junio 2012 · desymfony.com

Twig, los mejores trucos y técnicas avanzadas

Embed Size (px)

Citation preview

Page 1: Twig, los mejores trucos y técnicas avanzadas

Twig, los mejores trucos y técnicas avanzadasJavier Eguíluz

Universitat Jaume I · Castellón · 15-16 junio 2012 · desymfony.com

Page 2: Twig, los mejores trucos y técnicas avanzadas

PATROCINADOR PLATINO

PATROCINADORES ORO

PATROCINADORES PLATA

PATROCINADORES BRONCE

¡muchas gracias a nuestros patrocinadores!

Page 3: Twig, los mejores trucos y técnicas avanzadas

Agenda

• Buenas prácticas

• Técnicas avanzadas

• Trucos y cosas nuevas

Page 4: Twig, los mejores trucos y técnicas avanzadas

CódigoEl código fuente de los ejemplos más avanzados de esta ponencia está disponible en:

https://github.com/javiereguiluz/desymfony!twig

Page 5: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

PERSONALIZACIÓN EXTREMA DE

FORMULARIOS

Page 6: Twig, los mejores trucos y técnicas avanzadas

<div> {{ form_label(form.nombre) }} {{ form_errors(form.nombre) }} {{ form_widget(form.nombre) }}</div>

Page 7: Twig, los mejores trucos y técnicas avanzadas

{% extends '::base.html.twig' %}{% form_theme form _self %}

{% block integer_widget %} <div class="integer_widget"> {% set type = type|default('number') %} {{ block('field_widget') }} </div>{% endblock %}

{% block content %} {# render the form #} {{ form_row(form.age) }}{% endblock %}

Page 8: Twig, los mejores trucos y técnicas avanzadas

{% extends '::base.html.twig' %}{% form_theme form _self %}

{% block integer_widget %} <div class="integer_widget"> {% set type = type|default('number') %} {{ block('field_widget') }} </div>{% endblock %}

{% block content %} {# render the form #} {{ form_row(form.age) }}{% endblock %}

Page 9: Twig, los mejores trucos y técnicas avanzadas

{% extends '::base.html.twig' %}{% form_theme form _self %}

{% block integer_widget %} <div class="integer_widget"> {% set type = type|default('number') %} {{ block('field_widget') }} </div>{% endblock %}

{% block content %} {# render the form #} {{ form_row(form.age) }}{% endblock %}

Page 10: Twig, los mejores trucos y técnicas avanzadas

{% form_theme form _self %}

{% block _formulario_nombre_widget %} <div class="especial"><strong> {{ block('field_widget') }} </strong></div>{% endblock %}

{{ form_widget(form.nombre) }}

Page 11: Twig, los mejores trucos y técnicas avanzadas

{% form_theme form _self %}

{% block _formulario_nombre_widget %} <div class="especial"><strong> {{ block('field_widget') }} </strong></div>{% endblock %}

{{ form_widget(form.nombre) }}

Page 12: Twig, los mejores trucos y técnicas avanzadas

class UsuarioType extends AbstractType{ public function buildForm(FormBuilder $builder, array $options) { $builder ->add('nombre') ->add('apellidos') ->add('email') ->... ->add('ciudad') ; }

public function getName() { return 'cupon_backendbundle_usuariotype'; }}

Page 13: Twig, los mejores trucos y técnicas avanzadas

class UsuarioType extends AbstractType{ public function buildForm(FormBuilder $builder, array $options) { $builder ->add('nombre') ->add('apellidos') ->add('email') ->... ->add('ciudad') ; }

public function getName() { return 'cupon_backendbundle_usuariotype'; }}

Page 14: Twig, los mejores trucos y técnicas avanzadas

<strong>Label</strong>: Valor

Page 15: Twig, los mejores trucos y técnicas avanzadas

<strong>Label</strong>: Valor

<strong>{{ form.nombreCampo.vars.label }}</strong>:{{ form. nombreCampo.vars.value }}

Page 16: Twig, los mejores trucos y técnicas avanzadas

<strong>Label</strong>: Valor

<strong>{{ form.nombreCampo.vars.label }}</strong>:{{ form. nombreCampo.vars.value }}

Page 17: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

CONSTANTES

Page 18: Twig, los mejores trucos y técnicas avanzadas

{{ constant() }}

Page 19: Twig, los mejores trucos y técnicas avanzadas

{{ constant('Symfony\\Component\\HttpKernel\\Kernel::VERSION') }}

Page 20: Twig, los mejores trucos y técnicas avanzadas

{{ constant('Symfony\\Component\\HttpKernel\\Kernel::VERSION') }}

namespace Symfony\Component\HttpKernel;

abstract class Kernel implements KernelInterface{ // ...

const VERSION = '2.0.15';}

Page 21: Twig, los mejores trucos y técnicas avanzadas

namespace Symfony\Component\HttpKernel;

abstract class Kernel implements KernelInterface{ // ...

const VERSION = '2.1.0-DEV'; const VERSION_ID = '20100'; const MAJOR_VERSION = '2'; const MINOR_VERSION = '1'; const RELEASE_VERSION = '0'; const EXTRA_VERSION = 'DEV';}

Page 22: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

REDEFINE LOS FILTROS POR

DEFECTO

Page 23: Twig, los mejores trucos y técnicas avanzadas

{{ array|sort }}

Page 24: Twig, los mejores trucos y técnicas avanzadas

asort()arsort()krsort()ksort()rsort()shuffle()sort()usort()

array_multisort()natcasesort()natsort()rsort()shuffle()uasort()uksort()

Page 25: Twig, los mejores trucos y técnicas avanzadas

¿Dónde se definen los filtros, etiquetas

y tags de Twig?

Page 26: Twig, los mejores trucos y técnicas avanzadas

class Twig_Extension_Core extends Twig_Extension { public function getTokenParsers() { return array( new Twig_TokenParser_For(), new Twig_TokenParser_If(), new Twig_TokenParser_Extends(), new Twig_TokenParser_Include(), new Twig_TokenParser_Block(), // ... ); }

public function getFilters() { $filters = array( 'format' => new Twig_Filter_Function('sprintf'), 'replace' => new Twig_Filter_Function('strtr'), 'abs' => new Twig_Filter_Function('abs'), // ... ); }}

lib/twig/Extesion/Core.php

Page 27: Twig, los mejores trucos y técnicas avanzadas

/** * Sorts an array. * * @param array $array An array */function twig_sort_filter($array){ asort($array);

return $array;}

{{ array|sort }}

Page 28: Twig, los mejores trucos y técnicas avanzadas

natcasesort()

a0, A1, a2, a10, ...

Page 29: Twig, los mejores trucos y técnicas avanzadas

class MiCoreExtension extends Twig_Extension_Core { // ...}

Page 30: Twig, los mejores trucos y técnicas avanzadas

class MiCoreExtension extends Twig_Extension_Core {

public function getFilters() { // ... }}

Page 31: Twig, los mejores trucos y técnicas avanzadas

class MiCoreExtension extends Twig_Extension_Core {

public function getFilters() { return array_merge( parent::getFilters(), array( ... ) ); }}

Page 32: Twig, los mejores trucos y técnicas avanzadas

$twig = new Twig_Environment($loader, array( ... ));

$twig->addExtension(new MiCoreExtension());

Page 33: Twig, los mejores trucos y técnicas avanzadas

class MiCoreExtension extends Twig_Extension_Core{ public function getFilters() { return array_merge(parent::getFilters(), array( 'sort' => new Twig_Filter_Method($this, 'sortFilter') )); }

public function sortFilter($array) { natcasesort($array); return $array; }}

Page 34: Twig, los mejores trucos y técnicas avanzadas

function twig_sort_filter($array){ natcasesort($array); return $array;}

{{ array|sort }}

Page 35: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.5

TODO SON EXPRESIONES

Page 36: Twig, los mejores trucos y técnicas avanzadas

{% include 'seccion_' ~ oferta.categoria ~ '.twig' %}

{% for i in (1+3)//2..2**(3-1) %}

{% endfor %}

Page 37: Twig, los mejores trucos y técnicas avanzadas

{% set ofertas = { ('oferta' ~ oferta.id): '...', (3 ~ '_' ~ oferta.nombre|length): '...', (2**2+1): '...'

} %}

Page 38: Twig, los mejores trucos y técnicas avanzadas

{% set ofertas = { ('oferta' ~ oferta.id): '...', (3 ~ '_' ~ oferta.nombre|length): '...', (2**2+1): '...'

} %}

Page 39: Twig, los mejores trucos y técnicas avanzadas

{% set ofertas = { oferta7040: '...', 3_57: '...', 5: '...'

} %}

Page 40: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.8

EMBED

Page 41: Twig, los mejores trucos y técnicas avanzadas

{% include %} {% extends %}

{% embed %}

Page 42: Twig, los mejores trucos y técnicas avanzadas

{% include '...' %}

Page 43: Twig, los mejores trucos y técnicas avanzadas

{% extends '...' %}

Page 44: Twig, los mejores trucos y técnicas avanzadas

{% embed '...' %}

Page 45: Twig, los mejores trucos y técnicas avanzadas

{% embed "lateral.twig" %} {% block principal %} ... {% endblock %}{% endembed %}

Page 46: Twig, los mejores trucos y técnicas avanzadas

{% embed "lateral.twig" %} {% block secundario %} ... {% endblock %}{% endembed %}

Page 47: Twig, los mejores trucos y técnicas avanzadas

{% include 'plantilla.twig' %}

{% embed 'plantilla.twig' %}{% endembed %}

Page 48: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.8

ESCAPING AUTOMÁTICO

Page 49: Twig, los mejores trucos y técnicas avanzadas

{% filter escape('js') %} <script type="text/javascript"> var texto = "<p>Lorem ipsum dolor sit amet</p>"; alert(texto); </script>{% endfilter %}

{% filter escape('html') %} <script type="text/javascript"> var texto = "<p>Lorem ipsum dolor sit amet</p>"; alert(texto); </script>{% endfilter %}

Page 50: Twig, los mejores trucos y técnicas avanzadas

\x3cscript type\x3d\x22text\x2fjavascript\x22\x3e\x0a var texto \x3d \x22\x3cp\x3eLorem ipsum dolor sit amet\x3c\x2fp\x3e\x22\x3b\x0a alert\x28texto\x29\x3b\x0a \x3c\x2fscript\x3e\x0a

&lt;script type=&quot;text/javascript&quot;&gt; var texto = &quot;&lt;p&gt;Lorem ipsum dolor sit amet&lt;/p&gt;&quot;; alert(texto);&lt;/script&gt;

Page 51: Twig, los mejores trucos y técnicas avanzadas

{{ variable|e }}{{ variable|e('html') }}{{ variable|escape('js') }}{{ variable|e('js') }}

{% autoescape %} ........... {% endautoescape %}

{% autoescape 'html' %} ... {% endautoescape %}

{% autoescape 'js' %} ....... {% endautoescape %}

{% autoescape false %} .... {% endautoescape %}

Page 52: Twig, los mejores trucos y técnicas avanzadas

$twig = new Twig_Environment($loader, array( 'autoescape' => function($nombre_plantilla) { return decide_escape($nombre_plantilla); }));

Page 53: Twig, los mejores trucos y técnicas avanzadas

$twig = new Twig_Environment($loader, array( 'autoescape' => function($nombre_plantilla) { return decide_escape($nombre_plantilla); }));

function decide_escape($plantilla) { $extension = substr($plantilla, strrpos($plantilla, '.') + 1);

switch ($extension) { 'js': return 'js'; default: return 'html'; }}

Page 54: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.6

RANDOM

Page 55: Twig, los mejores trucos y técnicas avanzadas

{{ random() }}

Page 56: Twig, los mejores trucos y técnicas avanzadas

{{ random() }}{{ random(10) }}

Page 57: Twig, los mejores trucos y técnicas avanzadas

{{ random() }}{{ random(10) }}{{ random("abcde") }}

Page 58: Twig, los mejores trucos y técnicas avanzadas

{{ random() }}{{ random(10) }}{{ random("abcde") }}{{ random(['a', 'b', 'c']) }}

Page 59: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.5

FUNCIONES DINÁMICAS

Page 60: Twig, los mejores trucos y técnicas avanzadas

the_ID()the_title()the_time()the_content()the_category()the_shortlink()

Page 61: Twig, los mejores trucos y técnicas avanzadas

the_ID()the_title()the_time()the_content()the_category()the_shortlink()

Page 62: Twig, los mejores trucos y técnicas avanzadas

the_ID()the_title()the_time()the_content()the_category()the_shortlink()

the_*()

Page 63: Twig, los mejores trucos y técnicas avanzadas

$twig->addFunction(

'the_*', new Twig_Function_Function('wordpress'));

function wordpress($funcion, $opciones){ // ...}

Page 64: Twig, los mejores trucos y técnicas avanzadas

$twig->addFunction(

'the_*', new Twig_Function_Function('wordpress'));

function wordpress($funcion, $opciones){ // ...}

Page 65: Twig, los mejores trucos y técnicas avanzadas

{{ the_ID() }}

Page 66: Twig, los mejores trucos y técnicas avanzadas

{{ the_ID() }}function wordpress('ID', array()) { ... }

Page 67: Twig, los mejores trucos y técnicas avanzadas

{{ the_ID() }}function wordpress('ID', array()) { ... }

{{ the_content() }}

Page 68: Twig, los mejores trucos y técnicas avanzadas

{{ the_ID() }}function wordpress('ID', array()) { ... }

{{ the_content() }}function wordpress('content', array()) { ... }

Page 69: Twig, los mejores trucos y técnicas avanzadas

{{ the_title('<h3>', '</h3>') }}

function wordpress('title', array( '<h3>', '</h3>')) { ... }

Page 70: Twig, los mejores trucos y técnicas avanzadas

next_image_link()next_post_link()next_posts_link()previous_image_link()previous_post_link()previous_posts_link()

*_*_link()

Page 71: Twig, los mejores trucos y técnicas avanzadas

php_*()

Page 72: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.5

FILTROS DINÁMICOS

Page 73: Twig, los mejores trucos y técnicas avanzadas

{{ 'now'|fecha_corta }}{{ 'now'|fecha_larga }}

fecha_*()

Page 74: Twig, los mejores trucos y técnicas avanzadas

$twig->addFilter(

'fecha_*', new Twig_Filter_Function('fecha'));

function fecha($funcion, $opciones){ // ...}

Page 75: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

VARIABLES GLOBALES

Page 76: Twig, los mejores trucos y técnicas avanzadas

{{ app.security }}{{ app.user }}

{{ app.request }}{{ app.session }}

{{ app.environment }}{{ app.debug }}

Page 77: Twig, los mejores trucos y técnicas avanzadas

{{ _charset }}{{ _context }}{{ _self }}

Page 78: Twig, los mejores trucos y técnicas avanzadas

{{ _charset }}

UTF-8

Page 79: Twig, los mejores trucos y técnicas avanzadas

{{ _context }}

{% for i in _context|keys %} {{ i }}

{% endfor %}

Page 80: Twig, los mejores trucos y técnicas avanzadas

{{ _context }}

{% for i in _context|keys %} {{ i }}

{% endfor %}

appassetic_parentofertaciudad_por_defectociudadSeleccionadaexpirada...

Page 81: Twig, los mejores trucos y técnicas avanzadas

{{ _context }}

{% for i in _context|keys %} {{ i }}

{% endfor %}

appassetic_parentofertaciudad_por_defectociudadSeleccionadaexpirada...

appassetic_parent

Page 82: Twig, los mejores trucos y técnicas avanzadas

{{ _context }}

{{ variable|mi_filtro(_context) }}

Page 83: Twig, los mejores trucos y técnicas avanzadas

{{ _context }}

{{ variable|mi_filtro(_context) }}

SÓLO SI NO HAY OTRO REMEDIO

Page 84: Twig, los mejores trucos y técnicas avanzadas

{{ _self }}

Twig_Template

Page 85: Twig, los mejores trucos y técnicas avanzadas

{{ _self.getTemplateName }}

OfertaBundle:Default:includes/oferta.html.twig

{{ _self }}

Page 86: Twig, los mejores trucos y técnicas avanzadas

title, stylesheets, rss, javascripts, id, body

{{ _self.blocks|keys|join(", ") }}

{{ _self }}

Page 87: Twig, los mejores trucos y técnicas avanzadas

title, stylesheets, rss, javascripts, id, body

{{ _self.blocks|keys|join(", ") }}

{{ _self }}

SÓLO SI NO HAY OTRO REMEDIO

Page 88: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

EL SANDBOX

Page 89: Twig, los mejores trucos y técnicas avanzadas

DEMO

Page 90: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.6

DATE

Page 91: Twig, los mejores trucos y técnicas avanzadas

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

{{ 'now'|date("d/m/Y H:i:s", "America/Argentina/Buenos_Aires") }}

{{ 'now'|date("d/m/Y H:i:s", "America/Havana") }}

{{ 'now'|date("d/m/Y H:i:s", "America/Caracas") }}

{{ 'now'|date("d/m/Y H:i:s", "America/Lima") }}

Page 92: Twig, los mejores trucos y técnicas avanzadas

España: 11/06/2012 10:45:22

Argentina: 11/06/2012 05:45:22

Cuba: 11/06/2012 04:45:22

Venezuela: 11/06/2012 04:15:22

Perú: 11/06/2012 03:45:22

Page 93: Twig, los mejores trucos y técnicas avanzadas

$twig = new Twig_Environment($loader);

$twig->getExtension('core') ->setDateFormat('d-m-Y H:i:s', '%d días');

$twig->getExtension('core') ->setTimezone('America/Montevideo');

Page 94: Twig, los mejores trucos y técnicas avanzadas

date()

Page 95: Twig, los mejores trucos y técnicas avanzadas

{{ date() }}

Page 96: Twig, los mejores trucos y técnicas avanzadas

{{ date() }}

{{ date()|date() }}

Page 97: Twig, los mejores trucos y técnicas avanzadas

{{ date() }}

{{ date()|date("d/m/Y") }}

{{ date()|date() }}

Page 98: Twig, los mejores trucos y técnicas avanzadas

Tu invitación caduca el{{ date('+2days')|date }}

{% if date(nacimiento) < date('-18years') %} ¡Eres menor de edad!{% endif %}

La última sorpresa de #deSymfony se desvelará el {{ date('next Monday')|date() }}

Tu invitación caduca el{{ date('+2days')|date }}

Page 99: Twig, los mejores trucos y técnicas avanzadas

Tu invitación caduca el{{ date('+2days')|date }}

{% if date(nacimiento) < date('-18years') %} ¡Eres menor de edad!{% endif %}

La última sorpresa de #deSymfony se desvelará el {{ date('next Monday')|date() }}

Tu invitación caduca el{{ date('+2days')|date }}

{% if date(fechaNacimiento) < date('-18years') %} ¡Eres menor de edad!{% endif %}

Page 100: Twig, los mejores trucos y técnicas avanzadas

La última sorpresa de #deSymfony se desvelará el{{ date('next Monday')|date() }}

Page 101: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

OPERADORES PROPIOS

Page 102: Twig, los mejores trucos y técnicas avanzadas

$loader = new Twig_Loader_Filesystem(...);$twig = new Twig_Environment($loader, array(...));

$twig->addExtension(new OperatorsExtension());

Page 103: Twig, los mejores trucos y técnicas avanzadas

{{ 5 >> 2 }}

{{ 4 >> 20 }}

Operador "quédate con el mayor"

5

20

Page 104: Twig, los mejores trucos y técnicas avanzadas

class OperatorsExtension extends Twig_Extension{ public function getName() { return 'OperatorsExtension'; }

public function getOperators() { return array( array(), array('>>' => array( 'precedence' => 20, 'class' => 'Desymfony\Operators\MaxOperator', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT ) )); }}

Page 105: Twig, los mejores trucos y técnicas avanzadas

class OperatorsExtension extends Twig_Extension{ public function getName() { return 'OperatorsExtension'; }

public function getOperators() { return array( array(), array('>>' => array( 'precedence' => 20, 'class' => 'Desymfony\Operators\MaxOperator', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT ) )); }}

Page 106: Twig, los mejores trucos y técnicas avanzadas

class OperatorsExtension extends Twig_Extension{ public function getName() { return 'OperatorsExtension'; }

public function getOperators() { return array( array(), array('>>' => array( 'precedence' => 20, 'class' => 'Desymfony\Operators\MaxOperator', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT ) )); }}

Page 107: Twig, los mejores trucos y técnicas avanzadas

!= 20+ 30** 200

PrecedenceOperador

2 +3**2 / 4 .. 4-5//2

Page 108: Twig, los mejores trucos y técnicas avanzadas

{{ a >> b }} max($a, $b);

TWIG PHP

Page 109: Twig, los mejores trucos y técnicas avanzadas

class MaxOperator extends Twig_Node_Expression_Binary{ public function compile(Twig_Compiler $compiler) { $compiler ->raw('max(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) ->raw(')') ; }

Page 110: Twig, los mejores trucos y técnicas avanzadas

class MaxOperator extends Twig_Node_Expression_Binary{ public function compile(Twig_Compiler $compiler) { $compiler ->raw('max(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) ->raw(')') ; } max($a, $b);

Page 111: Twig, los mejores trucos y técnicas avanzadas

// line 23echo twig_escape_filter($this->env, max(5, 2), "html", null, true);

Page 112: Twig, los mejores trucos y técnicas avanzadas

$compiler ->raw() ->write() ->string() ->indent() ->outdent();

(literal)(indentado)(entrecomillado)(indentar)(desindentar)

Page 113: Twig, los mejores trucos y técnicas avanzadas

Operador "cambia claves por valores"

array_flip(range('a', 'z'))

{% for i in <->('a'..'z') %} {{ i }},{% endfor %}

TWIG

PHP

Page 114: Twig, los mejores trucos y técnicas avanzadas

Operador "cambia claves por valores"

array_flip(range('a', 'z'))

{% for i in <->('a'..'z') %} {{ i }},{% endfor %}

TWIG

PHP

Page 115: Twig, los mejores trucos y técnicas avanzadas

class OperatorsExtension extends Twig_Extension{ public function getName() { return 'OperatorsExtension'; }

public function getOperators() { return array( array('<->' => array( 'precedence' => 50, 'class' => 'Desymfony\Operators\FlipOperator', ), array() )); }}

Page 116: Twig, los mejores trucos y técnicas avanzadas

class OperatorsExtension extends Twig_Extension{ public function getName() { return 'OperatorsExtension'; }

public function getOperators() { return array( array('<->' => array( 'precedence' => 50, 'class' => 'Desymfony\Operators\FlipOperator', ), array() )); }}

Page 117: Twig, los mejores trucos y técnicas avanzadas

class OperatorsExtension extends Twig_Extension{ public function getName() { return 'OperatorsExtension'; }

public function getOperators() { return array( array('<->' => array( 'precedence' => 50, 'class' => 'Desymfony\Operators\FlipOperator', ), array() )); }}

Page 118: Twig, los mejores trucos y técnicas avanzadas

namespace Desymfony\Operators;

class FlipOperator extends Twig_Node_Expression_Unary{

public function compile(Twig_Compiler $compiler) { $compiler ->raw("array_flip(") ->subcompile($this->getNode('node')) ->raw(")") ; }

Page 119: Twig, los mejores trucos y técnicas avanzadas

namespace Desymfony\Operators;

class FlipOperator extends Twig_Node_Expression_Unary{

public function compile(Twig_Compiler $compiler) { $compiler ->raw("array_flip(") ->subcompile($this->getNode('node')) ->raw(")") ; } array_flip($coleccion);

Page 120: Twig, los mejores trucos y técnicas avanzadas

// line 17

$context['_parent'] = (array) $context;

$context['_seq'] = twig_ensure_traversable(array_flip(range("a", "z")));

foreach ($context['_seq'] as $context["_key"] => $context["i"]) {

// line 18

echo " ";

if (isset($context["i"])) { $_i_ = $context["i"]; } else { $_i_ = null; }

echo twig_escape_filter($this->env, $_i_, "html", null, true);

echo ",";

}

Page 121: Twig, los mejores trucos y técnicas avanzadas

// line 17

$context['_parent'] = (array) $context;

$context['_seq'] = twig_ensure_traversable(array_flip(range("a", "z")));

foreach ($context['_seq'] as $context["_key"] => $context["i"]) {

// line 18

echo " ";

if (isset($context["i"])) { $_i_ = $context["i"]; } else { $_i_ = null; }

echo twig_escape_filter($this->env, $_i_, "html", null, true);

echo ",";

}

Page 122: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

SUPER CACHÉ

Page 123: Twig, los mejores trucos y técnicas avanzadas

# mkfs -q /dev/ram1 65536# mkdir -p /twigcache# mount /dev/ram1 /twigcache

Inspirado por: http://www.cyberciti.biz/faq/howto!create!linux!ram!disk!filesystem/

Page 124: Twig, los mejores trucos y técnicas avanzadas

$twig = new \Twig_Environment( $loader, array('cache' => '/twigcache'));

# app/config/config.ymltwig: cache: '/twigcache'

Page 125: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

ETIQUETASPROPIAS

Page 126: Twig, los mejores trucos y técnicas avanzadas

#1#2 #3

etiquetas

operadorestests

Page 127: Twig, los mejores trucos y técnicas avanzadas

{% source 'simple.twig' %}

{% source '../../../composer.json' %}

Page 128: Twig, los mejores trucos y técnicas avanzadas

1. Clase Token Parser

2. Clase NodeTWIG PHP

TWIGTWIG

Page 129: Twig, los mejores trucos y técnicas avanzadas

$loader = new Twig_Loader_Filesystem(...);$twig = new Twig_Environment($loader, array(...));

$twig->addTokenParser(new SourceTokenParser());

Page 130: Twig, los mejores trucos y técnicas avanzadas

class SourceTokenParser extends Twig_TokenParser{ public function getTag() { return 'source'; }}

{% source '...' %}

Page 131: Twig, los mejores trucos y técnicas avanzadas

namespace Desymfony\Tags;use Desymfony\Tags\SourceNode;

class SourceTokenParser extends Twig_TokenParser{ public function parse(Twig_Token $token) { $lineno = $token->getLine(); $value = $this->parser->getExpressionParser()->parseExpression();

$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);

return new SourceNode($value, $lineno, $this->getTag()); }}

Page 132: Twig, los mejores trucos y técnicas avanzadas

namespace Desymfony\Tags;

class SourceNode extends Twig_Node{ public function __construct(Twig_Node_Expression $value, $lineno, $tag = null) { parent::__construct(array('file' => $value), array(), $lineno, $tag); }

public function compile(Twig_Compiler $compiler) {

$compiler -> // ... ->write('echo file_get_contents(') ->subcompile($this->getNode('file')) ->raw(');'); ; }}

Page 133: Twig, los mejores trucos y técnicas avanzadas

// line 3echo file_get_contents("simple.twig");// line 4echo "\n";

// line 5echo file_get_contents("../../../composer.json");// line 6echo "\n";

Page 134: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.5

INTERPOLACIÓN

Page 135: Twig, los mejores trucos y técnicas avanzadas

La oferta cuesta 25.78 euros (30.42 con IVA) y es válida hasta el 10/06/2012

Page 136: Twig, los mejores trucos y técnicas avanzadas

La oferta cuesta 25.78 euros (30.42 con IVA) y es válida hasta el 10/06/2012

Page 137: Twig, los mejores trucos y técnicas avanzadas

{{ 'La oferta cuesta ' ~ oferta.precio ~ ' euros (' ~ oferta.precio*1.18 ~ ' con IVA) y es válida hasta el ' ~ oferta.fechaExpiracion|date() }}

La oferta cuesta 25.78 euros (30.42 con IVA) y es válida hasta el 10/06/2012

~

Page 138: Twig, los mejores trucos y técnicas avanzadas

{{ 'La oferta cuesta %.2f euros (%.2f con IVA) y es

válida hasta el %s'|format(oferta.precio, oferta.precio*1.18, oferta.fechaExpiracion|date()) }}

La oferta cuesta 25.78 euros (30.42 con IVA) y es válida hasta el 10/06/2012

format()

Page 139: Twig, los mejores trucos y técnicas avanzadas

{{ 'La oferta cuesta :precio euros (:total con IVA) y es válida hasta el :fecha'|replace({ ':precio': oferta.precio, ':total': oferta.precio*1.18, ':fecha': oferta.fechaExpiracion|date() }) }}

La oferta cuesta 25.78 euros (30.42 con IVA) y es válida hasta el 10/06/2012

replace()

Page 140: Twig, los mejores trucos y técnicas avanzadas

{{ "La oferta cuesta #{oferta.precio} euros (#{oferta.precio*1.18} con IVA) y es válida hasta el#{oferta.fechaExpiracion|date()}" }}

La oferta cuesta 25.78 euros (30.42 con IVA) y es válida hasta el 10/06/2012

Page 141: Twig, los mejores trucos y técnicas avanzadas

{{ "... #{ expresión } ..." }}

Page 142: Twig, los mejores trucos y técnicas avanzadas

{{ "... #{ expresión } ..." }}

Page 143: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.5

NUEVOS FILTROS Y ETIQUETAS

Page 144: Twig, los mejores trucos y técnicas avanzadas

{% flush %}

Page 145: Twig, los mejores trucos y técnicas avanzadas

{% do %}

Page 146: Twig, los mejores trucos y técnicas avanzadas

{{ 1 + 1 }}

{% do 1 + 1 %}

2

(nada)

Page 147: Twig, los mejores trucos y técnicas avanzadas

{% set lista = ['a', 'b', 'c', 'd'] %}

{{ lista|shift }}

{% do lista|shift %}

Fuente: https://github.com/fabpot/Twig/issues/446

Page 148: Twig, los mejores trucos y técnicas avanzadas

[ : ]

Page 149: Twig, los mejores trucos y técnicas avanzadas

{% set lista = ['a', 'b', 'c', 'd'] %}

{{ lista[1:] }}

Page 150: Twig, los mejores trucos y técnicas avanzadas

{% set lista = ['a', 'b', 'c', 'd'] %}

{{ lista[-1:] }}

Page 151: Twig, los mejores trucos y técnicas avanzadas

{% set lista = ['a', 'b', 'c', 'd'] %}

{{ lista[2:2] }}

Page 152: Twig, los mejores trucos y técnicas avanzadas

{{ '@username'[1:] }}

{{ 'Lorem ipsum...'[-4:10] }}

Page 153: Twig, los mejores trucos y técnicas avanzadas

$a ^ $b

$a << $b

$a >> $b

{{ a b-and b }}

{{ a b-xor b }}

{{ a b-or b }}

operadores bitwise

PHPTWIG

Page 154: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

TWIG_TEMPLATE

Page 155: Twig, los mejores trucos y técnicas avanzadas

<html> <head> ... </head>

<body> ...

<span data-host="Darwin mbp.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386" data-elapsed="0.97804594039917 sec." data-timestamp="1339609672.9781"></span>

</body></html>

Page 156: Twig, los mejores trucos y técnicas avanzadas

app/cache/dev/twig/

Page 157: Twig, los mejores trucos y técnicas avanzadas

app/cache/dev/twig/

Page 158: Twig, los mejores trucos y técnicas avanzadas

<?php

/* ::frontend.html.twig */class __TwigTemplate_09fc2d8a188dda8245d295e6324582f2 extends Twig_Template{ public function __construct(Twig_Environment $env) { parent::__construct($env);

$this->parent = $this->env->loadTemplate("::base.html.twig");

$this->blocks = array( 'stylesheets' => array($this, 'block_stylesheets'), 'javascripts' => array($this, 'block_javascripts'), 'body' => array($this, 'block_body'), 'article' => array($this, 'block_article'), ); }}

app/cache/dev/twig/09/fc/2d8a188dda8245d295e6324582f2.php

Page 159: Twig, los mejores trucos y técnicas avanzadas

class __TwigTemplate_09f...2f2 extends Twig_Template{ // ...}

Page 160: Twig, los mejores trucos y técnicas avanzadas

namespace Cupon\BackendBundle\Controller;use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class UsuarioController extends Controller{ public function indexAction() { //... return $this->render( 'BackendBundle:Usuario:index.html.twig', array( ... ) ); }}

Page 161: Twig, los mejores trucos y técnicas avanzadas

function render($view, $parameters, $response) {

return $this->container->get('templating') ->renderResponse($view, $parameters, $response);

}

Symfony/Bundle/FrameworkBundle/Controller/Controller.php

Page 162: Twig, los mejores trucos y técnicas avanzadas

public function render($name, array $context = array()){ return $this->loadTemplate($name) ->render($context);}

lib/Twig/Environment.php

Page 163: Twig, los mejores trucos y técnicas avanzadas

return $this->render( ... );

render( ... ) Twig_Template

Page 164: Twig, los mejores trucos y técnicas avanzadas

return $this->render( ... );

render( ... ) Twig_Template

Page 165: Twig, los mejores trucos y técnicas avanzadas

<html> <head> ... </head>

<body> ...

<span data-host="Darwin mbp.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386" data-elapsed="0.97804594039917 sec." data-timestamp="1339609672.9781"></span>

</body></html>

Page 166: Twig, los mejores trucos y técnicas avanzadas

$loader = new Twig_Loader_Filesystem(__DIR__.'/../Resources/views');$twig = new Twig_Environment($loader, array( 'base_template_class' => '\Desymfony\Template\MiTwigTemplate',));

# app/config/config.ymltwig: base_template_class: "Desymfony\Template\MiTwigTemplate"

base_template_class

Page 167: Twig, los mejores trucos y técnicas avanzadas

namespace Desymfony\Template;

abstract class MiTwigTemplate extends Twig_Template{ public function render(array $context) { $traza = sprintf('<span data-host="%s" data-elapsed="%s sec." data-timestamp="%s"></span>', php_uname(), microtime(true)-$_SERVER['REQUEST_TIME'], microtime(true) );

return str_replace('</body>', $traza."\n</body>", parent::render($context) ); }}

Page 168: Twig, los mejores trucos y técnicas avanzadas

AVANZADOINTERMEDIOBÁSICO1.*

TWIG LINTER

Page 169: Twig, los mejores trucos y técnicas avanzadas

$twig = new Twig_Environment($loader, array(..));

try { $twig->parse($twig->tokenize($plantilla)); echo "[OK] La sintaxis de la plantilla es correcta";} catch (Twig_Error_Syntax $e) { echo "[ERROR] La plantilla tiene errores de sintaxis";}

Page 170: Twig, los mejores trucos y técnicas avanzadas

$ php app/console twig:lint @MyBundle

$ php app/console twig:lint src/Cupon/OfertaBundle/Resources/views/index.html.twig

Page 171: Twig, los mejores trucos y técnicas avanzadas

twig:lint

Page 172: Twig, los mejores trucos y técnicas avanzadas

twig:lint

SYMFONY 2.1

Page 173: Twig, los mejores trucos y técnicas avanzadas

twig:lint

SYMFONY 2.1

DESYMFONY 2013

Page 174: Twig, los mejores trucos y técnicas avanzadas

¡muchas gracias!