Twig es un motor de plantillas que proporciona una sintaxis simple para generar documentos de texto. Ofrece características como herencia de plantillas, bloques, filtros y bucles. Twig compila las plantillas a clases PHP para un rendimiento óptimo. Las plantillas se almacenan en directorios y se vinculan a controladores mediante nombres de ruta de paquete.
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
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/
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)
);
}
}