jueves, 30 de enero de 2014

Introducción a CakePHP (II): Mostrar datos en una tabla

Suponemos que tenemos CakePHP instalado con una base de datos en la que hemos dado de entrada unos registros de prueba con la tabla articulos como indica aquí.

Bien, veamos el contenido de nuestra tabla articulos:

http://misitio/cake20/articulos

Error: ArticulosController could not be found.

Claro, no hemos definido el controlador para nuestro modelo Articulo. De hecho ni siquiera hemos definido el modelo!  Aunque este paso lo ha hecho CakePHP por nosotros heredando de la clase AppController. ¿Una buena praxis? En absoluto.

Definiendo el controlador

En el capítulo anterior dijimos que los controladores se crean en la carpeta app/Controller de CakePHP. Así que crearemos el controlador con la acción que queremos darle: ver_tabla.

En app/Controller creamos el fichero ArticulosController.php, y le damos el siguiente contenido:

<?php
class ArticulosController extends AppController {
public function ver_tabla() {
$this->set('articulos', $this->Articulo->find('all'));
}
?>

Probemos:
http://misitio/cake20/articulos

Error: The action index is not defined in controller ArticulosController

Increíble. Parece que el modelo que aún no hemos definido y que lo ha hecho CakePHP por nosotros, está esperando la acción index. Para que no desespere cambiamos el nombre a nuestra acción.

<?php
class ArticulosController extends AppController {
public function index() {
$this->set('articulos', $this->Articulo->find('all'));
}
}
?>

¿Qué hace el método set?
Dijimos que para mostrar los datos CakePHP usa algo llamado vistas. Set pasa a la vista una variable (primer parámetro) y su valor (segundo parámetro). 

En este caso le pasa el resultado del método find('all') de nuestro modelo Articulo, que lo que hace es generar una tabla con el contenido de todos los registros de la tabla articulos. ¿Y dónde le hemos dicho que coja esa tabla y no otra? En ningún sitio. Es por eso que es tan importante atenerse a la convención en la nomenclatura de las cosas.  :-)

Veamos pues que sucede:
http://misitio/cake20/articulos

Error: The view for ArticulosController::index() was not found.


Maldición... olvidamos crear la vista. Además si os fijáis en el mensaje de error, lo que nos pide CakePHP es una vista para la acción index.

Dijimos que las vistas se colocaban en la carpeta /app/View al que nosotros añadiremos otro nivel de carpetas para tener todas las vistas de cada controlador separadas.  Eso significa que crearemos una vista llamada index.ctp en la carpeta /app/View/Articulos.

Comentamos que el método set del controlador pasaba el contenido de una variable a la vista, ¿no?. Pues bien como contenido de la vista pongamos lo siguiente:

<pre>
     <?php print_r($articulos); ?>
</pre>

Podemos ver cómo sobre la variable artículo habíamos recibido un array con la estructura y contenido de la tabla articulos de la base de datos:

Array
(
    [0] => Array
        (
            [Articulo] => Array
                (
                    [id] => 1
                    [title] => El título
                    [body] => Esto es el cuerpo del artículo.
                    [created] => 2014-01-27 23:36:46
                    [modified] => 
                )

        )

    [1] => Array
        (
            [Articulo] => Array
                (
                    [id] => 2
                    [title] => Un título otra vez
                    [body] => Y sigue el cuerpo del artículo.
                    [created] => 2014-01-27 23:36:46
                    [modified] => 
                )

        )

    [2] => Array
        (
            [Articulo] => Array
                (
                    [id] => 3
                    [title] => El título vuelve
                    [body] => Esto es realmente excitante! No.
                    [created] => 2014-01-27 23:36:46
                    [modified] => 
                )

        )

)

Para acabar... si en la vista recibimos la tabla... nada nos impide cambiar el contenido de la vista por esto:

<!-- File: /app/View/Articulos/index.ctp -->

<h1>Artículos del Blog</h1>

<table>
    <tr>
        <th>Identificador</th>
        <th>Título</th>
        <th>Creado</th>
    </tr>

<?php foreach ($articulos as $articulo): ?>
    <tr>
        <td><?php echo $articulo['Articulo']['id']; ?></td>
        <td><?php echo $articulo['Articulo']['title']; ?></td>
        <td><?php echo $articulo['Articulo']['created']; ?></td>
    </tr>
<?php endforeach; ?>

</table> 

Ahora sí...
http://misitio/cake20/articulos


Artículos del Blog

IdentificadorTítuloCreado
1El título2014-01-27 23:36:46
2Un título otra vez2014-01-27 23:36:46
3El título vuelve2014-01-27 23:36:46

Lo flipasssssssssss....

1 comentario:

  1. aja pero nunca entendí por que muestra e contenido de esa tabla y no de otra :( ...si en ningun lado se lo dices

    ResponderEliminar