Plataforma de código abierto para gobierno electrónico.Administración electrónica.
        Open Source Plattform for e-government.

"Si tienes un programa con licencia y un amigo te lo pide, debes decidir entre dos males:
fallar a tu amigo o incumplir la licencia. Una solución es no tener amigos." (Richard Stallman)


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.php

Luego 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ódigo

Creació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 nombres
Ahora 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 Post

Podremos 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 Modelo

Routing



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-post

Resumen



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 »»»



Indice del manual