6.1 Blog
Llegó el momento de empezar con un caso práctico, vamos a crear un Blog. Explicaremos paso a paso la creación de esta sencilla pero práctica aplicación, empezando por la creación de la base de datos.
¿Qué necesitas para empezar?
- Un servidor web corriendo Apache. Ver el capítulo Configuración del Servidor
- Un servidor de Base de Datos. En este caso utilizaremos PostgreSql
- Conocimientos básicos de PHP
- Conocimientos de programación con el patrón de diseño MVC y lo que has aprendido hasta ahora en este libro sobre el entorno de desarrollo OP_Framework
Obteniendo Open Populi Application Framework
Bien, primero obtengamos una copia del ultimo release del código de Open Populi Application Framework.
Para realizar el download, accede a
http://www.openpopuli.com/plataforma/plataforma.phpLuego de haber obtenido una copia del código, coloque esta copia en su documentRoot. Una vez terminado este procedimiento su directorio de instalación debería lucir como lo siguiente:
Sugerimos ahora leer la sección donde se detalla como se compone la estructura de Open Populi Application Framework. Para esto, revisar la sección: 2.2.1
Organización del CódigoCreación y configuración de la Base de Datos
Lo siguiente es crear las tablas en la base de datos para nuestro Blog. Ejecuta la siguiente sentencia SQL:
/* Creación de la tabla Posts: */
CREATE TABLE posts (
id_post INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
Los nombres de las tablas y de los campos no han sido elegidos arbitrariamente. Echa un vistazo a la sección 2.2.2 Convenciones para obtener más información sobre las convenciones tomadas para la creación de tablas y nombresAhora sólo falta configurar la plataforma para que pueda conectar a la base de datos. Ésto se hace editando el archivo
documentRoot/miPlataforma/config/config.ini.php. Existe un archivo por plataforma, por lo que podríamos tener una base de datos diferente para cada plataforma pero compartiríamos la misma para las aplicaciones de cada una.
- documentRoot/miplataforma/config/config.ini.php
//...
[database]
driver = PgSql;
host = localhost;
users = usuario;
pass = password;
db_name = dabase_name;
//...
Creación del Modelo
El modelo, es la forma de interactuar con la base de datos abstrayéndonos de escribir sentencias típicas SQL para la manipulación de datos. Nuestro blog, se compone de una única tabla que almacena los Posts. Por lo que, el modelo lucirá como:
- OP_Framework/miplataforma/model/blog.php
class posts extends OP_ModelActiveTable
{
public function __construct() {
parent::__construct();
}
public function getPosts() {
return $this->find();
}
}
Hemos añadido el método getPosts() para hacer más intuitivo la obtención de los posts desde las acciones del controlador, como veremos más adelante.
Creación del Controlador
Es el momento de crear el controlador para nuestros posts. El controlador es el que gestionará a través de sus acciones toda la lógica para la interacción con los post. A través del controlador interactuaremos con el modelo y con la vista. Colocaremos el controlador en un archivo llamado actions.class.php localizado en
documentRoot/miPlataforma/apps/blog/modules/post/actions/actions.class.php. Entonces el controlador debería lucir como lo siguiente:
<?php
require_once( getcwd().'/'.OP_PLATFORM.'/model/posts.php');
class postActions extends OP_Controller
{
}
?>
Definiendo Acciones en el controlador
Definiremos de manera muy simple la acción
index. Acción que será la acción por defecto para la mayoría de las aplicaciones creadas con Open Populi Application Framework.
Bien, la idea es obtener desde el modelo todos los post ingresados en la base de datos.
Listado de Posts
<?php
require_once( getcwd().'/'.OP_PLATFORM.'/model/posts.php');
class postActions extends OP_Controller
{
public function index() {
$posts = new Posts();
$this->data = array('posts' => $posts->getPosts());
}
}
?>
Visualizando un PostPodremos visualizar un post ingresando la URL:
- http://localhost/plataforma/blog/post/view?id_post=2
<?php
require_once( getcwd().'/'.OP_PLATFORM.'/model/posts.php');
class postActions extends OP_Controller
{
public function index() {
$posts = new Posts();
$this->data = array('posts' => $posts->find());
}
public function view(){
$posts = new Posts();
$id = $this->context->getRequest()->getParameter('id_post', 'GET');
$this->data = array('post'=>$posts->findByPk($id));
}
}
?>
Creación de las Vistas
Ahora pasaremos a definir las vista de nuestro blog. Primero crearemos los archivos que por convención tenemos que definir. Como ya hemos visto en éste manual, el "Layout" es la plantilla "decorador". Sigue el patrón
decorator y se define la misma para toda la aplicación. Contine el código común para todas las acciones y define, con la varible
$op_content dónde se mostrarán las plantillas que dependen de la acción.
- El Layout a nivel de plataforma. OP_Framework/miplataforma/templates/miplataforma.tpl.php
<html>
<body>
<?php echo $op_content ?>
</body>
</html>
Un Template por cada acción. En nuestro caso tenemos dos,
index y
view, por lo tanto crearemos dos archivos. Es el código que será mostrado, según la acción que se esté ejecuntando, decorado por el "Layout" anterior.
- OP_Framework/miplataforma/apps/blog/modules/post/templates/index.tpl.php
<div id="content">
<table>
<tr>
<th><?php echo linkTo("blog/post/index?sort=id_post", 'Id'); ?></th>
<th><?php echo linkTo("blog/post/index?sort=title", 'Title'); ?></th>
<th><?php echo linkTo("blog/post/index?sort=created", 'Created'); ?></th>
<th>Action</th>
</tr>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['id_post']; ?></td>
<td><?php echo linkTo("blog/post/view?id_post=".$post['id_post'],$post['title']); ?></td>
<td><?php echo $post['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
</div>
- OP_Framework/miplataforma/apps/blog/modules/post/templates/view.tpl.php
<div id="content">
<h2><?= $post['title']?></h2>
<p>Created: <?= $post['created']?><p>
<p><?=$post['body']?></p>
</div>
Como podemos ver en el ejemplo, desde la plantilla podemos acceder a los datos seteados desde las acciones en
$data. Por ejemplo, desde la acción
index accedemos a la variable
$posts que es un vector seteado en
$data cuya salida podría ser la siguiente.
["posts"] => array(2) {
[0] => array(10) { ["id_post"]=> int(31) [0]=> int(31)
["title"]=> string(4) "Título 1" [1]=> string(4) "Título 1"
["body"]=> string(4) "Contenido 1" [2]=> string(4) "Contenido 1"
["created"]=> string(10) "2008-06-19" [3]=> string(10) "2008-06-19"
["modified"]=> NULL [4]=> NULL }
[1] => array(10) { ["id_post"]=> int(32) [0]=> int(32)
["title"]=> string(4) "Título 2" [1]=> string(4) "Título 2"
["body"]=> string(4) "Contenido 2" [2]=> string(4) "Contenido 2"
["created"]=> string(10) "2008-06-19" [3]=> string(10) "2008-06-19"
["modified"]=> NULL [4]=> NULL }
}
Validación de Datos
En las aplicaciones donde el usuario introduce datos es necesario validar éstos datos antes de almacenarlos. En
OP_Framework se hace añadiendo las reglas de validación que queramos usar en el modelo. Por lo tanto ahora el código del modelo anterior nos quedará como sigue.
- OP_Framework/miplataforma/model/blog.php
class posts extends OP_ModelActiveTable
{
public function __construct() {
parent::__construct();
}
public function getPosts() {
return $this->find();
}
public function addRules(){
$this->validator->addRule(array('title','body'), REQUIRED );
}
}
El método addRules() engloba las validaciones de los datos. En éste caso hemos añadido una regla al campo 'title', lo que lo convierte en un campo requerido. Existe más reglas de validación predefinidas. Véase la sección
Validaciones en
ModeloRouting
Crearemos una regla de routing que nos permitirá acceder de manera mas intuitiva al listado de los diez últimos post cargados en nuestro blog.
Primero, definiremos una acción denominada lastTenPosts() en el controlador.
<?php
require_once( getcwd().'/'.OP_PLATFORM.'/model/posts.php');
class postActions extends OP_Controller
{
public function index() {
$posts = new Posts();
$this->data = array('posts' => $posts->find());
}
public function view(){
$posts = new Posts();
$id = $this->context->getRequest()->getParameter('id_post', 'GET');
$this->data = array('post'=>$posts->findByPk($id));
}
public function lastTenPosts() {
$posts = new Posts();
$this->data = array('posts' => $posts->find('', 'actions.id_action desc', 10 ));
}
}
?>
Bien, ahora agregamos la ruta que nos llevará a la acción lastTenPosts()
- documentRoot/config/routes.ini.php
$router->connect( "blog/ultimos-post", array(":platform" => OP_PLATFORM, ":application" => 'blog', ":module" => 'post', ":action" => 'lastTenPosts'));
Ahora estamos en condiciones de acceder a los últimos diez posts ingresados al blog mediante la URL:
http://localhost/blog/ultimos-postResumen
El objetivo de este ejemplo es presentar las funcionalidades básicas de
OP_Framework. Se trata de un ejemplo sencillo, pero que ilustra cómo, con unas pocas lineas de código, se puede obtener una aplicación funcional.
«««
Ejemplo de Aplicación |
Glosario »»»