🎮 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
EditControllerListMascota.php
Controlador para listar, buscar y gestionar múltiples mascotas
ListController✏️ EditMascota.php - Controlador de Edición
<? 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
<? 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 navegadormenu: Menú donde aparece la opciónicon: 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 ordenaraddSearchFields(): 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:
- El usuario hace clic en un botón de acción
- Se ejecuta
execPreviousAction() - El switch detecta la acción y llama al método correspondiente
- 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:
- Crea instancia del modelo Mascota
- Obtiene todos los registros con
all() - Itera y elimina cada registro con
delete() - Registra mensaje en el log del sistema
📝 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:
- Bucle que se ejecuta 101 veces
- Crea nueva instancia de Mascota en cada iteración
- Asigna valores predeterminados a las propiedades
- Guarda cada registro con
save() - Registra mensaje en el log
🔗 Integración con Vistas XML
ListMascota.php
ListMascota.xml
de 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();
}
}