SlideShare una empresa de Scribd logo
1 de 19
Descargar para leer sin conexión
Twig
Realizada por:
Gonzalo Alonso |@GonzaloAlonsoD
Diego Barros |@Inmzombie
Para: Hydras C&S |@hydras_cs
Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
Plantillas
Una plantilla simplemente es un archivo de texto que
puede generar cualquier formato basado en texto (HTML,
XML, CSV, etc.)
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Symfony!</title>
</head>
<body>
<h1><?php echo $page_title ?></h1>
<ul id="navigation">
<?php foreach ($navigation as $item): ?>
<li>
<a href="<?php echo $item->getHref() ?>">
<?php echo $item->getCaption() ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Symfony!</title>
</head>
<body>
<h1>{{ page_title }}</h1>
<ul id="navigation">
{% for item in navigation %}
<li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}
</ul>
</body>
</html>
Sintaxis especiales
{{ ... }} «Dice»
{% ... %} «Hace»
{# ... #} «Comenta»
{{ title|upper }} «Filtro»
La siguiente función, utiliza una etiqueta for estándar y la
función cycle para imprimir diez etiquetas div, alternando
entre clases par e impar:
{% for i in 0..10 %}
<div class="{{ cycle(['odd', 'even'], i) }}">
<!-- some HTML here -->
</div>
{% endfor %}
Manejando las vistas con Twig
¿Por qué Twig?
Las plantillas son simples y no procesan etiquetas PHP.
Está destinado a expresar la presentación, no la lógica del
programa.
● controlar el espacio en blanco
● cuenta con un recinto de seguridad
● escape de salida automático y contextual
● incluye funciones personalizadas
● filtros que sólo afectan a las plantillas
● contiene pequeñas características que facilitan la
escritura de plantillas y estas son más concisas.
<ul>
{% for user in users if user.active %}
<li>{{ user.username }}</li>
{% else %}
<li>No users found</li>
{% endfor %}
</ul>
Guardando en caché plantillas Twig
Cada plantilla Twig se compila hasta una clase
PHP nativa. Directorio app/cache/{entorno}/twig
Modo debug desactivado (prod), regenerar las
plantillas.
Modo debug (dev), compilación automática.
Plantillas, herencia y diseño
Una plantilla se puede decorar con otra. La herencia
permite tener una plantilla base.
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Welcome!{% endblock %}</title>
{% block stylesheets %}{% endblock %}
</head>
<body>
<div class="container">{% block body %}{% endblock %}</div>
{% block javascripts %}{% endblock %}
</body>
</html>
Una plantilla hija puede extender el diseño base y
reemplazar cualquiera de sus bloques.
{% extends '::base.html.twig' %}
{% block title %}My cool blog posts{% endblock %}
{% block body %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
A tener en cuenta
{% extends %} primer etiqueta.
Mas {% block %} mejor.
Contenido duplicado un nuevo {% block %}.
Obtener contenido {{ parent() }}.
{% block sidebar %}
<h3>Table of Contents</h3>
{# ... #}
{{ parent() }}
{% endblock %}
Nomenclatura y ubicación de plantillas
Symfony2 utiliza una sintaxis de cadena paquete:
controlador:plantilla
AcmeBlogBundle:Blog:index.html.twig
● AcmeBlogBundle: (paquete) src/Acme/BlogBundle.
● Blog: (controlador) Resources/views.
● index.html.twig: (plantilla) nombre real.
Nomenclatura y ubicación de plantillas
ruta final src/
Acme/BlogBundle/Resources/views/Blog/index.html.twig.
AcmeBlogBundle::layout.html.twig:
Plantilla base específica para AcmeBlogBundle
Resources/views/layout.html.twig
::base.html.twig:
Esta sintaxis se refiere a una plantilla o diseño base de la
aplicación.
app/Resources/views/
Sufijo de plantilla
paquete:controlador:plantilla.(formato).(motor)
● AcmeBlogBundle:Blog:index.html.twig
— formato HTML, motor Twig
● AcmeBlogBundle:Blog:index.html.php
— formato HTML, motor PHP
● AcmeBlogBundle:Blog:index.css.twig
— formato CSS, motor Twig
Incluyendo otras plantillas
{# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #}
<h2>{{ article.title }}</h2>
<h3 class="byline">by {{ article.authorName }}</h3>
<p>
{{ article.body }}
</p>
{# src/Acme/ArticleBundle/Resources/views/Article/list.html.twig #}
{% extends 'AcmeArticleBundle::layout.html.twig' %}
{% block body %}
<h1>Recent Articles<h1>
{% for article in articles %}
{{ include(
'AcmeArticleBundle:Article:articleDetails.html.twig',
{ 'article': article }
)}}
{% endfor %}
{% endblock %}
{ 'article': article } (arreglo con claves nombradas).
Si tuviéramos que pasar varios elementos sería:
{ 'foo': foo, 'bar': bar }.
Integrando controladores
// src/Acme/ArticleBundle/Controller/ArticleController.php
class ArticleController extends Controller
{
public function recentArticlesAction($max = 3)
{
// hace una llamada a la base de datos u otra lógica
$articles = ...;
return $this->render(
'AcmeArticleBundle:Article:recentList.html.twig',
array('articles' => $articles)
);
}
}
Integrando controladores
{# src/Acme/ArticleBundle/
Resources/views/Article/recentList.html.twig #}
{% for article in articles %}
<a href="/article/{{ article.slug }}">
{{ article.title }}
</a>
{% endfor %}
{# app/Resources/views/base.html.twig #}
<div id="sidebar">
{{ render(controller(
'AcmeArticleBundle:Article:recentArticles', { 'max': 3
}))
}}
</div>

Más contenido relacionado

Destacado

Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularioshydras_cs
 
Clase 10 validacion
Clase 10   validacionClase 10   validacion
Clase 10 validacionhydras_cs
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelohydras_cs
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útileshydras_cs
 
Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOShydras_cs
 

Destacado (8)

Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularios
 
Clase 15
Clase 15Clase 15
Clase 15
 
Clase 10 validacion
Clase 10   validacionClase 10   validacion
Clase 10 validacion
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelo
 
Cómo domar SonataAdminBundle
Cómo domar SonataAdminBundleCómo domar SonataAdminBundle
Cómo domar SonataAdminBundle
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útiles
 
Symfony 2 CMF
Symfony 2 CMFSymfony 2 CMF
Symfony 2 CMF
 
Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOS
 

Similar a Clase 6 twig

Introducción a CSS en XHTML
Introducción a CSS en XHTMLIntroducción a CSS en XHTML
Introducción a CSS en XHTMLOmar Sosa-Tzec
 
Introduccion a css
Introduccion a cssIntroduccion a css
Introduccion a csscatalan21
 
Html 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la WebHtml 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la Webjcremiro
 
Nuevas etiquetas en html5
Nuevas etiquetas en html5Nuevas etiquetas en html5
Nuevas etiquetas en html5Oscar Naranjo
 
Introducción al Desarrollo Web
Introducción al Desarrollo WebIntroducción al Desarrollo Web
Introducción al Desarrollo WebJorge Pirela
 
Etiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje htmlEtiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje htmlDoraliza Hugo Vera
 
Deber de Programación Web / Etiquetas mas utilizadas del lenguaje html
Deber de Programación Web / Etiquetas mas utilizadas del lenguaje htmlDeber de Programación Web / Etiquetas mas utilizadas del lenguaje html
Deber de Programación Web / Etiquetas mas utilizadas del lenguaje htmlDoraliza Hugo Vera
 
Nuevas etiquetas en html5
Nuevas etiquetas en html5Nuevas etiquetas en html5
Nuevas etiquetas en html5Oscar Naranjo
 
Wp config.php
Wp config.phpWp config.php
Wp config.phpgregozz
 
Wp config.php
Wp config.phpWp config.php
Wp config.phpgregozz
 
MEJORES - Curso-HTML-+-CSS.pdf
MEJORES - Curso-HTML-+-CSS.pdfMEJORES - Curso-HTML-+-CSS.pdf
MEJORES - Curso-HTML-+-CSS.pdfyanpier1
 

Similar a Clase 6 twig (20)

05 desarrollocss (3)
05 desarrollocss (3)05 desarrollocss (3)
05 desarrollocss (3)
 
Html actividades 1
Html actividades  1Html actividades  1
Html actividades 1
 
Presentación CSS y HTML en Gummurcia
Presentación CSS y HTML en GummurciaPresentación CSS y HTML en Gummurcia
Presentación CSS y HTML en Gummurcia
 
Introducción a CSS en XHTML
Introducción a CSS en XHTMLIntroducción a CSS en XHTML
Introducción a CSS en XHTML
 
Introduccion a css
Introduccion a cssIntroduccion a css
Introduccion a css
 
Aprendiendo PHP
Aprendiendo PHPAprendiendo PHP
Aprendiendo PHP
 
CSS
CSSCSS
CSS
 
Diseño de paginas con html1
Diseño de paginas con html1Diseño de paginas con html1
Diseño de paginas con html1
 
Html 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la WebHtml 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la Web
 
Nuevas etiquetas en html5
Nuevas etiquetas en html5Nuevas etiquetas en html5
Nuevas etiquetas en html5
 
Introducción al Desarrollo Web
Introducción al Desarrollo WebIntroducción al Desarrollo Web
Introducción al Desarrollo Web
 
Etiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje htmlEtiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje html
 
Deber de Programación Web / Etiquetas mas utilizadas del lenguaje html
Deber de Programación Web / Etiquetas mas utilizadas del lenguaje htmlDeber de Programación Web / Etiquetas mas utilizadas del lenguaje html
Deber de Programación Web / Etiquetas mas utilizadas del lenguaje html
 
Deber de Programacion Web
Deber de Programacion WebDeber de Programacion Web
Deber de Programacion Web
 
Laboratorio 03
Laboratorio 03Laboratorio 03
Laboratorio 03
 
Nuevas etiquetas en html5
Nuevas etiquetas en html5Nuevas etiquetas en html5
Nuevas etiquetas en html5
 
Wp config.php
Wp config.phpWp config.php
Wp config.php
 
Wp config.php
Wp config.phpWp config.php
Wp config.php
 
Apuntes de HTML
Apuntes de HTMLApuntes de HTML
Apuntes de HTML
 
MEJORES - Curso-HTML-+-CSS.pdf
MEJORES - Curso-HTML-+-CSS.pdfMEJORES - Curso-HTML-+-CSS.pdf
MEJORES - Curso-HTML-+-CSS.pdf
 

Más de hydras_cs

Clase 13 seguridad
Clase 13   seguridad Clase 13   seguridad
Clase 13 seguridad hydras_cs
 
Clase 10 formularios
Clase 10   formulariosClase 10   formularios
Clase 10 formularioshydras_cs
 
Clase 14 doctrine - subir archivos
Clase 14   doctrine - subir archivosClase 14   doctrine - subir archivos
Clase 14 doctrine - subir archivoshydras_cs
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routinghydras_cs
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasoshydras_cs
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktophydras_cs
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentaleshydras_cs
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2hydras_cs
 

Más de hydras_cs (9)

Clase 13 seguridad
Clase 13   seguridad Clase 13   seguridad
Clase 13 seguridad
 
Clase 10 formularios
Clase 10   formulariosClase 10   formularios
Clase 10 formularios
 
Clase 14 doctrine - subir archivos
Clase 14   doctrine - subir archivosClase 14   doctrine - subir archivos
Clase 14 doctrine - subir archivos
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routing
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktop
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentales
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2
 

Clase 6 twig

  • 1. Twig Realizada por: Gonzalo Alonso |@GonzaloAlonsoD Diego Barros |@Inmzombie Para: Hydras C&S |@hydras_cs Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
  • 2. Plantillas Una plantilla simplemente es un archivo de texto que puede generar cualquier formato basado en texto (HTML, XML, CSV, etc.)
  • 3. <!DOCTYPE html> <html> <head> <title>Welcome to Symfony!</title> </head> <body> <h1><?php echo $page_title ?></h1> <ul id="navigation"> <?php foreach ($navigation as $item): ?> <li> <a href="<?php echo $item->getHref() ?>"> <?php echo $item->getCaption() ?> </a> </li> <?php endforeach; ?> </ul> </body> </html>
  • 4. <!DOCTYPE html> <html> <head> <title>Welcome to Symfony!</title> </head> <body> <h1>{{ page_title }}</h1> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> </body> </html>
  • 5. Sintaxis especiales {{ ... }} «Dice» {% ... %} «Hace» {# ... #} «Comenta» {{ title|upper }} «Filtro»
  • 6. La siguiente función, utiliza una etiqueta for estándar y la función cycle para imprimir diez etiquetas div, alternando entre clases par e impar: {% for i in 0..10 %} <div class="{{ cycle(['odd', 'even'], i) }}"> <!-- some HTML here --> </div> {% endfor %}
  • 7. Manejando las vistas con Twig ¿Por qué Twig? Las plantillas son simples y no procesan etiquetas PHP. Está destinado a expresar la presentación, no la lógica del programa. ● controlar el espacio en blanco ● cuenta con un recinto de seguridad ● escape de salida automático y contextual ● incluye funciones personalizadas ● filtros que sólo afectan a las plantillas
  • 8. ● contiene pequeñas características que facilitan la escritura de plantillas y estas son más concisas. <ul> {% for user in users if user.active %} <li>{{ user.username }}</li> {% else %} <li>No users found</li> {% endfor %} </ul>
  • 9. Guardando en caché plantillas Twig Cada plantilla Twig se compila hasta una clase PHP nativa. Directorio app/cache/{entorno}/twig Modo debug desactivado (prod), regenerar las plantillas. Modo debug (dev), compilación automática.
  • 10. Plantillas, herencia y diseño Una plantilla se puede decorar con otra. La herencia permite tener una plantilla base. <!DOCTYPE html> <html> <head> <title>{% block title %}Welcome!{% endblock %}</title> {% block stylesheets %}{% endblock %} </head> <body> <div class="container">{% block body %}{% endblock %}</div> {% block javascripts %}{% endblock %} </body> </html>
  • 11. Una plantilla hija puede extender el diseño base y reemplazar cualquiera de sus bloques. {% extends '::base.html.twig' %} {% block title %}My cool blog posts{% endblock %} {% block body %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
  • 12. A tener en cuenta {% extends %} primer etiqueta. Mas {% block %} mejor. Contenido duplicado un nuevo {% block %}. Obtener contenido {{ parent() }}. {% block sidebar %} <h3>Table of Contents</h3> {# ... #} {{ parent() }} {% endblock %}
  • 13. Nomenclatura y ubicación de plantillas Symfony2 utiliza una sintaxis de cadena paquete: controlador:plantilla AcmeBlogBundle:Blog:index.html.twig ● AcmeBlogBundle: (paquete) src/Acme/BlogBundle. ● Blog: (controlador) Resources/views. ● index.html.twig: (plantilla) nombre real.
  • 14. Nomenclatura y ubicación de plantillas ruta final src/ Acme/BlogBundle/Resources/views/Blog/index.html.twig. AcmeBlogBundle::layout.html.twig: Plantilla base específica para AcmeBlogBundle Resources/views/layout.html.twig ::base.html.twig: Esta sintaxis se refiere a una plantilla o diseño base de la aplicación. app/Resources/views/
  • 15. Sufijo de plantilla paquete:controlador:plantilla.(formato).(motor) ● AcmeBlogBundle:Blog:index.html.twig — formato HTML, motor Twig ● AcmeBlogBundle:Blog:index.html.php — formato HTML, motor PHP ● AcmeBlogBundle:Blog:index.css.twig — formato CSS, motor Twig
  • 16. Incluyendo otras plantillas {# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #} <h2>{{ article.title }}</h2> <h3 class="byline">by {{ article.authorName }}</h3> <p> {{ article.body }} </p>
  • 17. {# src/Acme/ArticleBundle/Resources/views/Article/list.html.twig #} {% extends 'AcmeArticleBundle::layout.html.twig' %} {% block body %} <h1>Recent Articles<h1> {% for article in articles %} {{ include( 'AcmeArticleBundle:Article:articleDetails.html.twig', { 'article': article } )}} {% endfor %} {% endblock %} { 'article': article } (arreglo con claves nombradas). Si tuviéramos que pasar varios elementos sería: { 'foo': foo, 'bar': bar }.
  • 18. Integrando controladores // src/Acme/ArticleBundle/Controller/ArticleController.php class ArticleController extends Controller { public function recentArticlesAction($max = 3) { // hace una llamada a la base de datos u otra lógica $articles = ...; return $this->render( 'AcmeArticleBundle:Article:recentList.html.twig', array('articles' => $articles) ); } }
  • 19. Integrando controladores {# src/Acme/ArticleBundle/ Resources/views/Article/recentList.html.twig #} {% for article in articles %} <a href="/article/{{ article.slug }}"> {{ article.title }} </a> {% endfor %} {# app/Resources/views/base.html.twig #} <div id="sidebar"> {{ render(controller( 'AcmeArticleBundle:Article:recentArticles', { 'max': 3 })) }} </div>