🎮 Controladores - Plugin Mascotas

Gestionan la lógica de negocio y las interacciones del usuario

📋 Controladores del Plugin

✏️

EditMascota.php

Controlador para crear y editar mascotas individuales

EditController
📋

ListMascota.php

Controlador para listar, buscar y gestionar múltiples mascotas

ListController

✏️ EditMascota.php - Controlador de Edición

Controller/EditMascota.php
<? php
namespace FacturaScripts\Plugins\MiPlugin\Controller;

use FacturaScripts\Core\Lib\ExtendedController\EditController;

class EditMascota extends EditController
{
    public function getModelClassName(): string
    {
        return 'Mascota';
    }
}

🎯 Simplicidad y Eficiencia

Este controlador es minimalista porque hereda toda la funcionalidad de EditController:

  • Creación automática de formularios
  • Validación de datos integrada
  • Guardado y actualización automáticos
  • Manejo de errores
  • Integración con vistas XML

🔗 Conexión con el Modelo

El método getModelClassName() es crucial:

  • Define qué modelo gestiona este controlador
  • Permite la comunicación automática con la base de datos
  • Habilita las operaciones CRUD básicas
  • Conecta con la vista XML correspondiente

📋 ListMascota.php - Controlador de Listado

Controller/ListMascota.php
<? php
namespace FacturaScripts\Plugins\MiPlugin\Controller;

use FacturaScripts\Core\Lib\ExtendedController\ListController;
use FacturaScripts\Dinamic\Model\Mascota;
use FacturaScripts\Core\Tools;

class ListMascota extends ListController
{
    public function getPageData(): array
    {
        $page = parent::getPageData();
        $page['title'] = 'Mascotas';
        $page['menu'] = 'Clinica';
        $page['icon'] = 'fa-solid fa-paw';
        return $page;
    }

    protected function createViews()
    {
       $this->addView("ListMascota", 'mascota','mascota','fa-solid fa-paw')
            ->addOrderBy(['nombre'], 'nombre')
            ->addSearchFields(['nombre']); 

       $this->addView("ListCliente", "Cliente", "Clientes","fa-solid fa-person")
            ->addOrderBy(['nombre'], 'nombre')
            ->addSearchFields(['nombre']); 
    }

    protected function execPreviousAction($action){
        switch($action){
            case "borrar-todo":
                $this->borrarTodo();
                break;
            case "copiar":
                $this->copiar();
                break;
            default:
                parent::execPreviousAction($action);
        }
    }

    protected function borrarTodo(){
        $mascotaModel = new Mascota();
        $mascotas = $mascotaModel->all();
        foreach($mascotas as $mascota){
            $mascota->delete();
        }
        Tools::log()->notice('Se han borrado todas las mascotas correctamente');
    }

    protected function copiar(){
        for($i = 0; $i <= 100; $i++){
            $mascota = new Mascota();
            $mascota->nombre = 'Copia';
            $mascota->especie = 'Perro';
            $mascota->genero = 'macho';
            $mascota->edad = '5';
            $mascota->fechanacimiento = 'pepe';
            $mascota->save();
        }
        Tools::log()->notice('Se ha copiado la mascota correctamente');
    }
}

🔍 Análisis de ListMascota.php

📊 getPageData() - Configuración de Página

public function getPageData(): array
{
    $page = parent::getPageData();
    $page[\'title\'] = \'Mascotas\';
    $page[\'menu\'] = \'Clinica\';
    $page[\'icon\'] = \'fa-solid fa-paw\';
    return $page;
}

Función: Configura los metadatos de la página

  • title: Título que aparece en el navegador
  • menu: Menú donde aparece la opción
  • icon: Icono de FontAwesome para el menú

👁️ createViews() - Configuración de Vistas

protected function createViews()
{
   $this->addView("ListMascota", \'mascota\',\'mascota\',\'fa-solid fa-paw\')
        ->addOrderBy([\'nombre\'], \'nombre\')
        ->addSearchFields([\'nombre\']); 

   $this->addView("ListCliente", "Cliente", "Clientes","fa-solid fa-person")
        ->addOrderBy([\'nombre\'], \'nombre\')
        ->addSearchFields([\'nombre\']); 
}

Parámetros de addView:

  • ViewName: Nombre interno de la vista
  • ModelName: Nombre del modelo
  • ViewTitle: Título que ven los usuarios
  • ViewIcon: Icono de la vista

Métodos encadenados:

  • addOrderBy(): Campos para ordenar
  • addSearchFields(): Campos para búsqueda

⚡ execPreviousAction() - Acciones Personalizadas

protected function execPreviousAction($action){
    switch($action){
        case "borrar-todo":
            $this->borrarTodo();
            break;
        case "copiar":
            $this->copiar();
            break;
        default:
            parent::execPreviousAction($action);
    }
}

Función: Maneja acciones personalizadas desde los botones de la vista

Flujo:

  1. El usuario hace clic en un botón de acción
  2. Se ejecuta execPreviousAction()
  3. El switch detecta la acción y llama al método correspondiente
  4. Si no hay coincidencia, delega al padre

🛠️ Acciones Personalizadas

🗑️ borrarTodo()

protected function borrarTodo(){
    $mascotaModel = new Mascota();
    $mascotas = $mascotaModel->all();
    foreach($mascotas as $mascota){
        $mascota->delete();
    }
    Tools::log()->notice(\'Se han borrado...\');
}

Función: Elimina todos los registros de mascotas

Flujo:

  1. Crea instancia del modelo Mascota
  2. Obtiene todos los registros con all()
  3. Itera y elimina cada registro con delete()
  4. Registra mensaje en el log del sistema
⚠️ Precaución: Esta acción es irreversible

📝 copiar()

protected function copiar(){
    for($i = 0; $i <= 100; $i++){
        $mascota = new Mascota();
        $mascota->nombre = \'Copia\';
        $mascota->especie = \'Perro\';
        $mascota->genero = \'macho\';
        $mascota->edad = \'5\';
        $mascota->fechanacimiento = \'pepe\';
        $mascota->save();
    }
    Tools::log()->notice(\'Se ha copiado...\');
}

Función: Crea 101 registros de prueba idénticos

Flujo:

  1. Bucle que se ejecuta 101 veces
  2. Crea nueva instancia de Mascota en cada iteración
  3. Asigna valores predeterminados a las propiedades
  4. Guarda cada registro con save()
  5. Registra mensaje en el log
💡 Uso: Ideal para pruebas y demostraciones

🔗 Integración con Vistas XML

🎮
Controlador
ListMascota.php
📋
Vista XML
ListMascota.xml
🖥️
Interfaz
de Usuario
👤
Usuario
Final

Ejemplo de Botones en Vista XML

<row type="actions">
    <button action="borrar-todo" color="warning" 
            icon="fas fa-vial" label="Borrar" type="action"/>
    <button action="copiar" color="warning" 
            icon="fas fa-terminal" label="Copiar" type="action"/>
</row>

Conectores: Los atributos action en los botones se conectan automáticamente con los casos del switch en execPreviousAction().

⚠️ Problemas Comunes y Soluciones

Acciones no funcionan

Causa: Nombre de acción no coincide entre XML y PHP

Solución: Verificar que action="nombre" en XML coincida con case "nombre": en PHP

Error en bucle infinito

Causa: Uso incorrecto de while en lugar de for

Solución: En el código actual hay un while($i <=100); sobrante que debe eliminarse

Logs no aparecen

Causa: Nivel de log incorrecto o sistema de logs deshabilitado

Solución: Verificar configuración de logs en FacturaScripts

🚀 Mejoras Recomendadas

Validaciones en borrarTodo()

protected function borrarTodo(){
    // Confirmación antes de borrar
    if (!$this->request->get(\'confirm\')) {
        Tools::log()->warning(\'Confirmación requerida\');
        return;
    }
    
    $mascotaModel = new Mascota();
    $mascotas = $mascotaModel->all();
    foreach($mascotas as $mascota){
        $mascota->delete();
    }
    Tools::log()->notice(\'Registros eliminados\');
}

Mejorar copiar() con datos reales

protected function copiar(){
    $nombres = [\'Luna\', \'Max\', \'Bella\', \'Rocky\'];
    $especies = [\'Perro\', \'Gato\', \'Conejo\'];
    
    for($i = 0; $i < 10; $i++){
        $mascota = new Mascota();
        $mascota->nombre = $nombres[array_rand($nombres)];
        $mascota->especie = $especies[array_rand($especies)];
        $mascota->genero = rand(0,1) ? \'Macho\' : \'Hembra\';
        $mascota->edad = rand(1, 15);
        $mascota->save();
    }
}