Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll

1.5. Conectando clases para trabajar con la base de datos y las plantillas

10/05/2025, by Ivan

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:

Our users

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