Top Banner
Javier Eguiluz Twig avanzado Jornadas Symfony2 Galicia 25-26 noviembre 2011 #sf2Vigo
228

Twig avanzado (sf2Vigo)

Jan 15, 2015

Download

Technology

Javier Eguiluz

Buenas prácticas, trucos, snipets y buenos usos del sistema de plantillas Twig, tanto dentro de Symfony2 como en proyectos PHP independientes
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Twig avanzado (sf2Vigo)

Javier Eguiluz

Twig avanzado

Jornadas Symfony2 Galicia25-26 noviembre 2011 #sf2Vigo

Page 2: Twig avanzado (sf2Vigo)

• Javier Eguiluz

• formador en Symfony2 y nuevas tecnologías

me presento

Page 3: Twig avanzado (sf2Vigo)

creador de http://symfony.es

Page 4: Twig avanzado (sf2Vigo)

apasionado de Symfony

http://connect.sensiolabs.com/profile/javier.eguiluz

Page 5: Twig avanzado (sf2Vigo)

• Buenas prácticas

• Trucos

• Usos avanzados

• Snipets

objetivos de la sesión

Page 6: Twig avanzado (sf2Vigo)

Si no sabes Twig, te vas a

perder a partir de la

siguiente transparencia

Page 7: Twig avanzado (sf2Vigo)

Aprende Twig en 5 minutos

Page 8: Twig avanzado (sf2Vigo)

«Twig es un lenguaje y motor de plantillas PHP»

Page 9: Twig avanzado (sf2Vigo)

twig se puede usar en

Symfony2 Cualquier proyecto PHP

Page 10: Twig avanzado (sf2Vigo)

¿Por qué usar Twig?

Page 11: Twig avanzado (sf2Vigo)

$usuario

public function getNombre(){ return $this->nombre;}

Page 12: Twig avanzado (sf2Vigo)

TWIG

{{ usuario.nombre }}

Page 13: Twig avanzado (sf2Vigo)

echo $usuario->getNombre()

PHP

Page 14: Twig avanzado (sf2Vigo)

<?phpecho $usuario->getNombre();?>

PHP

Page 15: Twig avanzado (sf2Vigo)

<?phpecho htmlspecialchars( $usuario->getNombre(), ENT_QUOTES, 'UTF-8');?>

PHP

Page 16: Twig avanzado (sf2Vigo)

TWIG

PHP

{{ usuario.nombre }}

<?php echo htmlspecialchars($usuario-> getNombre(), ENT_QUOTES, 'UTF-8'); ?>

Page 17: Twig avanzado (sf2Vigo)

Mostrarinformación

Page 18: Twig avanzado (sf2Vigo)

{# ... #}

{% ... %}

{{ ... }}

Page 19: Twig avanzado (sf2Vigo)

<p> Hola {{ usuario }}

Tienes {{ edad }} años y

vives en {{ ciudad }} </p>

Page 20: Twig avanzado (sf2Vigo)

<p> Hola {{ usuario.nombre }}

Tienes {{ usuario.edad }}

años y vives en

{{ usuario.ciudad }} </p>

Page 21: Twig avanzado (sf2Vigo)

{{ usuario.nombre }}

Page 22: Twig avanzado (sf2Vigo)

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

{{ usuario.nombre }}

Page 23: Twig avanzado (sf2Vigo)

<?php

abstract class Twig_Template implements Twig_TemplateInterface{

// ...

protected function getAttribute( $object, $item, array $arguments = array(), $type = Twig_TemplateInterface::ANY_CALL, $isDefinedTest = false) { // ... }}

Template.php

Page 24: Twig avanzado (sf2Vigo)

twig-ext

Derick Rethans

Page 25: Twig avanzado (sf2Vigo)

http://github.com/derickr/twig-ext

Page 26: Twig avanzado (sf2Vigo)

Modificar información

Page 27: Twig avanzado (sf2Vigo)

{{ descripcion }}

Page 28: Twig avanzado (sf2Vigo)

{{ descripcion | striptags }}

Page 29: Twig avanzado (sf2Vigo)

{{ titular | striptags | upper }}

Page 30: Twig avanzado (sf2Vigo)

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

Page 31: Twig avanzado (sf2Vigo)

{{ biografia }}

Page 32: Twig avanzado (sf2Vigo)

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

Page 33: Twig avanzado (sf2Vigo)

{{ biografia | raw }}

Page 34: Twig avanzado (sf2Vigo)

Espacios en blanco

Page 35: Twig avanzado (sf2Vigo)

<ul> <li> <a ... >XXX</a> </li>

<li> ...

Page 36: Twig avanzado (sf2Vigo)

{% spaceless %}

Page 37: Twig avanzado (sf2Vigo)

{% spaceless %}<ul> <li> <a ... >XXX</a> </li>

<li> ...{% endspaceless %}

Page 38: Twig avanzado (sf2Vigo)

<ul><li><a ... >XXX</a></li><li>...

Page 39: Twig avanzado (sf2Vigo)

Estructuras de control

Page 40: Twig avanzado (sf2Vigo)

{% for elemento in coleccion %} {# ... #}

{% endfor %}

Page 41: Twig avanzado (sf2Vigo)

{% for clave, elemento in coleccion %} {# ... #}

{% endfor %}

Page 42: Twig avanzado (sf2Vigo)

{% if condicion1 %}

{# ... #}

{% elseif condicion2 %}

{# ... #}

{% else %}

{# ... #}

{% endif %}

Page 43: Twig avanzado (sf2Vigo)

Herencia de plantillas

Page 44: Twig avanzado (sf2Vigo)

PORTADA

Page 45: Twig avanzado (sf2Vigo)

CONTACTO

Page 46: Twig avanzado (sf2Vigo)

# TITULO #

# CONTENIDOS #

# L

ATER

AL

#

Page 47: Twig avanzado (sf2Vigo)

# TITULO #

# CONTENIDOS #

# L

ATER

AL

#

layout.twig

Page 48: Twig avanzado (sf2Vigo)

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

<body>

<h1>

{% block titulo %}{% endblock %}

</h1>

{% block contenidos %}{% endblock %}

{% block lateral %}{% endblock %}

</body></html>

layout.twig

Page 49: Twig avanzado (sf2Vigo)

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

<body>

<h1>

PORTADA

</h1>

<div id="contenidos">...</div>

<div id="lateral">...</div>

</body></html>

portada.twig

Page 50: Twig avanzado (sf2Vigo)

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

<body>

<h1>

PORTADA

</h1>

<div id="contenidos">...</div>

<div id="lateral">...</div>

</body></html>

portada.twig

Page 51: Twig avanzado (sf2Vigo)

PORTADA

<div id="contenidos">...</div>

<div id="lateral">...</div>

portada.twig

Page 52: Twig avanzado (sf2Vigo)

{% extends "layout.twig" %}

PORTADA

<div id="contenidos">...</div>

<div id="lateral">...</div>

portada.twig

Page 53: Twig avanzado (sf2Vigo)

portada.twig{% extends "layout.twig" %}

{% block titulo %} PORTADA{% endblock %} {% block contenidos %} <div id="contenidos">...</div>{% endblock %}

{% block lateral %} <div id="lateral">...</div>{% endblock %}

Page 54: Twig avanzado (sf2Vigo)

contacto.twig{% extends "layout.twig" %}

{% block titulo %} CONTACTO{% endblock %} {% block contenidos %} <form>...</form>{% endblock %}

{% block lateral %} <p>...</p>{% endblock %}

Page 55: Twig avanzado (sf2Vigo)

ya pasaron los

5 minutos

Page 56: Twig avanzado (sf2Vigo)

Javier Eguiluz

DESARROLLOWEB ÁGIL CON

SYMFONY2

todos los ejemplos que se muestran

a continuación pertenecen al libro

Desarrollo web ágilcon Symfony2(disponible próximamente)

Page 57: Twig avanzado (sf2Vigo)

variablesglobales

Page 58: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

globals:

cp: 01001

iva: [1.04, 1.08, 1.18]

version: 1.0.3

Page 59: Twig avanzado (sf2Vigo)

Precio {{ oferta.precio * iva[0] }}

Coste de envío a {{ usuario.cp | default(cp) }}

<footer> &copy; 'now'|date('Y') - v.{{ version }}</footer>

# app/config/config.ymltwig: # ... globals: cp: 01001 iva: [1.04, 1.08, 1.18] version: 1.0.3

Page 60: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

globals:

global:

cp: 01001

iva: [1.04, 1.08, 1.18]

version: 1.0.3

Page 61: Twig avanzado (sf2Vigo)

Precio {{ oferta.precio * global.iva[0] }}

Coste de envío a {{ oferta.cp | default(global.cp) }}

<footer> &copy; 'now'|date('Y') - v.{{ global.version }}</footer>

# app/config/config.ymltwig: # ... globals: global: cp: 01001 iva: [1.04, 1.08, 1.18] version: 1.0.3

Page 62: Twig avanzado (sf2Vigo)

namespace Cupon\OfertaBundle\Util;

class Util{ static public function getSlug($cadena) { // ... return $slug; }}

servicios como variables globales

Page 63: Twig avanzado (sf2Vigo)

# app/config/config.yml

services:

# ...

cupon.utilidades:

class: Cupon\OfertaBundle\Util\Util

Page 64: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

globals:

utilidades: @cupon.utilidades

Page 65: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

globals:

utilidades: @cupon.utilidades

Page 66: Twig avanzado (sf2Vigo)

{{ utilidades.getSlug('Lorem ipsum dolor sit amet') }}

Page 67: Twig avanzado (sf2Vigo)

depurandovariables

Page 68: Twig avanzado (sf2Vigo)

<?php var_dump($oferta); ?>

{% debug oferta %}

Page 69: Twig avanzado (sf2Vigo)

# app/config/config.yml

services:

twig.extension.debug:

class: Twig_Extensions_Extension_Debug

tags:

- { name: twig.extension }

Page 70: Twig avanzado (sf2Vigo)

for ... else

Page 71: Twig avanzado (sf2Vigo)

{% for articulo in articulos %}

{{ articulo.titulo }}

{# ... #}

{% endfor %}

Page 72: Twig avanzado (sf2Vigo)

{% for articulo in articulos %}

{{ articulo.titulo }}

{# ... #}

{% else %}

No hay artículos

{% endfor %}

Page 73: Twig avanzado (sf2Vigo)

for ... if

Page 74: Twig avanzado (sf2Vigo)

Itera sólamente por las ofertas baratas

Page 75: Twig avanzado (sf2Vigo)

{% for oferta in ofertas if oferta.precio < 10 %} {# ... #}

{% endfor %}

Page 76: Twig avanzado (sf2Vigo)

{% for elemento in coleccion if condicion %} {# ... #}

{% endfor %}

1.2

Page 77: Twig avanzado (sf2Vigo)

Itera sólamente por los amigos del usuario

{% set usuarios = 1..30 %}

{% set amigos = [12, 29, 34, 55, 67] %}

Page 78: Twig avanzado (sf2Vigo)

{% set usuarios = 1..30 %}{% set amigos = [12, 29, 34, 55, 67] %}

{% for usuario in usuarios if usuario in amigos %}

{# sólo 12 y 29 #}

{% endfor %}

Page 79: Twig avanzado (sf2Vigo)

Operadoresde división

Page 80: Twig avanzado (sf2Vigo)

{{ 12 / 7 }}

{{ 12 // 7 }}

{{ 12 % 7 }}

1.7142857142

1

5

resultadooperación

Page 81: Twig avanzado (sf2Vigo)

creandovariables

Page 82: Twig avanzado (sf2Vigo)

{% set nombre = 'José García' %}

{% set edad = 27 %}{% set precio = 104.83 %}

{% set conectado = false %}

{% set tasaImpuestos = [4, 8, 18] %}

Page 83: Twig avanzado (sf2Vigo)

{% set perfil = {

'nombre': 'José García',

'perfiles': ['usuario', 'admin'],

'edad': 27,

'validado': true

} %}

Page 84: Twig avanzado (sf2Vigo)

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

{% set experiencia = edad ~ ' años' %}

Page 85: Twig avanzado (sf2Vigo)

{% set perfil %} Nombre: {{ usuario.nombre }} Apellidos: {{ usuario.apellidos }} Edad: {{ usuario.edad }} años Página: {{ usuario.url }}

{% endset %}

{{ perfil }}

Page 86: Twig avanzado (sf2Vigo)

{% set nombre, edad, activado = 'José', 27, false %}

{{ nombre }}{{ edad }}{% if activado %}

Page 87: Twig avanzado (sf2Vigo)

espaciosen blanco

Page 88: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ {% if comentarios %} /** * Primera línea * Segunda línea */ {% endif %}

Page 89: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ /** * Primera línea * Segunda línea */

NO

Page 90: Twig avanzado (sf2Vigo)

SI

class DefaultController extends Controller{ /** * Primera línea * Segunda línea */

Page 91: Twig avanzado (sf2Vigo)

SI

class DefaultController extends Controller{ /** * Primera línea * Segunda línea */

Page 92: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ {% if comentarios %} /** * Primera línea * Segunda línea */ {% endif %}

Page 93: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ {% if comentarios %} /** * Primera línea * Segunda línea */ {% endif %}

Page 94: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{{% if comentarios %} /** * Primera línea * Segunda línea */{% endif %}

Page 95: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ /** * Primera línea * Segunda línea */

SI

Page 96: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ {% if comentarios %} /** * Primera línea * Segunda línea */ {% endif %}

Page 97: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ {% if comentarios -%} /** * Primera línea * Segunda línea */ {%- endif %}

Page 98: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ /** * Primera línea * Segunda línea */

SI

Page 99: Twig avanzado (sf2Vigo)

{% if condicion -%} {# ... #}

{%- endif %}

Page 100: Twig avanzado (sf2Vigo)

class DefaultController extends Controller{ {% if comentarios -%} /** * Comentario */ {%- else -%} /** * @Anotacion(...) */ {%- endif %}

Page 101: Twig avanzado (sf2Vigo)

formatearinformación

Page 102: Twig avanzado (sf2Vigo)
Page 103: Twig avanzado (sf2Vigo)
Page 104: Twig avanzado (sf2Vigo)

{{ '%.0f'|format(time * 1000) }} ms

Page 105: Twig avanzado (sf2Vigo)

{{ '%.0f'|format(time * 1000) }} ms

Page 106: Twig avanzado (sf2Vigo)

{{ '%.0f'|format(time * 1000) }} ms

Page 107: Twig avanzado (sf2Vigo)

{{ '%0.2f'|format(time * 1000) }} ms

{{ '%.0f'|format(time * 1000) }} ms

Page 108: Twig avanzado (sf2Vigo)

macrospolimórficas

Page 109: Twig avanzado (sf2Vigo)

{# formulario.html.twig #}

{% macro campo(nombre, tipo, valor) %}

<input type="{{ tipo }}"

name="{{ nombre }}"

value="{{ valor }}" />

{% endmacro %}

Page 110: Twig avanzado (sf2Vigo)

{% from 'formularios.html.twig'

import campo as campo %}

Page 111: Twig avanzado (sf2Vigo)

{% from 'formularios.html.twig'

import campo as campo %}

<table>

{{ campo('nombre', 'text', 'José') }}

{{ campo('apellidos', 'text', 'García Pérez') }}

{{ campo('telefono', 'text') }}

</table>

Page 112: Twig avanzado (sf2Vigo)

{% from 'formularios.html.twig'

import campo as campo %}

<table>

{{ campo('nombre', 'text', 'José') }}

{{ campo('apellidos', 'text', 'García Pérez') }}

{{ campo('telefono', 'text') }}

</table>

<ul>

{{ campo('nombre', 'text', 'José') }}

{{ campo('apellidos', 'text', 'García Pérez') }}

{{ campo('telefono', 'text') }}

</ul>

Page 113: Twig avanzado (sf2Vigo)

{# formulario.html.twig #}

{% macro campo(nombre, tipo, valor) %}

<input type="{{ tipo }}" name="{{ nombre }}"

value="{{ valor }}" />

{% endmacro %}

Page 114: Twig avanzado (sf2Vigo)

{# formulario.html.twig #}

{% macro campo(nombre, tipo, valor) %}

<input type="{{ tipo }}" name="{{ nombre }}"

value="{{ valor }}" />

{% endmacro %}

{% macro fila(nombre, tipo, valor) %} <tr> <td>{{ nombre | capitalize }}</td> <td>{{ _self.campo(nombre, tipo, valor) }}</td> </tr>{% endmacro %}

Page 115: Twig avanzado (sf2Vigo)

{# formulario.html.twig #}

{% macro campo(nombre, tipo, valor) %}

<input type="{{ tipo }}" name="{{ nombre }}"

value="{{ valor }}" />

{% endmacro %}

Page 116: Twig avanzado (sf2Vigo)

{# formulario.html.twig #}

{% macro campo(nombre, tipo, valor) %}

<input type="{{ tipo }}" name="{{ nombre }}"

value="{{ valor }}" />

{% endmacro %}

{% macro item(nombre, tipo, valor) %} <li> {{ _self.campo(nombre, tipo, valor) }} </li>{% endmacro %}

Page 117: Twig avanzado (sf2Vigo)

{% from 'formularios.html.twig'

import campo as campo %}

{{ campo('nombre', 'text', 'José') }}

{{ campo('apellidos', 'text', 'García Pérez') }}

{{ campo('telefono', 'text') }}

Page 118: Twig avanzado (sf2Vigo)

{% from 'formularios.html.twig'

import fila as campo %}

<table>

{{ campo('nombre', 'text', 'José') }}

{{ campo('apellidos', 'text', 'García Pérez') }}

{{ campo('telefono', 'text') }}

</table>

Page 119: Twig avanzado (sf2Vigo)

{% from 'formularios.html.twig'

import item as campo %}

<ul>

{{ campo('nombre', 'text', 'José') }}

{{ campo('apellidos', 'text', 'García Pérez') }}

{{ campo('telefono', 'text') }}

</ul>

Page 120: Twig avanzado (sf2Vigo)

filtros dependientesdel entorno

Page 121: Twig avanzado (sf2Vigo)

public function getFilters(){ return array('longitud' => new \Twig_Filter_Method($this, 'longitud') );}

function longitud($valor){ return strlen($valor);}

Page 122: Twig avanzado (sf2Vigo)

public function getFilters(){ return array('longitud' => new \Twig_Filter_Method($this, 'longitud') );}

function longitud($valor){ return strlen($valor);}

エラーが発生

Page 123: Twig avanzado (sf2Vigo)

function longitud($valor){ return mb_strlen($valor, 'EUC-JP');}

Page 124: Twig avanzado (sf2Vigo)

public function getFilters()

{

return array(

'longitud' => new \Twig_Filter_Method(

$this,

'longitud',

array('needs_environment' => true)

)

);

}

Page 125: Twig avanzado (sf2Vigo)

public function getFilters()

{

return array(

'longitud' => new \Twig_Filter_Method(

$this,

'longitud',

array('needs_environment' => true)

)

);

}

Page 126: Twig avanzado (sf2Vigo)

function longitud(\Twig_Environment $entorno, $valor)

{

$codificacion = $entorno->getCharset();

return mb_strlen($valor, $codificacion);

}

Page 127: Twig avanzado (sf2Vigo)

class Twig_Environment{ const VERSION = '1.1.2';

// ...

$options = array_merge(array( 'debug' => false, 'charset' => 'UTF-8', 'base_template_class' => 'Twig_Template', 'strict_variables' => false, 'autoescape' => true, 'cache' => false, 'auto_reload' => null, 'optimizations' => -1, ), $options);

// ...}

Page 128: Twig avanzado (sf2Vigo)

notaciónbundle

Page 129: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

Page 130: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

MiBundle/

Resources/

views/

src/MiAplicacion/

Carpeta/

plantilla.html.twig

Page 131: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

Page 132: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

{% include 'MiBundle:Carpeta:Subcarpeta/ plantilla.html.twig' %}

Page 133: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

{% include 'MiBundle:Carpeta:Subcarpeta/ plantilla.html.twig' %}

{% include 'MiBundle:Carpeta:Subcarpeta1/ Subcarpeta2/plantilla.html.twig' %}

Page 134: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

Page 135: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

{% include'MiBundle::Carpeta/plantilla.html.twig' %}

Page 136: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

Page 137: Twig avanzado (sf2Vigo)

{% include 'MiBundle:Carpeta:plantilla.html.twig' %}

{% include'views/Carpeta/plantilla.html.twig' %}

Page 138: Twig avanzado (sf2Vigo)

opciones de configuración

Page 139: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

autoescape: true

auto_reload: ~

cache: %kernel.cache_dir%/twig

charset: %kernel.charset%

debug: %kernel.debug%

strict_variables: ~

Page 140: Twig avanzado (sf2Vigo)

$twig = new Twig_Environment($loader, array(

'debug' => true,

'strict_variables' => true,

'charset' => 'UTF-8',

'cache' => __DIR__.'/cache'

));

Page 141: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

base_template_class: Twig_Template

<?php

class __TwigTemplate_82262eae3f96052ef64432a9ddc53915 extends Twig_Template{ protected $parent;

public function __construct(Twig_Environment $env) { // ... }

Page 142: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

base_template_class: Twig_Template

<?php

class __TwigTemplate_82262eae3f96052ef64432a9ddc53915 extends Twig_Template{ protected $parent;

public function __construct(Twig_Environment $env) { // ... }

Page 143: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

exception_controller: Symfony\Bundle\TwigBundle

\Controller\ExceptionController::showAction

Page 144: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

form:

resources: [ ... ]

Page 145: Twig avanzado (sf2Vigo)

formulariospersonalizados

Page 146: Twig avanzado (sf2Vigo)

modificar campos de una plantilla

{{ form_row(noticia.url) }}

Page 147: Twig avanzado (sf2Vigo)

modificar campos de una plantilla

{{ form_row(noticia.url) }}

Label

Page 148: Twig avanzado (sf2Vigo)

modificar campos de una plantilla

{% block url_widget %}{% spaceless %} {% set type = type|default('url') %} {{ block('field_widget') }}{% endspaceless %}{% endblock url_widget %}

{{ form_row(noticia.url) }}

Label

Page 149: Twig avanzado (sf2Vigo)

{{ form_row(noticia.url) }}

{% form_theme form _self %}

{% block url_widget %} {% set type = 'url' %} <em>http://</em> {{ block('field_widget') }}{% endblock url_widget %}

Page 150: Twig avanzado (sf2Vigo)

{{ form_row(noticia.url) }}

{% form_theme form _self %}

{% block url_widget %} {% set type = 'url' %} <em>http://</em> {{ block('field_widget') }}{% endblock url_widget %}

Page 151: Twig avanzado (sf2Vigo)

{{ form_row(noticia.url) }}

{% form_theme form _self %}

{% block url_widget %} {% set type = 'url' %} <em>http://</em> {{ block('field_widget') }}{% endblock url_widget %}

Label http://

Page 152: Twig avanzado (sf2Vigo)

modificar campos de varias plantillas

{# src/.../Resources/views/Form/form.html.twig #}

{% block url_widget %}

{% set type = 'url' %}

<em>http://</em> {{ block('field_widget') }}

{% endblock url_widget %}

Page 153: Twig avanzado (sf2Vigo)

{% form_theme form 'MiBundle:Form:form.html.twig' %}

{{ form_row(noticia.titular) }}

{{ form_row(noticia.publicada) }}

{{ form_row(noticia.url) }}

Page 154: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

form:

resources: - 'form_div_layout.html.twig'

modificar todos los formularios

Page 155: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

form:

resources: - 'form_table_layout.html.twig'

Page 156: Twig avanzado (sf2Vigo)

{% use "form_div_layout.html.twig" %}

{% block field_row %}{% spaceless %} <tr> <td> {{ form_label(form, label|default(null)) }} </td> <td> {{ form_errors(form) }} {{ form_widget(form) }} </td> </tr>{% endspaceless %}{% endblock field_row %}

{# ... #}

Page 157: Twig avanzado (sf2Vigo)

{% use "form_div_layout.html.twig" %}

{% block field_row %} {# ... #}{% endblock %}

{% block form_errors %} {# ... #}{% endblock %}

{% block hidden_row %} {# ... #}{% endblock %}

{% block form_widget %} {# ... #}{% endblock %}

Page 158: Twig avanzado (sf2Vigo)

# app/config/config.yml

twig:

# ...

form:

resources: - 'MiBundle:Form:form.html.twig'

Page 159: Twig avanzado (sf2Vigo)

mostrandocampos de fecha

Page 160: Twig avanzado (sf2Vigo)

{{ form_row(fecha) }}

Page 161: Twig avanzado (sf2Vigo)

{{ form_label(fecha) }}

{{ form_errors(fecha) }}

{{ form_widget(fecha) }}

Page 162: Twig avanzado (sf2Vigo)

{{ form_label(fecha) }}

{{ form_errors(fecha) }}

{{ form_widget(fecha.year) }}

{{ form_widget(fecha.month) }}

{{ form_widget(fecha.day) }}

Page 163: Twig avanzado (sf2Vigo)

generandocódigo

Page 164: Twig avanzado (sf2Vigo)

«Twig genera con facilidad cualquier tipo

de contenido»

Page 165: Twig avanzado (sf2Vigo)

public function indexAction()

{

$em = $this->getDoctrine()->getEntityManager();

$entities = $em->getRepository('{{ bundle }}:{{ entity }}')

->findAll();

{% if 'annotation' == format %}

return array('entities' => $entities);

{% else %}

return $this->render('{{ bundle }}:

{{ entity|replace({'\\': '/'}) }}:index.html.twig',

array('entities' => $entities));

{% endif %}

}

Symfony2

Page 166: Twig avanzado (sf2Vigo)

/* page size, margins, headers & footers--------------------------------------------- */@page { size: {{ edition.page_size }};}

{% if edition.two_sided %}@page:right { margin: {{ edition.margin.top|default('25mm') }} {{ edition.margin.outter|default('20mm') }} {{ edition.margin.bottom|default('25mm') }} {{ edition.margin.inner|default('30mm') }}; @top-left { /* ... */ }

easybook3

Page 167: Twig avanzado (sf2Vigo)

{% block NamespaceDeclaration %}{% if namespace %}namespace {{ namespace }};

use {{ namespace }}\Base\{{ classname }} as Base{{ classname }};{% else %}use Base\{{ classname }} as Base{{ classname }};{% endif %}{% endblock %}

{% block DocBlock %}/** * ActiveRecord class. */{% endblock %}

{% block ClassDeclaration %}class {{ classname }} extends Base{{ classname }}{% endblock %}{{% block Body %} // add your code here{% endblock %}}

Doctrine2ActiveRecord

Page 168: Twig avanzado (sf2Vigo)

https://github.com/

cedriclombardot/

TwigGenerator

Page 169: Twig avanzado (sf2Vigo)

twig.js

Page 170: Twig avanzado (sf2Vigo)
Page 171: Twig avanzado (sf2Vigo)
Page 172: Twig avanzado (sf2Vigo)

<select id="ciudad"> {% for ciudad in ciudades %} <option value="{{ ciudad.slug }}"> {{ ciudad.nombre }} </option> {% endfor %}</select>

Page 173: Twig avanzado (sf2Vigo)

<script type="text/javascript">

var lista = document.getElementById('ciudad');

var ciudad = lista.options[lista.selectedIndex].value;

lista.onchange = function() {

var url = {{ path('portada', {'ciudad': ciudad }) }};

window.location = url;

};

</script>

Page 174: Twig avanzado (sf2Vigo)

<script type="text/javascript">

var lista = document.getElementById('ciudad');

var ciudad = lista.options[lista.selectedIndex].value;

lista.onchange = function() {

var url = {{ path('portada', {'ciudad': ciudad }) }};

window.location = url;

};

</script>

Page 175: Twig avanzado (sf2Vigo)

<script type="text/javascript">

var lista = document.getElementById('ciudad');

var ciudad = lista.options[lista.selectedIndex].value;

lista.onchange = function() {

var url = Routing.generate('portada',

{'ciudad': ciudad});

window.location = url;

};

</script>

Page 176: Twig avanzado (sf2Vigo)

<script type="text/javascript" src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>

<script type="text/javascript" src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>

<script type="text/javascript">

var lista = document.getElementById('ciudad');

var ciudad = lista.options[lista.selectedIndex].value;

lista.onchange = function() {

var url = Routing.generate('portada',

{'ciudad': ciudad});

window.location = url;

};

</script>

Page 177: Twig avanzado (sf2Vigo)

https://github.com/

FriendsOfSymfony/

FOSJsRoutingBundle

Page 178: Twig avanzado (sf2Vigo)

{% twig_js name="perfil" %}

Nombre: {{ nombre }}

Apellidos: {{ apellidos }}

Page 179: Twig avanzado (sf2Vigo)

{% twig_js name="perfil" %}

Nombre: {{ nombre }}

Apellidos: {{ apellidos }}

Page 180: Twig avanzado (sf2Vigo)

<script type="text/javascript" src="twig.js"></script><script type="text/javascript" src="perfil.js"></script>

<script type="text/javascript"> alert(Twig.render(perfil, { nombre: 'José', apellidos: 'Pérez' }));</script>

Page 181: Twig avanzado (sf2Vigo)

https://github.com/

schmittjoh/

twig.js

Page 182: Twig avanzado (sf2Vigo)

flexible

Page 183: Twig avanzado (sf2Vigo)

Tienes {{ amigos|length }} amigos

y tu nombre tiene

{{ nombre|length }} letras

{{ ... | length }}

Page 184: Twig avanzado (sf2Vigo)

Tienes {{ amigos|length }} amigos

y tu nombre tiene

{{ nombre|length }} letras

{{ ... | length }}

count( )

Page 185: Twig avanzado (sf2Vigo)

Tienes {{ amigos|length }} amigos

y tu nombre tiene

{{ nombre|length }} letras

{{ ... | length }}

count( )

strlen( )

Page 186: Twig avanzado (sf2Vigo)

{% if fecha in ['2005', '2006'] %} Eres un early-adopter{% endif %}

{% if password in login %} La contraseña no puede ser una parte del login{% endif %}

{{ ... in ... }}

Page 187: Twig avanzado (sf2Vigo)

{% if fecha in ['2005', '2006'] %} Eres un early-adopter{% endif %}

{% if password in login %} La contraseña no puede ser una parte del login{% endif %}

{{ ... in ... }}

in_array( )

Page 188: Twig avanzado (sf2Vigo)

{% if fecha in ['2005', '2006'] %} Eres un early-adopter{% endif %}

{% if password in login %} La contraseña no puede ser una parte del login{% endif %}

{{ ... in ... }}

in_array( )

strpos( )

Page 189: Twig avanzado (sf2Vigo)

{% for letra in 'a'|upper..inicial|default('z')|upper %}

{{ letra }}

{% endfor %}

Page 190: Twig avanzado (sf2Vigo)

{% for letra in 'a'|upper..inicial|default('z')|upper %}

{{ letra }}

{% endfor %}

{% filter upper %}

{% for letra in 'a'..inicial|default('z') %}

{{ letra }}

{% endfor %}

{% endfilter %}

Page 191: Twig avanzado (sf2Vigo)

{% for letra in 'a'|upper..inicial|default('z')|upper %}

{{ letra }}

{% endfor %}

{% filter upper %}

{% for letra in 'a'..inicial|default('z') %}

{{ letra }}

{% endfor %}

{% endfilter %}

{% for letra in 'a'..inicial|default('z') %}

{{ letra | upper }}

{% endfor %}

Page 192: Twig avanzado (sf2Vigo)

propiedadesvariables

Page 193: Twig avanzado (sf2Vigo)

{{ objeto.propiedad }}

Page 194: Twig avanzado (sf2Vigo)

{{ objeto.propiedad }}

Page 195: Twig avanzado (sf2Vigo)
Page 196: Twig avanzado (sf2Vigo)

{% set bundles = {

'AsseticBundle' => '.../vendor/...',

'BackendBundle' => '.../src/...',

'CiudadBundle' => '.../src/...',

'DoctrineBundle' => '.../vendor/...',

...

} %}

Page 197: Twig avanzado (sf2Vigo)

{{ bundles.'AsseticBundle' }}

NO

Page 198: Twig avanzado (sf2Vigo)

{% set nombre = 'AsseticBundle' %}

{{ bundles[nombre] }}

SI

Page 199: Twig avanzado (sf2Vigo)

{% for name in bundles|keys|sort %}

<tr>

<th>{{ name }}</th>

<td>{{ bundles[name] }}</td>

</tr>

{% endfor %}

Page 200: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..' },

{ 'movil': '9....' }

] %}

Page 201: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..' },

{ 'movil': '9....' }

] %}

{% for usuario in usuarios %}

{{ usuario.nombre }}

Contacto {{ usuario.????? }}

{% endfor %}

Page 202: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

Page 203: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

{{ usuario.contacto }}

emailresultado

Page 204: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

Page 205: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

{{ usuario[contacto] }}

ERRORresultado

Page 206: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

Page 207: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

{{ usuario[usuario.contacto] }}

[email protected]

Page 208: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

Page 209: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

{{ attribute(usuario, usuario.contacto) }}

Page 210: Twig avanzado (sf2Vigo)

{% set usuarios = [

{ 'email': '..@..', 'contacto': 'email' },

{ 'movil': '9....', 'contacto': 'movil' }

] %}

{{ attribute(usuario, usuario.contacto) }}

[email protected]

Page 211: Twig avanzado (sf2Vigo)

1.2

{{ attribute(objeto, propiedad) }}

{{ attribute(objeto, expresion) }}

{{ attribute(producto, 'foto' ~ i) }}

Page 212: Twig avanzado (sf2Vigo)

1.2

{{ attribute(objeto, metodo,

argumentos) }}

{{ attribute(objeto, metodo) }}

Page 213: Twig avanzado (sf2Vigo)

herenciadinámica

Page 214: Twig avanzado (sf2Vigo)

{% extends usuario.tipo ~ '.html.twig' %}

{# usuario = {'tipo': 'admin'} #}admin.html.twig

{# usuario = {'tipo': 'usuario'} #}usuario.html.twig

Page 215: Twig avanzado (sf2Vigo)

{% extends listado ? 'listado.html.twig' : 'tabla.html.twig' %}

Page 216: Twig avanzado (sf2Vigo)

{% extends ['primera.html.twig',

'segunda.html.twig',

'tercera.html.twig'] %}

1.2

Page 217: Twig avanzado (sf2Vigo)

{% extends 'noticia.html.twig' %}

Page 218: Twig avanzado (sf2Vigo)

{% extends [

'categoria_' ~ noticia.categoria ~ '.html.twig',

'seccion_' ~ noticia.seccion ~ '.html.twig',

'noticia.html.twig'

] %}

Page 219: Twig avanzado (sf2Vigo)

includedinámico

Page 220: Twig avanzado (sf2Vigo)

{% include ['primera.html.twig',

'segunda.html.twig',

'tercera.html.twig'] %}

1.2

Page 221: Twig avanzado (sf2Vigo)

{% include [

'lateral_' ~ noticia.categoria ~ '.html.twig',

'lateral_' ~ noticia.seccion ~ '.html.twig',

'lateral.html.twig'

] %}

Page 222: Twig avanzado (sf2Vigo)

{% set seccion = ... %}

{% include

'lateral_' ~ seccion ~ '.html.twig'

%}

Page 223: Twig avanzado (sf2Vigo)

{% set seccion = ... %}

{% include

'lateral_' ~ seccion ~ '.html.twig'

ignore missing

%}

1.2

Page 224: Twig avanzado (sf2Vigo)

{% include '...' ignore missing %}

{% include '...' ignore missing

with { ... } %}

{% include '...' ignore missing

with { ... } only %}

Page 225: Twig avanzado (sf2Vigo)

muchas gracias

Page 226: Twig avanzado (sf2Vigo)

dudas preguntas comentarios

Page 227: Twig avanzado (sf2Vigo)

linkedin.com/in/javiereguiluz

contacta

conecta

[email protected]

Page 228: Twig avanzado (sf2Vigo)

copyrightLos contenidos de esta presentación son propiedad de su autor. No se pueden reutilizar sin el consentimiento expreso de su autor.