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