SlideShare una empresa de Scribd logo
Twig, cuando Django
encontró a Symfony
Javier Eguiluz



JORNADAS SYMFONY 2011 1-3 JULIO, CASTELLÓN DESYMFONY.COM
Patrocinadores   Patrocinadores   Patrocinadores
Colaboradores      BRONCE            PLATA        PLATINO y ORO    JORNADAS SYMFONY 2011 están patrocinadas por
importante
Algunas partes de esta presentación
no se pueden entender bien sin ver
el vídeo de su impartición.

Puedes acceder al vídeo en
http://bit.ly/sf-tutorial-twig
¿Qué es Twig?
Desymfony 2011 - Twig
« template engine »
<mensaje>
Hola         <p>Hola
               <contenido>
{ nombre }       Hola José
             José</p>
                 ...
...          ......
...          ...
               </contenido>
             </mensaje>
template engine
        +
template language
twig se puede usar en




               Cualquier
Symfony2     proyecto PHP
Twig para
maquetadores
{# ... #}
{% ... %}
{{ ... }}
{*   *}   <%#   %>   {#   #}
{     }   <%    %>   {%   %}
{$    }   <%=   %>   {{   }}
{% if usuario is defined %}
 Hola {{ usuario.nombre }}
 hoy es {{ 'now' | date('d/m/Y') }}
{% endif %}
Mostrar
información
<p> Hola {{ usuario }}
Tienes {{ edad }} años y vives en
{{ ciudad }} </p>
<p> Hola {{ usuario.nombre }}
Tienes {{ usuario.edad }} años y
vives en {{ usuario.ciudad }} </p>
Modificar
información
{{ descripcion }}
{{ descripcion | striptags }}
{{ etiquetas | join(", ") }}
Hay {{ articulos | length }}
         artículos
{{ titular | striptags | upper }}
<strong>Lorem ipsum</strong>
dolor sit <em>amet</em>
{{ biografia }}
&lt;strong&gt;Lorem ipsum&lt;/
strong&gt; dolor sit
&lt;em&gt;amet&lt;/em&gt;
{{ biografia | raw }}
Espacios
en blanco
<ul>
  <li>
     <a ... >XXX</a>
  </li>

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

  <li>
     ...
{% endspaceless %}
<ul><li><a ... >XXX</a></li><li>...
Herencia
de plantillas
« Lo más poderoso
     de Twig »

 Fuente: documentación oficial de Twig
layout.twig
layout.twig




portada.twig          contacto.twig
<html> <head> ... </head>
<body>
  <h1>                </h1>



</body></html>
layout.twig
<html> <head> ... </head>
<body>
  <h1>
   {% block titulo %}{% endblock %}
  </h1>

  {% block cuerpo %}{% endblock %}
</body></html>
portada.twig
{% extends "layout.twig" %}
{% block titulo %}
 Portada
{% endblock %}
{% block cuerpo %}
 Lorem ipsum ...
{% endblock %}
contacto.twig
{% extends "layout.twig" %}
{% block titulo %}
 Contacta con nosotros
{% endblock %}
{% block cuerpo %}
 Duis aute irure dolor in ...
{% endblock %}
1
{% block titulo %}
 Portada
{% endblock %}

{% block titulo "Portada" %}
contacto.twig                   2
{% extends "layout.twig" %}
{% block cuerpo %}
 Duis aute irure dolor in ...
{% endblock %}
layout.twig               3
   ...
   <h1>
     {% block titulo %}
       Lorem Ipsum
     {% endblock %}
   </h1>
   ...
Razones para
   usar Twig
1. Muy fácil de aprender (intuitivo)
2. Suficiente / completo
3. Plantillas concisas y bonitas
Twig para
programadores
Variables
{{ usuario.nombre }}
1.   $usuario["nombre"]
2.   $usuario!>nombre
3.   $usuario!>nombre()
4.   $usuario!>getNombre()
5.   $usuario!>isNombre()
6.   null
{{ usuario.nombre }}
{{ usuario["nombre"] }}
{% set var = "Mi variable" %}
{% set ivas = [4, 8, 18] %}
{%
set nombreCompleto =
 nombre ~ apellidos
%}
{% set perfil %}
  {{ apellidos }}, {{ nombre }}
  {{ edad }} años
  Página: {{ url }}
{% endset %}
Espacios
en blanco
{% spaceless %}
{{ descripcion }}
{{! descripcion }}
{{ descripcion !}}
{{! descripcion !}}
{{ descripcion }}
{{! descripcion }} ltrim(descripcion)
{{ descripcion !}} rtrim(descripcion)
{{! descripcion !}} trim(descripcion)
Filtros
{{ titular | striptags | upper }}
{% filter striptags | upper %}
titular
{% endfilter %}
{{ articulo | truncate(150) }}
{{ articulo | truncate(150, true) }}
Mecanismo
 de escape
« Twig por defecto escapa
   todas las variables »
{{ variable | raw }}
{{ variable | e }}
twig:
  autoescape: true
              false
              js
Estructura
de control for
Taversable
                  Countable




                 {
{% for articulo in articulos %}
  ...
{% endfor %}
{% for i in 0..10 %}
 ...
{% endfor %}
{% for i in 'a'..'z' %}
 ...
{% endfor %}
{% for articulo in articulos %}
  ...
{% else %}
  No existen artículos
{% endfor %}
{% for . in . %}   {% for . in . %}
  ...                ...
{% empty %}        {% else %}
  ...                ...
{% endfor %}       {% endfor %}
variables dentro del for
loop.index    loop.revindex
loop.index0   loop.revindex0

loop.first
              loop.parent
loop.last
loop.length
{% for articulo in articulos %}
 articulo número {{ loop.index }}
{% endfor %}
{% for articulo in articulos %}
 {% if not loop.first %}
    Anterior
 {% endif %}
 {% if not loop.last %}
   Siguiente
 {% endif %}
{% endfor %}
{% for seccion in secciones %}
 {% for categoria in categorias %}
    {{ loop.parent.loop.index }}
    {{ loop.index }}
 {% endfor %}
{% endfor %}
{% for clave in variable | keys %}
 ...
{% endfor %}
{% for clave, valor in variable %}
 ...
{% endfor %}
Estructura
de control if
{% if conectado %}
  ...
{% elseif registrado %}
  ...
{% else %}
  ...
{% endif %}
{% if numero is divisibleby(3) %}
{% if texto is none %}

{% if numero is even %}
 {% if numero is odd %}
{% if descripcion is empty %}

  if (descripcion == null ||
      descripcion == false ||
      descripcion == "") {
    ...
  }
{{ app.user ? 'Mi perfil' :
               'Registrate' }}
Herencia
de plantillas
{% extends "layout.twig" %}
{% extends seccion ~ "_layout.twig" %}
{% extends
seccion | default("principal") ~
"_layout.twig"
%}
{% extends
app.user ? "conectado.html" :
           "anonimo.html"
%}
layout.twig
<html>
<head>
  <title>   </title>
</head>
<body>
    <h1>    </h1>
<html>
<head>
                          layout.twig
  <title>
    {% block titulo %}{% endblock %}
  </title>
</head>
<body>
  <h1>
    {% block titulo %}{% endblock %}
  </h1>
<html>
<head>                      layout.twig
  <title>
    {% block titulo %}{% endblock %}
  </title>
</head>
<body>
  <h1>
     {{ block('title') }}
  </h1>
{% block lateral %}
{% endblock %}        ponencias.twig
   layout.twig
ponencias.twig

{% block lateral %}
  <h3>¿Echas en falta algún tema?</h3>
  <p>...</p>

  {{ parent( ) }}
{% endblock %}
{% block contenidos %}
  {% block principal %}
     ...
  {% endblock %}
{% endblock %}
{% block contenidos %}
  {% block principal %}
     ...
  {% endblock principal %}
{% endblock contenidos %}
Herencia
horizontal
portada.twig
...
{% for articulo in articulos %}
    {{ articulo. titulo }}
{% endfor %}
...
listado.twig


{% for articulo in articulos %}
  {{ articulo. titulo }}
{% endfor %}
portada.twig


...
{% include "listado.twig" %}
...
portada.twig


...
{% include "listado.twig" only %}
...
{% include "listado.html" with
{ 'articulos': articulos } only %}
listado.twig


{% for articulo items %} %}
        item in in articulos
  {{ articulo. titulo }}
     item. titulo }}
{% endfor %}
{% include "listado.html"
   with { 'items': articulos } %}
{% set articulos =
   destacados | merge(otros) %}

{% include "listado.html"
   with { 'items': articulos }
   only %}
Extensiones
« Twig está construido
   con extensiones »
Macro     Tag
Filtro    Test
Función   Operator
Global
Para generar   Para modificar
  contenido       contenido

 Macro
                  Filtro
Función
https://github.com /
fabpot /
Twig!extensions
Filtros
{{ ponente.biografia | auto_link_text }}
DesymfonyBundleExtensionDesymfonyTwigExtension.php

class DesymfonyTwigExtension extends Twig_Extension {
   public function getFilters() {
     return array(
        'auto_link_text' => new Twig_Filter_Method (
            $this, 'auto_link_text'
        ));
   }

  static public function auto_link_text($string) {
     ...
     return $string;
  }
{{ ponente.biografia
   | auto_link_text
   | raw }}
DesymfonyBundleExtensionDesymfonyTwigExtension.php




public function getFilters() {
  return array(
   'auto_link_text' => new Twig_Filter_Method (
       $this, 'auto_link_text'
   ));
}
DesymfonyBundleExtensionDesymfonyTwigExtension.php




public function getFilters() {
  return array(
   'auto_link_text' => new Twig_Filter_Method (
       $this, 'auto_link_text',
       array('is_safe' => array('html'))
   ));
}
{{ ponente.biografia
   | auto_link_text
   | raw }}
Macros
« El equivalente en Twig a las
funciones de programación »
{% macro input(name, type) %}
  <input type="{{ type }}"
         name="{{ name }}" />
{% endmacro %}
{% macro input(name, type) %}
  ...
{% endmacro %}

<div>{{ _self.input('edad') }}</div>

 <input type="" name="edad" />
{% macro input(name, type) %}
  ...
{% endmacro %}

<div>{{ _self.input('edad', 'text') }}</div>


<input type="text" name="edad" />
{% macro input(name, type) %}
<input type="{{ type | default('text') }}"
      name="{{ name }}" />
{% endmacro %}
formularios.twig

{% macro input(name, type) %}
  <input type="{{ type }}"
         name="{{ name }}" />
{% endmacro %}
pagina.twig
{% import "formularios.twig"
   as formularios %}
<div>
  {{ formularios.input('edad') }}
</div>
Twig en
Symfony2
{{"path( ) }}   {% trans %}
 {{ url( ) }}

   caché        las plantillas se
 configurada      cargan solas
app/cache/dev/twig
/* DesymfonyBundle:Default:index.html.twig */
class __TwigTemplate_8e822424720fee931876b7c05a9112b0 extends Twig_Template
{
   protected $parent;

  public function __construct(Twig_Environment $env)
  {
    parent::__construct($env);

    $this!>blocks = array(
       'title' => array($this, 'block_title'),
       'pageid' => array($this, 'block_pageid'),
       'contenido' => array($this, 'block_contenido'),
    );
Twig fuera de
   Symfony2
1. Descargar Twig
2. Registrar su autoloader
EN LA PRÁCTICA




     Usando Twig en un
    proyecto PHP propio
Referencias
http://twig!project.org
Razones para
   usar Twig
Proyecto maduro y
    completo
La ¿única? posibilidad
para los maquetadores
Fácilmente extensible
Rendimiento
comparable a PHP
contacto
javier.eguiluz@gmail.com
twitter.com/javiereguiluz
linkedin.com/in/javiereguiluz

Más contenido relacionado

ODP
Tutorial3 Desymfony - La Vista. Twig
Marcos Labad
 
PDF
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Javier Eguiluz
 
PDF
Symfony2, Jornadas Symfony
Javier Eguiluz
 
PDF
Twig avanzado (sf2Vigo)
Javier Eguiluz
 
PDF
Clase 2 conceptos fundamentales
hydras_cs
 
PDF
Código mantenible, en Wordpress.
Asier Marqués
 
PPT
Php y MySQL
Karis
 
PDF
Código Bonito con PHP
Mauricio Gelves
 
Tutorial3 Desymfony - La Vista. Twig
Marcos Labad
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Javier Eguiluz
 
Symfony2, Jornadas Symfony
Javier Eguiluz
 
Twig avanzado (sf2Vigo)
Javier Eguiluz
 
Clase 2 conceptos fundamentales
hydras_cs
 
Código mantenible, en Wordpress.
Asier Marqués
 
Php y MySQL
Karis
 
Código Bonito con PHP
Mauricio Gelves
 

La actualidad más candente (20)

ODP
Desarrollo de aplicaciones web usando Catalyst y jQuery
Javier P.
 
DOCX
Julissarodriguezvilca
julissaJRV
 
PDF
Curso php y_mysql
Vero Pailiacho
 
DOCX
Guía práctica desarrollo web con php 5 y my sql
Jesus Machicado Gomez
 
PDF
WordCamp Cantabria - Código mantenible con WordPress
Asier Marqués
 
PDF
Introducción a PHP - Programador PHP - UGR
Juan Belón Pérez
 
PDF
Introducción a recaptcha 3.0
Jesús Ayús
 
PDF
Curso Drupal. Creacion de modulos en Drupal
Mediaglobe Innova
 
PPT
Php Basico
Eliecer Cedano
 
PPTX
Exposicion de php
angie barre
 
KEY
Introducción a Flask
Luis Cruz Campos
 
PDF
4.Programación con PHP y MySQL
Ramiro Estigarribia Canese
 
PPTX
3 curso php
Jesus Luque Medina
 
PDF
Tema2 3
Juan Timoteo Cori
 
PDF
Composer: Gestionando dependencias en PHP
Fco Javier Núñez Berrocoso
 
PPTX
Php1 sesión 6
Rodrigo Cabrera
 
DOCX
Informe grupal f_arinango_ cuenca
paulcuenca9
 
PPTX
J query
Jonathan Abel
 
DOC
Php
cecusme
 
PDF
PHP Tema 2 - Lenguaje PHP básico
Spacetoshare
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Javier P.
 
Julissarodriguezvilca
julissaJRV
 
Curso php y_mysql
Vero Pailiacho
 
Guía práctica desarrollo web con php 5 y my sql
Jesus Machicado Gomez
 
WordCamp Cantabria - Código mantenible con WordPress
Asier Marqués
 
Introducción a PHP - Programador PHP - UGR
Juan Belón Pérez
 
Introducción a recaptcha 3.0
Jesús Ayús
 
Curso Drupal. Creacion de modulos en Drupal
Mediaglobe Innova
 
Php Basico
Eliecer Cedano
 
Exposicion de php
angie barre
 
Introducción a Flask
Luis Cruz Campos
 
4.Programación con PHP y MySQL
Ramiro Estigarribia Canese
 
3 curso php
Jesus Luque Medina
 
Composer: Gestionando dependencias en PHP
Fco Javier Núñez Berrocoso
 
Php1 sesión 6
Rodrigo Cabrera
 
Informe grupal f_arinango_ cuenca
paulcuenca9
 
J query
Jonathan Abel
 
Php
cecusme
 
PHP Tema 2 - Lenguaje PHP básico
Spacetoshare
 
Publicidad

Similar a Desymfony 2011 - Twig (20)

PDF
Twig, el nuevo motor de plantillas de Drupal 8
Javier Eguiluz
 
ODP
Curso de Django | Django Course
aleperalta
 
PPTX
Twig
Joan Cruz
 
KEY
Presentación CSS y HTML en Gummurcia
Manuel Villagordo Vera
 
PDF
Clase 6 twig
hydras_cs
 
PDF
Django: el framework web definitivo
Ander Beaskoetxea
 
KEY
Introducción a DJango
Luis Cruz Campos
 
PDF
Jsp directiva page
jubacalo
 
PDF
Documento de referencia XHTML + CSS + JAVASCRIPT
Andres Bedoya Tobon
 
PDF
Curso de HTML5
Carlos Azaustre
 
PPT
Introducción a ASP.NET
pabloesp
 
PDF
Primeros pasos Symfony PHPVigo
PHP Vigo
 
PDF
Acceptance testing with Steak and Capybara
Sergio Gil
 
DOCX
Php excel
pcuseth
 
PPT
HTML5 la revolución!
maspixel
 
PDF
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Atenea tech
 
PDF
Javascript en proyectos reales: jQuery
David Arango
 
PPT
Diseño de páginas Web con HTML
Javier
 
Twig, el nuevo motor de plantillas de Drupal 8
Javier Eguiluz
 
Curso de Django | Django Course
aleperalta
 
Twig
Joan Cruz
 
Presentación CSS y HTML en Gummurcia
Manuel Villagordo Vera
 
Clase 6 twig
hydras_cs
 
Django: el framework web definitivo
Ander Beaskoetxea
 
Introducción a DJango
Luis Cruz Campos
 
Jsp directiva page
jubacalo
 
Documento de referencia XHTML + CSS + JAVASCRIPT
Andres Bedoya Tobon
 
Curso de HTML5
Carlos Azaustre
 
Introducción a ASP.NET
pabloesp
 
Primeros pasos Symfony PHPVigo
PHP Vigo
 
Acceptance testing with Steak and Capybara
Sergio Gil
 
Php excel
pcuseth
 
HTML5 la revolución!
maspixel
 
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Atenea tech
 
Javascript en proyectos reales: jQuery
David Arango
 
Diseño de páginas Web con HTML
Javier
 
Publicidad

Más de Javier Eguiluz (19)

PDF
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
Javier Eguiluz
 
PDF
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
Javier Eguiluz
 
PDF
Mastering Twig (DrupalCon Barcelona 2015)
Javier Eguiluz
 
PDF
Symfony tips and tricks
Javier Eguiluz
 
PDF
Silex al límite
Javier Eguiluz
 
PDF
Twig tips and tricks
Javier Eguiluz
 
PDF
Silex, desarrollo web ágil y profesional con PHP
Javier Eguiluz
 
PDF
Twig, los mejores trucos y técnicas avanzadas
Javier Eguiluz
 
PDF
Wallpaper Notifier
Javier Eguiluz
 
PDF
Backend (sf2Vigo)
Javier Eguiluz
 
PDF
Desymfony 2012 - Concurso de diseño
Javier Eguiluz
 
PDF
Desymfony 2011 - Tutorial #5: Backend
Javier Eguiluz
 
PDF
Desymfony 2011 - Introducción a Symfony2
Javier Eguiluz
 
PDF
Curso Symfony - Anexos
Javier Eguiluz
 
PDF
Curso Symfony - Clase 5
Javier Eguiluz
 
PDF
Curso Symfony - Clase 4
Javier Eguiluz
 
PDF
Curso Symfony - Clase 3
Javier Eguiluz
 
PDF
Curso Symfony - Clase 2
Javier Eguiluz
 
PDF
Curso Symfony - Clase 1
Javier Eguiluz
 
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
Javier Eguiluz
 
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
Javier Eguiluz
 
Mastering Twig (DrupalCon Barcelona 2015)
Javier Eguiluz
 
Symfony tips and tricks
Javier Eguiluz
 
Silex al límite
Javier Eguiluz
 
Twig tips and tricks
Javier Eguiluz
 
Silex, desarrollo web ágil y profesional con PHP
Javier Eguiluz
 
Twig, los mejores trucos y técnicas avanzadas
Javier Eguiluz
 
Wallpaper Notifier
Javier Eguiluz
 
Backend (sf2Vigo)
Javier Eguiluz
 
Desymfony 2012 - Concurso de diseño
Javier Eguiluz
 
Desymfony 2011 - Tutorial #5: Backend
Javier Eguiluz
 
Desymfony 2011 - Introducción a Symfony2
Javier Eguiluz
 
Curso Symfony - Anexos
Javier Eguiluz
 
Curso Symfony - Clase 5
Javier Eguiluz
 
Curso Symfony - Clase 4
Javier Eguiluz
 
Curso Symfony - Clase 3
Javier Eguiluz
 
Curso Symfony - Clase 2
Javier Eguiluz
 
Curso Symfony - Clase 1
Javier Eguiluz
 

Último (20)

PDF
Trabajo Tecnología Diagrama De Pareto.pdf
srsantiagof09
 
PDF
Conceptos básicos de programación - Paula Obando
edeppaulaobando
 
PDF
Trabajo Tecnología #2 Periodo (1).pdf ajdj
colgess2
 
PDF
Webinar - Migrating to Ballerina from MuleSoft and Tibco.pdf
Profesia Srl, Lynx Group
 
PDF
Tecnología 2do período Eliana valencia.
ElianaValencia28
 
PPTX
Ingeniería Genética y Obtención de Insulina por Escherichia.pptx
ElbaCristinaMendoza
 
PDF
VelezOrtiz_Yadira_M1S3AI6 Presentación digital
Yadira Elizabeth Vélez Ortiz
 
PDF
Conceptos básicos de programación trabajo grupal
darcyrobayo2007
 
PDF
Documentos Básicos De Programación.pdf.
kathedelgadoarredond
 
PDF
El candado imposible de abrir | Seguridad máxima explicada - Revista Técnica ...
Cerrajero 365 Valencia
 
DOCX
#USOLASTICPARA Proyecto integrador M1S4PI JuarezGonzalez _Maria_M1S4PI.doc...
MariaSusanaJuarezGon
 
DOCX
Informe de Tecnologia Diagrama de Pareto Juan Martinez, Alexandra Delgado, L...
edepisabellanaranjo
 
PPTX
Telecomunicaciones proyeccion de ventas 2025.pptx
miguelolivarren2
 
PDF
Trabajo Tecnología #2 Periodo (2).pdfjdjfjf
ssuser57b6e41
 
PDF
Chile Claro Swap Project Guidebook Version 1.4.1b.pdf
DarkoAlmanzaTrujillo
 
PPTX
Normas de la sala de informática Segundo
SilviaFernandaCesped
 
PDF
DIAGRAMA DE PARETO M. Camila Duque Loaiz
MariacamilaDuqueloai
 
PDF
Excel avanzado trabajo grupal tecnologia
mapaulahiguita
 
DOCX
tecnologia actividad segundo periodo.docx
samuelcuaran
 
PDF
Solución actividad de Diagrama de Pareto
MaraJos722801
 
Trabajo Tecnología Diagrama De Pareto.pdf
srsantiagof09
 
Conceptos básicos de programación - Paula Obando
edeppaulaobando
 
Trabajo Tecnología #2 Periodo (1).pdf ajdj
colgess2
 
Webinar - Migrating to Ballerina from MuleSoft and Tibco.pdf
Profesia Srl, Lynx Group
 
Tecnología 2do período Eliana valencia.
ElianaValencia28
 
Ingeniería Genética y Obtención de Insulina por Escherichia.pptx
ElbaCristinaMendoza
 
VelezOrtiz_Yadira_M1S3AI6 Presentación digital
Yadira Elizabeth Vélez Ortiz
 
Conceptos básicos de programación trabajo grupal
darcyrobayo2007
 
Documentos Básicos De Programación.pdf.
kathedelgadoarredond
 
El candado imposible de abrir | Seguridad máxima explicada - Revista Técnica ...
Cerrajero 365 Valencia
 
#USOLASTICPARA Proyecto integrador M1S4PI JuarezGonzalez _Maria_M1S4PI.doc...
MariaSusanaJuarezGon
 
Informe de Tecnologia Diagrama de Pareto Juan Martinez, Alexandra Delgado, L...
edepisabellanaranjo
 
Telecomunicaciones proyeccion de ventas 2025.pptx
miguelolivarren2
 
Trabajo Tecnología #2 Periodo (2).pdfjdjfjf
ssuser57b6e41
 
Chile Claro Swap Project Guidebook Version 1.4.1b.pdf
DarkoAlmanzaTrujillo
 
Normas de la sala de informática Segundo
SilviaFernandaCesped
 
DIAGRAMA DE PARETO M. Camila Duque Loaiz
MariacamilaDuqueloai
 
Excel avanzado trabajo grupal tecnologia
mapaulahiguita
 
tecnologia actividad segundo periodo.docx
samuelcuaran
 
Solución actividad de Diagrama de Pareto
MaraJos722801
 

Desymfony 2011 - Twig