PlatesPHP

Se explica de forma extendida el uso del motor de plantillas PlatesPHP 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.phtml 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.phtml 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'] ?>
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

<?= $this->e('<b>no saldré en negrilla</b>') ?>

Estructuras selectivas (if)

Se manejan exactamente de la misma manera, solo cambia un poco la sintaxis ya que se utiliza la sintaxis alternativa de PHP para estructuras de control.

If():

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

<?php if(true): ?>
  Hola es verdadero
<?php else: ?>
  Hola es falso
<?php endif ?>

Para trabajar con else if, sería algo como:

<?php if(1 == 2): ?>
  1 es igual a 2
<?php elseif(2 == 2): ?>
  2 es igual a 2
<?php else: ?>
  ¿Qué?
<?php endif ?>

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

Estructuras repetitivas (for, foreach, while)

Todas mantienen exactamente el mismo comportamiento pero se utilizan con una sintaxis un poquito distinta pero aún así familiar y de fácil adaptación si nunca se ha usado.

For():

El elemental for, se utiliza de la siguiente manera:

<ul>
  <?php for($x = 0; $x <= 10; $x++): ?>
     <li><?= $x ?></li>
  <?php endfor ?>
</ul>

While():

El esencial while, se puede utilizar así:

<ul>
   <?php $x = 0 ?>
   <?php while ($x <= 10): ?>
      <li><?= $x++ ?></li>
   <?php endwhile ?>
</ul>

Si no queremos que se imprima mientas se incrementa el $x++, en vez de utilizar <?= ?> usamos <?php ?>

Foreach():

Para utilizar el foreach, necesitamos iterar sobre un arreglo o sobre un objeto que se pueda iterar.

<ul>
  <?php $arreglo = array('a','b','c','d') ?>
  <?php foreach($arreglo as $a): ?>
      <li><?= $a ?></li>
  <?php endforeach ?>
</ul>

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'] ?>
<?= $otro_arreglo[0] ?>

Para iterar sobre un arreglo:

<?php foreach($un_arreglo as $a): ?>
  <p><?= $a ?></p>
<?php endforeach ?>

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)
<?php foreach($usuarios as $u): ?>
<ul>
  <li>Id: <?= $u['id'] ?></li>
  <li>Email: <?= $u['email'] ?></li>
  <li>Usuario: <?= $u['user'] ?></li>
</ul>
<br />
<?php endforeach ?>

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');
echo $this->template->render('home/home');
# Desde la vista
La extensión es <?= Files::get_file_ext('hola.jpg') ?>

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

<img src="<?= Func::get_gravatar('princk093@gmail.com',50) ?>" />

Acceder a variables nativas globales y funciones nativas de PHP

Podemos en todo momento, acceder a cualquier función/variable nativa de PHP, ejemplos:

<?= $_SESSION['misesion'] ?>
<?= $_GET['variableget'] ?>
<?= $_POST['variablepost'] ?>
<?= $_FILES['archivo']['name'] ?>
<?= $_SERVER['REMOTE_ADDR'] ?>
<?= strtolower('HOLA QUE HAY') ?>
<?php if(is_numeric('1')): ?>
  Sí
<?php endif ?>

Incluir otras vistas desde nuestra vista

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

<?= $this->insert('overall/header') ?>

Con ésto, básicamente estoy incluyendo al archivo que se encuentra en *./templates/plates/overall/header.phtml 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/plates/overall/hola.phtml** y coloquemos este contenido:

<p>Hola que pasa</p>

Ahora desde cualquier vista, vamos a incluirlo:

<?= $this->insert('overall/hola') ?>

De hecho podemos incluirlo todas las veces que queramos:

<?= $this->insert('overall/hola') ?>
<?= $this->insert('overall/hola') ?>
<?= $this->insert('overall/hola') ?>
<?= $this->insert('overall/hola') ?>

Y veremos como se muestra el contenido desde nuestra vista. Pero hasta allí no llega, podemos tener plantillas dentro de las plantillas, veamos un ejemplo muy sencillo y enseguida observaremos el potencial. En ./templates/plates/overall/hola.phtml y coloquemos este contenido:

Hola <?= $nombre ?>

Y desde cualquier vista en donde queramos incluir a hola.phtml hagamos:

<?= $this->insert('overall/hola', array('nombre' => 'Ocrend') ) ?>

Saldrá en pantalla Hola Ocrend.

Crear una vista usando el generador

Simplemente con escribir el comando

php gen.php v MiVista

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

<?= $this->insert('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>
    <?= $this->insert('overall/footer') ?>
  </body>
</html>

El contenido de la vista generada, la plantilla puede ser modificada si se edita el fichero ./generator/plates/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 Plates PHP, se puede encontrar extensa documentación desde YouTube y desde su página oficial en Plates