Twig

Se explica de forma extendida el uso del motor de plantillas Twig dentro del framework como vista.

Pasar variables a la vista

Podemos pasar variables a nuestra vista para su uso, éstas pueden contener cualquier cosa, pueden ser objetos, arreglos, matríces, cubos, cubos dentro de cubos, enteros, booleanos, strings, flotantes, etc. Para ello sólo hemos de pasarlos dentro de un arreglo desde nuestro controlador, vamos a tomar de ejemplo la vista home.twig y el controlador homeController, abrimos el controlador del home y vamos al a línea en la que se renderiza la vista.

/*
  * render() recibe dos parámetros, el primero es la vista a renderizar, y el segundo es un arreglo con las variables
  * que deseamos pasar a nuestra vista, ya sabemos qué contenido pueden tener las mismas.
*/
echo $this->template->render('home/home', array(
    'mivariable' => 'Mundo'
));

Ahora desde home/home.twig podemos simplemente escribir en algún punto de nuestro HTML lo siguiente:

Hola {{ mivariable }}

Esto nos imprimirá en pantalla Hola Mundo. Se puede notar que el nombre del índice asociativo que coloquemos en el arreglo será el nombre de la variable que tenemos que usar en la vista. Podemos pasar cuantas variables queramos:

echo $this->template->render('home/home', array(
    'mivariable' => 'Mundo',
    'un_arreglo' => array('a' => 1, 'b' => 2),
    'entero' => 1,
    'booleana' => true,
    'flotante' => 1.5,
    # Para que esta instrucción no de error, obviamente debe existir Miclase en algún sitio
    'objeto' => new Miclase
));

Podríamos hacer cosas como estas:

    Hola {{ mivariable }}
En el arreglo {{ un_arreglo.a }} ó también {{ un_arreglo['a'] }}
    Uno mas dos es {{ entero + 2 }}

Simplemente usamos el operador ternario sobre la variable

    ¿Es verdad?: {{ booleana ? 'Sí' : 'No' }}
  Uno coma cinco por 10 es {{ flotante * 10 }}
//Para que esta instrucción no de error obviamente test() debe ser un método de Miclase
En el objeto que estamos instanciando, el metodo test(): {{ objeto.test() }}

Si en algún momento queremos escapar HTML, podemos hacer algo cómo

    {{ '<b>no saldré en negrilla</b>'|e }}

Definir elementos dentro de la plantilla

Para definir una variable

{% set miVariable = 1 %}

Para definir una variable que contenga una sección de código entero

{% set variable %}
    <div>
        <p>Esto es HTML</p>
    </div>
{% endset %}

Definir un arreglo secuencial

{% set miArreglo = ['Hola','Mundo'] %}

Definir un arreglo asociativo

{% set miArreglo = {'indice':'valor'} %}

Estructuras selectivas (if)

Se manejan exactamente de la misma manera, sólo cambia la sintaxis y es el único condicional que permite twig.

Podemos hacer uso del condicional IF y evaluar expresiones tal como lo hacemos en PHP, tomemos de ejemplo:

{% if true %}
    Hola es verdadero
{% else %}
  Hola es falso
{% endif %}

Para trabajar con else if sería

{% if (1 + 1) == 0 %}
    1 + 1 es igual a 0 en (Z2,+)
{% elseif (1 + 1) == 2 %}
    2 = 2
{% else %}
    ¿Qué puede ser?
{% endif %}

Todo esto, evidentemente se puede utilizar con cualquier variable que pasemos a la vista al momento de renderizar.

Operadores lógicos

Son sólamente tres:

{{ A and B }} // TRUE si tanto A como B son TRUE
{{ A or B }} // TRUE cualquiera de A o B es TRUE
{{ not A }} // TUE si A es FALSE

En caso de querer hacer un XOR

{{ (A or B) and not (A and B) }} // TRUE si A ó B es TRUE, pero no si ambos son TRUE o FALSE

Comparadores lógicos

Los típicos comparadores lógicos, excepto los particulares de PHP como ===, <>, !==, ?? y <=>

{{ A == B }} // A igual que B
{{ A != B }} // A distinto que B
{{ A < B }} // A menor que B
{{ A > B }} // A mayor que B
{{ A <= B }} // A menor o igual que B
{{ A >= B }} // A mayor o igual que B

Estructuras repetitivas

En twig sólo existe una estructura repetitiva, el for, pero es bastante dinámico ya que lo podemos utilizar como un foreach, for típico o un while.

// For desde el 0 al 10, repite 11 veces
{% for i in 0..10 %}
    {{ i }}<br />
{% endfor %}
// Foreach, iterando sobre el arreglo llamado "elemento".
{% for e in elemento %}
    {{ e }}<br />
{% endfor %}
// Foreach, iterando sobre el arreglo llamado "elemento" y mostrando sus índices.
{% for key, e in elemento %}
    La key es {{ key }} y el valor es {{ e }}
{% endfor %}
// For con else
{% for e in elemento %}
    {{ e }}<br />
{% else %}
    <p>No hay nada en el arreglo elemento.</p>
{% endfor %}
// Sólamente itera elemento, si elemento está definido. (isset)
{% for e in elemento if elemento is defined %}
    {{ e }}<br />
{% endif %}

Tratar arreglos desde la vista

Primero que nada, pasemos unos cuantos arreglo a la vista:

echo $this->template->render('home/home', array(
    'un_arreglo' => array('a' => 1, 'b' => 2),
    'otro_arreglo' => array('uno','dos')
));

Para llamarlos desde la vista, lo debemos hacer exactamente igual que en PHP.

{{ un_arreglo['b'] }} ó {{ un_arreglo.b }}
{{ otro_arreglo[0] }}

Para iterar sobre un arreglo:

{% for a in un_arreglo %}
    <p>{{ a }}</p>
{% endfor %}

Veamos como iterar sobre los elementos que hemos traído de una base de datos:

# Desde nuestro modelo tenemos
public function mimetodo() {
    return $this->db->select('*','users');
}

# Desde nuestro controlador hacemos ( obviamente debe existir el modelo Mimodelo, con el método mimetodo() dentro )
$e = new Mimodelo;
echo $this->template->render('home/home', array(
    'usuarios' => $e->mimetodo()
));

# Desde nuestra vista en home/home, simplemente iteramos como un arreglo más (en este caso matriz)
{% for u in usuarios %}
     <ul>
        <li>Id: {{ u.id }}</li>
        <li>Email: {{ u.email }}</li>
        <li>Usuario: {{ u.user}} </li>
    </ul>
    <br />
{% endfor %}

Usar helpers y funciones desde la vista

Para utilizar un helper, este debe ser previamente cargado desde el controlador que renderiza la vista, para ver como cargar un helper, ir a la documentación acerca de los Helpers

# Desde nuestro controlador
Helper::load('files',$this->template);
echo $this->template->render('home/home');

# Desde la vista
La extensión es {{ get_file_ext('hola.jpg') }}

Para utilizar una función creada en Func, simplemente bastaría con hacer desde la vista:

    <img src="{{ get_gravatar('princk093@gmail.com',50) }}" />

Acceder a variables nativas globales de PHP y del framework

Podemos acceder a cualquier variable global definida en la clase Controllers con addGlobal:

{{ session.mi_sesion }}
{{ get.mi_variable_get }}
{{ post.mi_variable_post }}
{{ route.getRoute('/miRuta') }}

Definir variables globales

Debemos ir a ./core/kernel/Controllers.php y añadir debajo de:

$this->template->addGlobal('route', $this->route);

Colocar:

$this->template->addGlobal('mivariable', $mivariable);

Y ya podríamos acceder por defecto desde cualquier .twig como:

{{ mivariable }}

Incluir otras vistas desde nuestra vista

Si abrimos home/home.twig podemos notar que hay ciertas instrucciones similares a esta:

{{ include 'overall/header' }}

Con ésto, básicamente estoy incluyendo al archivo que se encuentra en *./templates/twig/overall/header.twig y plasmando su contenido en nuestra vista. Si abrimos ese archivo se puede apreciar que contiene HTML con el de nuestra aplicación y el inicio de la declaración de la etiqueta , nosotros podemos estructurar en módulos los archivos de nuestro HTML para que si tenemos alguno que se tenga que reutilizar en todas las páginas, lo creemos una sola vez y lo incluimos directamente en todas las páginas que lo requieran. Por lo que si editamos este archivo, surgirá efecto la modificación en todas las vistas que lo incluyan. Hagamos la prueba, creemos un archivo en ./templates/twig/overall/hola.twig** y coloquemos este contenido:

  <p>Hola que pasa</p>

Ahora desde cualquier vista, vamos a incluirlo:

{{ include 'overall/hola' }}

De hecho podemos incluirlo todas las veces que queramos:

{{ include 'overall/hola' }}
{{ include 'overall/hola' }}
{{ include 'overall/hola' }}
{{ include 'overall/hola' }}
{{ include 'overall/hola' }}

Y veremos como se muestra el contenido desde nuestra vista.

Crear una vista usando el generador

Simplemente con escribir el comando

    php gen.php v MiVista

Esto generará en ./templates/twig/mivista/mivista.twig el siguiente contenido:

{% include 'overall/header' %}
  <body>
    <div class="container">
      <div class="presentacion center">
        <div class="row">
          <div class="col-xs-12">
            <h1>Página nueva</h1>
            Blank.
          </div>
        </div>
      </div>
    </div>
    {% include 'overall/footer' %}
  </body>
</html>

El contenido de la vista generada, la plantilla puede ser modificada si se edita el fichero ./generator/twig/v.g siendo esto extremadamente útil, para cuando ya tenemos un diseño web definido en nuestra aplicación, si queremos que el generador escriba por nosotros una vista con el diseño web que tenemos definido sólo editamos el molde en v.g, y en va.g, éste último se genera cuando hacemos contenido con la API REST.

Obtener mayor información

El motor de plantillas que se utiliza es Twig, se puede encontrar extensa documentación desde YouTube orientada a ocrend framework, y desde su página oficial en Twig Sensiolabs