👁️ Vistas XML - Plugin Mascotas
Definen la interfaz de usuario y la presentación de datos
📋 Vistas XML del Plugin
EditMascota.xml
Formulario para crear y editar mascotas individuales
Vista de EdiciónListMascota.xml
Tabla para listar, buscar y gestionar múltiples mascotas
Vista de Listado✏️ EditMascota.xml - Vista de Edición
<?xml version='1.0' encoding='UTF-8'?>
<view>
<columns>
<column name='Nombre' numcolumns='6' order='100'>
<widget type='text' fieldname='nombre'/>
</column>
<column name='Especie' order='105'>
<widget type='text' fieldname='especie'/>
</column>
<column name='Genero' order='110'>
<widget type='text' fieldname='genero'/>
</column>
<column name='Edad' order='115'>
<widget type='text' fieldname='edad'/>
</column>
<column name='Fecha de Nacimiento' order='120'>
<widget type='date' fieldname='fecha_nacimiento'/>
</column>
</columns>
</view>
🎯 Estructura de Columnas
La vista organiza los campos en columnas con propiedades específicas:
- name: Etiqueta visible para el usuario
- numcolumns: Ancho relativo (1-12, siendo 12 el total)
- order: Orden de aparición (múltiplos de 5 recomendados)
- widget: Tipo de control de entrada
📱 Diseño Responsive
El uso de numcolumns="6" en Nombre crea un layout adaptable:
- Nombre: Ocupa 6/12 columnas (50% del ancho)
- Otros campos: Se distribuyen automáticamente
- En móviles: Las columnas se apilan verticalmente
- En tablets: Se reorganizan según el espacio disponible
📋 ListMascota.xml - Vista de Listado
<?xml version='1.0' encoding='UTF-8'?>
<view>
<columns>
<column name='Nombre' order='100'>
<widget type='text' fieldname='nombre'/>
</column>
<column name='Especie' order='105'>
<widget type='text' fieldname='especie'/>
</column>
<column name='Genero' order='110'>
<widget type='text' fieldname='genero'/>
</column>
<column name='Edad' order='115'>
<widget type='text' fieldname='edad'/>
</column>
<column name='Fecha de Nacimiento' order='120'>
<widget type='date' fieldname='fecha_nacimiento'/>
</column>
</columns>
<rows>
<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>
</rows>
</view>
🔍 Análisis de ListMascota.xml
📊 Sección <columns> - Configuración de Columnas
<columns>
<column name=\'Nombre\' order=\'100\'>
<widget type=\'text\' fieldname=\'nombre\'/>
</column>
<!-- más columnas -->
</columns>
Propiedades de cada columna:
name: Encabezado de la columnaorder: Orden de aparición (múltiplos de 5)widget: Tipo de control para mostrar/editarfieldname: Nombre del campo en el modelo
⚡ Sección <rows> - Acciones Personalizadas
<rows>
<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>
</rows>
Propiedades de los botones de acción:
action: Nombre que coincide con el case en el controladorcolor: Color del botón (warning, danger, success, etc.)icon: Icono de FontAwesomelabel: Texto visible del botóntype: Tipo de elemento (siempre "action" para estos casos)
🎨 Tipos de Widgets Disponibles
🔗 Integración con el Controlador
Vista XML Define la Interfaz
Los botones en <rows> tienen atributos action que definen las acciones disponibles
Usuario Interactúa
El usuario hace clic en un botón, enviando la acción al controlador
Controlador Procesa
execPreviousAction() detecta la acción y llama al método correspondiente
Resultado se Muestra
La vista se actualiza automáticamente mostrando los cambios
Conexión Vista → Controlador
Vista XML
<button action="borrar-todo"
label="Borrar" type="action"/>
Controlador PHP
case "borrar-todo":
$this->borrarTodo();
break;
🎯 Buenas Prácticas en Vistas XML
📏 Ordenamiento Lógico
Usa múltiplos de 5 o 10 en el atributo order para facilitar inserciones futuras:
<!-- Bueno -->
<column name="Nombre" order="100">
<column name="Especie" order="105">
<column name="Edad" order="110">
<!-- Permite insertar entre ellos -->
<column name="Nuevo" order="107">
📱 Diseño Responsive
Utiliza numcolumns para crear layouts adaptables:
<!-- Campo principal ocupa más espacio -->
<column name="Nombre" numcolumns="8">
<!-- Campos secundarios menos espacio -->
<column name="Edad" numcolumns="4">
🎨 Nomenclatura Consistente
Mantén consistencia en nombres de acciones y campos:
<!-- Acciones en minúsculas con guiones -->
<button action="borrar-todo">
<button action="exportar-pdf">
<!-- Campos en minúsculas -->
<widget fieldname="nombre">
<widget fieldname="fecha_nacimiento">
⚠️ Problemas Comunes y Soluciones
Botones no funcionan
Causa: El atributo action no coincide con el case del controlador
Solución: Verificar que los nombres sean idénticos (case-sensitive)
Campos no se muestran
Causa: El fieldname no coincide con una propiedad del modelo
Solución: Revisar las propiedades públicas del modelo Mascota
Error de XML mal formado
Causa: Etiquetas sin cerrar o atributos sin comillas
Solución: Validar la estructura XML con un validador online
🚀 Mejoras y Extensiones Posibles
Validaciones en Vista
<widget type="text" fieldname="nombre">
<rules>
<rule type="required" message="El nombre es obligatorio"/>
<rule type="minlength" value="2"
message="Mínimo 2 caracteres"/>
</rules>
</widget>
Agregar validaciones client-side para mejor UX
Widgets Personalizados
<widget type="select" fieldname="especie">
<values>
<value code="perro">Perro</value>
<value code="gato">Gato</value>
<value code="ave">Ave</value>
</values>
</widget>
Listas desplegables con valores predefinidos
Agrupación de Campos
<group name="Datos Básicos">
<column name="Nombre">...</column>
<column name="Especie">...</column>
</group>
<group name="Datos Médicos">
<column name="Peso">...</column>
<column name="Vacunas">...</column>
</group>
Organizar campos en grupos lógicos