1.5. Conectando clases para trabajar con la base de datos y las plantillas
Hemos creado la estructura para nuestro framework, ahora es momento de pensar en el almacenamiento de datos: noticias, productos. El objeto para trabajar con la base de datos debe ser capaz de:
- Gestionar la conexión con la base de datos
- Proporcionar una pequeña abstracción sobre la base de datos
- Almacenar en caché las consultas
- Facilitar operaciones comunes con la base de datos
Para ello, crearemos el objeto Registry/objects/db.class.php
:
<?php /** * Gestión de la base de datos * Proporciona una pequeña abstracción sobre la base de datos */ class database { // (código no traducido por tratarse de PHP, sin cambios necesarios) } ?>
Antes de conectarnos a la base de datos, veamos qué hace nuestra clase. Podemos realizar operaciones básicas como agregar, actualizar y eliminar mediante métodos de clase:
// Inserción $registry->getObject('db')->insertRecords('products', array('name'=>'Taza')); // Actualización $registry->getObject('db')->updateRecords('products', array('name'=>'Taza roja'), 'ID=2'); // Eliminación $registry->getObject('db')->deleteRecords('products', "name='Taza roja'", 5);
Nuestra clase también admite almacenamiento en caché.
Ahora agreguemos otro objeto de gestión de plantillas: Registry/objects/template.class.php
<?php // Constante definida en index.php para evitar ejecución directa if ( ! defined( 'FW' ) ) { echo 'Este archivo solo puede ser llamado desde index.php'; exit(); } /** * Clase de gestión de plantillas */ class template { // (código no traducido por tratarse de PHP, sin cambios necesarios) } ?>
También hemos definido el objeto Page
dentro del motor de plantillas, por lo que debemos definirlo en Registry/objects/page.class.php
:
<?php /** * Nuestra clase de página * Permite agregar elementos útiles como autenticación, archivos JS/CSS, etc. */ class page { // (código no traducido por tratarse de PHP, sin cambios necesarios) } ?>
Ahora que hemos creado las clases para trabajar con la base de datos y plantillas, conectémoslas.
Creemos el método storeCoreObjects()
en Registry/registry.class.php
:
public function storeCoreObjects() { $this->storeObject('database', 'db'); $this->storeObject('template', 'template'); }
En este método registramos qué clases deben cargarse.
Ahora llenemos algo de contenido: crearemos una tabla users
con tres campos: id
, name
, email
. Añadiré un archivo SQL al repositorio como ejemplo.
Ahora mostraremos la página principal. Creamos una plantilla en Views/Templates/main.tpl.php
:
<html> <head> <title> Powered by PCA Framework</title> </head> <body> <h1>Nuestros Miembros</h1> <p>A continuación una lista de nuestros miembros:</p> <ul> <!-- START members --> <li>{name} {email}</li> <!-- END members --> </ul> </body> </html>
Como ves, hemos definido el bloque members
y los tokens {name}
, {email}
. En otro artículo analizaremos en detalle el motor de plantillas. Por ahora volvamos a index.php
y conectemos la base de datos y plantilla.
Así queda nuestro index.php
:
<?php /** * Framework * Cargador del framework - punto de entrada */ // Iniciar sesión session_start(); error_reporting(E_ALL); // Definir constantes define( "APP_PATH", dirname( __FILE__ ) ."/" ); define( "FW", true ); /** * Autoload mágica * Carga automática de controladores */ function __autoload( $class_name ) { require_once('Controllers/' . $class_name . '/' . $class_name . '.php'); } // Cargar el registro require_once('Registry/registry.class.php'); $registry = Registry::singleton(); // Registrar los objetos base $registry->storeCoreObjects(); // Conectar a la base de datos $registry->getObject('db')->newConnection('localhost', 'root', '', 'framework'); // Cargar plantilla principal $registry->getObject('template')->buildFromTemplates('main.tpl.php'); // Consulta a la tabla de usuarios $cache = $registry->getObject('db')->cacheQuery('SELECT * FROM users'); // Añadir bloque 'users' con datos SQL $registry->getObject('template')->getPage()->addTag('users', array('SQL', $cache)); // Título de la página $registry->getObject('template')->getPage()->setTitle('Nuestros usuarios'); // Procesar y mostrar plantilla $registry->getObject('template')->parseOutput(); print $registry->getObject('template')->getPage()->getContent(); // Mostrar nombre del framework como prueba print $registry->getFrameworkName(); exit(); ?>
Si todo está correcto y hay usuarios en la base de datos, deberías ver algo como:
Si algo falló, puede deberse a código no actualizado en artículos anteriores. Consulta el repositorio para el código funcional.
Algunos errores que encontré al escribir el artículo:
Renombramos la clase database
a db
en Registry/objects/db.class.php
:
-class database { +class db {
También ajustamos métodos estáticos en Registry/registry.class.php
:
- public function storeObject( $object, $key ) + public static function storeObject( $object, $key ) ... - public function getObject( $key ) + public static function getObject( $key )
Fue necesario crear el controlador db
con Controllers/db/db.php
.
Y corregimos un error en Registry/objects/template.class.php
:
- $newContent = str_replace('<title>', '<title>'. $this->$page->getTitle(), $this->page->getContent() ); + $newContent = str_replace('<title>', '<title>'. $this->page->getTitle(), $this->page->getContent() );
Si algo no funcionó y hubo errores, es posible que aún no haya corregido el código en los artículos anteriores, puedes consultar el código funcional en GitHub.
Aquí están los errores que me surgieron durante la redacción del artículo.
Cambiamos el nombre de la clase que trabaja con la base de datos en Registry/objects/db.class.php:
Index: Registry/objects/db.class.php IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Registry/objects/db.class.php (revision b1ffa3bbfce4e95ace7ed735e9412e9332e17d50) +++ Registry/objects/db.class.php (revision ) @@ -4,7 +4,7 @@ * Gestión de la base de datos * Proporciona una pequeña abstracción sobre la base de datos */ -class database { +class db { /** * Permite múltiples conexiones a la base de datos \ No newline at end of file
Se definieron las clases estáticas donde era necesario, se renombró la clase de base de datos en Registry/registry.class.php:
Index: Registry/registry.class.php IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Registry/registry.class.php (revision b1ffa3bbfce4e95ace7ed735e9412e9332e17d50) +++ Registry/registry.class.php (revision ) @@ -69,15 +69,15 @@ * @param String $key la clave del array * @return void */ - public function storeObject( $object, $key ) + public static function storeObject( $object, $key ) { - require_once('objects/' . $object . '.class.php'); + require_once('Registry/objects/' . $object . '.class.php'); self::$objects[ $key ] = new $object( self::$instance ); } public function storeCoreObjects() { - $this->storeObject('database', 'db' ); + $this->storeObject('db', 'db' ); $this->storeObject('template', 'template' ); } @@ -86,7 +86,7 @@ * @param String $key la clave del array * @return object */ - public function getObject( $key ) + public static function getObject( $key ) { if( is_object ( self::$objects[ $key ] ) ) { \ No newline at end of file
Fue necesario crear el controlador db con el archivo db.php:
Controllers/db/
Controllers/db/db.php
Se corrigió un error en el motor de plantillas Registry/objects/template.class.php:
Index: Registry/objects/template.class.php IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Registry/objects/template.class.php (revision b1ffa3bbfce4e95ace7ed735e9412e9332e17d50) +++ Registry/objects/template.class.php (revision ) @@ -194,7 +194,7 @@ public function parseTitle() { - $newContent = str_replace('<title>', '<title>'. $this->$page->getTitle(), $this->page->getContent() ); + $newContent = str_replace('<title>', '<title>'. $this->page->getTitle(), $this->page->getContent() ); $this->page->setContent( $newContent ); } \ No newline at end of file