PanelController

El PanelController, al igual que el ListController, es un controlador extendido que permite múltiples vistas o pestañas. En este caso, admite distintos tipos de vistas:

  • ListView: Para mostrar listados.
  • EditView: Para editar los datos de un único modelo.
  • EditListView: Para editar múltiples registros de un modelo.
  • HTMLView: Para mostrar HTML con libertad total.

El controlador divide la pantalla en dos zonas: la izquierda es la zona de navegación y la derecha visualiza las vistas con los datos correspondientes.

Para usar este controlador, es necesario crear vistas en formato XML, de manera similar a otros controladores extendidos.

Ejemplo: EditFabricante.php

<?php
namespace FacturaScripts\Core\Controller;

use FacturaScripts\Core\Where;
use FacturaScripts\Core\Lib\ExtendedController\PanelController;

class EditFabricante extends PanelController
{
    public function getPageData(): array
    {
        $page = parent::getPageData();
        $page['title'] = 'manufacturer';
        $page['menu'] = 'warehouse';
        $page['icon'] = 'fa-folder-open';
        $page['showonmenu'] = false;
        return $page;
    }

    protected function createViews() {
        $this->addEditView('EditFabricante', 'Fabricante', 'manufacturer');
        $this->addListView('ListProducto', 'Producto', 'products');
    }

    protected function loadData($viewName, $view) {
        switch ($viewName) {
            case 'EditFabricante':
                $code = $this->request->get('code');
                $view->loadData($code);
                break;

            case 'ListProducto':
                $where = [Where::eq('codfabricante', $this->getModel()->id())];
                $view->loadData('', $where);
                break;
        }
    }
}

Método createViews()

Dentro de este método, en nuestra nueva clase, debemos ir creando las diferentes vistas o pestañas que se visualizarán, empleando distintos métodos según el tipo de vista que estemos añadiendo. Al añadir una vista, es necesario especificar el modelo (nombre completo) y el nombre de la vista XML, y opcionalmente el título y el icono para el grupo de navegación:

  • addEditView(): Añade una pestaña o vista para editar datos de un único registro de un modelo.
  • addEditListView(): Añade una vista o pestaña para editar múltiples registros de un modelo.
  • addListView(): Añade una pestaña o vista para visualizar en modo lista múltiples registros de un modelo.
  • addHtmlView(): Añade una pestaña o vista con total libertad sobre el HTML.

Es posible añadir varias vistas o pestañas para un mismo modelo usando una vista XML. Para ello, al añadir la vista se debe emplear un índice numérico comenzando desde 1 y separando el nombre de la vista del índice con un guión ('-').

$this->addListView('ListPartidaImpuesto-1', 'PartidaImpuesto', 'purchases', 'fas fa-sign-in-alt');
$this->addListView('ListPartidaImpuesto-2', 'PartidaImpuesto', 'sales', 'fas fa-sign-out-alt');

Este método tiene una visibilidad de protected, lo que permite a los plugins extender nuestra clase y añadir nuevas vistas o modificar las existentes.

Método loadData()

Este método es llamado por cada una de las vistas para cargar los datos específicos. La llamada incluye el identificador de la vista y el objeto view, permitiendo acceder a todas sus propiedades. La carga de datos puede variar según el tipo de vista, por lo que es responsabilidad del programador asegurar que se carguen correctamente. Aunque esto puede parecer un desafío, también brinda un mayor control sobre los datos que se leen del modelo.

⚠️ Propiedad $this->hasData

Este controlador verifica durante la carga (en loadData) si el modelo de la primera pestaña existe en la base de datos. Por ejemplo, si hemos añadido una pestaña EditView con el modelo Producto en primera posición, comprobará si el producto existe. De no ser así, la navegación entre pestañas quedará bloqueada.

Pestañas bloqueadas

Si deseamos que las pestañas siempre estén activas, podemos establecer $this->hasData a true en loadData(). Por ejemplo:

$this->hasData = true;

Método setTabsPosition()

Este método permite colocar las pestañas a la izquierda, arriba, abajo o abajo a la izquierda:

$this->setTabsPosition('left');       // coloca las pestañas a la izquierda
$this->setTabsPosition('top');        // coloca las pestañas arriba
$this->setTabsPosition('bottom');     // coloca las pestañas abajo (la primera pestaña queda arriba y las demás debajo)
$this->setTabsPosition('left-bottom'); // coloca las pestañas abajo a la izquierda (la primera queda arriba y las demás abajo)

Cuando están colocadas abajo (bottom), se muestra la ventana principal (primera vista que se añade) y debajo la información de la pestaña seleccionada. Si solo hay una vista o pestaña (además de la principal), se muestra directamente sin el diseño de pestañas.

🗂️ Acceder a las pestañas: tab() y activeTab()

Cada vista o pestaña que añades en createViews() se guarda con el nombre que le has dado. Para obtener el objeto de una vista concreta desde el controlador, usa tab():

$view = $this->tab('EditFabricante');

Devuelve el objeto de la vista. Si el nombre no existe, lanza una excepción View not found.

Cuando necesites la pestaña que el usuario tiene seleccionada en ese momento, usa activeTab(), que devuelve la vista activa sin que tengas que conocer su nombre:

$view = $this->activeTab();

// por ejemplo, para acceder a su modelo
$model = $this->activeTab()->model;

Es equivalente a $this->tab($this->active).

📑 Agrupar pestañas: setTabGroup()

Desde la versión 2026.7, cuando las pestañas están a la izquierda (posición por defecto), se pueden agrupar bajo un encabezado. Usa setTabGroup() con el nombre de la vista y la clave del grupo, que se traduce con el sistema de traducciones:

protected function createViews() {
    $this->addEditView('EditCliente', 'Cliente', 'customer');
    $this->addListView('ListFacturaCliente', 'FacturaCliente', 'invoices');
    $this->addListView('ListAlbaranCliente', 'AlbaranCliente', 'delivery-notes');

    $this->setTabGroup('ListFacturaCliente', 'sales');
    $this->setTabGroup('ListAlbaranCliente', 'sales');
}

setTabGroup() es un atajo de setSettings($viewName, 'group', $group) y devuelve la vista, así que también puedes indicarlo al crearla:

$this->addListView('ListFacturaCliente', 'FacturaCliente', 'invoices')
    ->setSettings('group', 'sales');

Las pestañas sin grupo se muestran primero y después cada grupo con su encabezado, en el orden en que aparece por primera vez. getTabGroups() devuelve las vistas agrupadas por clave (las que no tienen grupo, bajo la clave vacía).

Los plugins pueden agrupar sus propias pestañas, o las del core, desde una extensión del controlador llamando a setSettings($viewName, 'group', $group). En el core se usan los grupos sales y purchases en clientes, proveedores y agentes, y warehouse en productos.

↔️ Navegación entre registros

Desde la versión 2026.7, cuando se abre un registro haciendo clic en una fila de un listado (ListView), la cabecera del controlador muestra unas flechas ‹ n/m › para pasar al registro anterior o al siguiente del mismo listado, con sus filtros, búsqueda y orden.

No hay que hacer nada para activarla: el listado guarda en caché los destinos de sus filas (el controlador y el código de url() de cada modelo) bajo un token que añade a los enlaces como parámetro navfrom. Si el registro abierto no está en esa lista o el token ha caducado, las flechas no se muestran. getNavigation() devuelve los datos de navegación (prev, next, position y count) o un array vacío.

Cookies
Usamos cookies necesarias para el funcionamiento del sitio y cookies opcionales para recordar tus preferencias y mejorar tu experiencia. Puedes aceptarlas todas, rechazarlas o configurar tus preferencias

Soporte