Esta web utiliza cookies propias y de terceros para su funcionamiento. ¿Aceptas? Leer más
mi_controlador.php

fs_list_controller

Este es un controlador extendido para facilitar el desarrollo. Permite mostrar uno o varios listados de tablas en pestañas. Incluye buscador, paginación, opciones de ordenación y filtros. No necesita definir una vista (incluye la suya propia). Tienes un video-tutorial muy completo aquí: https://youtu.be/M5LlRJOJ_Eg

Ejemplo (mi_listado.php)

En este listado vamos a mostrar una pestaña 'historial' con el contenido de la tabla fs_logs, y una pestaña 'Artículos' con el contenido de la tabla articulos.

<?php

class mi_listado extends fs_list_controller
{
    public function __construct()
    {
        parent::__construct(__CLASS__, 'mi listado', 'ventas');
    }

    protected function create_tabs()
    {
        /// pestaña historial
        $this->add_tab('logs', 'Historal', 'fs_logs', 'fa-book');
        $this->add_search_columns('logs', ['usuario', 'tipo', 'detalle', 'ip']);
        $this->add_sort_option('logs', ['fecha'], 2);

        /// filtros
        $tipos = $this->sql_distinct('fs_logs', 'tipo');
        $this->add_filter_select('logs', 'tipo', 'tipo', $tipos);
        $this->add_filter_date('logs', 'fecha', 'desde', '>=');
        $this->add_filter_date('logs', 'fecha', 'hasta', '<=');
        $this->add_filter_checkbox('logs', 'alerta', 'alerta');

        /// decoración
        $this->decoration->add_column('logs', 'fecha', 'date');
        $this->decoration->add_column('logs', 'alerta', 'bool');
        $this->decoration->add_column('logs', 'usuario');
        $this->decoration->add_column('logs', 'tipo');
        $this->decoration->add_column('logs', 'detalle');
        $this->decoration->add_column('logs', 'ip');

        /// pestaña articulos
        $this->add_tab('articulos', 'Articulos', 'articulos', 'fa-cubes');
        $this->add_search_columns('articulos', ['referencia','descripcion']);
        $this->add_sort_option('articulos', ['referencia'], 1);

        /// decoración
        $this->decoration->add_column('articulos', 'referencia');
        $this->decoration->add_column('articulos', 'descripcion');
        $this->decoration->add_row_url('articulos', 'index.php?page=ventas_articulo&ref=', 'referencia');
    }
}

create_tabs()

En esta función es donde debes añadir las pestañas y sus opciones.

Añadir pestaña:

$this->add_tab($tab_name, $title, $table_name, $icon);

Esta función añade una nueva pestaña al listado, con el nombre interno $tab_name, el título $title y el icono $icon. El contenido lo leera de la tabla $table_name, aunque tendremos que usar $this->decoration->add_column() para indicar las columnas a mostrar.

Añadir columnas sobre las que buscar:

$this->add_search_columns($tab_name, $columns);

Indica al controlador cuales son las columnas de la tabla sobre las que debe buscar cuando el usuario busque algo. $columns debe ser una array, por ejemplo ['usuario','tipo'].

Añadir opciones de ordenación:

$this->add_sort_option($tab_name, $columns, $option = 0);

Con esta función añadimos dos opciones al selector de ordenación. Una ascendente y una descendente. Si por ejemplo añadimos las columnas ['fecha', 'hora'], estaremos añadiendo fecha ASC, hora ASC y fecha DESC, hora DESC como opciones al ORDER BY generado.

$option permite estos valores:

  • 0: nada.
  • 1: fecha ASC, hora ASC como opción predeterminada.
  • 2: fecha DESC, hora DESC como opción predeterminada.

Añadir filtro checkbox:

$this->add_filter_checkbox($tab_name, $col_name, $label, $operation = '=', $match_value = true)

Añadimos un filtro checkbox al buscador de la pestaña $tab_name. Al marcar, se añadirá esto al SQL: AND $colname = true.

Añadir filtro de fecha:

$this->add_filter_date($tab_name, $col_name, $label, $operation);

Añadimos un filtro de fechas al buscador de la pestaña $tab_name. Al marcar, se añadirá esto al SQL: AND $colname $operation $value. Si por ejemplo queremos mostrar todos los resultados con una fecha igual o superior a la que indique el usuario, esto sería así:

$this->add_filter_date('logs', 'fecha', 'desde', '>=');

Añadir filtro select:

$this->add_filter_select($tab_name, $col_name, $label, $values);

Añadimos un filtro select al buscador. Se rellenará con $values y si el usuario selecciona uno, se mostrarán solamente los resultados con ese valor.

Obtener valores rápidamente de una tabla: Podemos usar la función $this->sql_distinct($tabla, $columna)

$values = $this->sql_distinct('fs_logs', 'tipo');

Añadir columnas a mostrar en el listado:

$this->decoration->add_column($tab_name, $col_name, $type = 'string', $title = '', $class = '', $base_url = '');
  • $tab_name: nombre de la pestaña.
  • $col_name: nombre de la columna a mostrar.
  • $type: por defecto string. Tipos soportados: string, bool, number, money, date y datetime.
  • $title: título de la columna. Por defecto se usa el nombre de la columna.
  • $class: para añadir alguna clase css a la columna. Ejemplos:
    • text-right: alinear a la derecha.
    • text-left: alinear a la izquierda.
    • text-center: texto centrado.
  • $base_url: para indicar que quieres que se muestre esa columna con enlaces. Estos enlaces se generan sumando $base_url con el valor de la columna.

Clic en la línea:

Si deseas que al hacer clic en una línea de los resultados se redirija a una url, debes usar esta función para indicar la url:

$this->decoration->add_row_url($tab_name, $base_url, $col_name);
  • $tab_name: el nombre de la pestaña.
  • $base_url: el principio de la url a construir.
  • $col_name: la columna, cuyo valor se añadirá a $base_url para formar la url final.

Colorear líneas:

Para colorear las líneas en función del contenido podemos usar la función add_row_option() del decorador.

$this->decoration->add_row_option($tab_name, $col_name, $value, $class);

Un ejemplo de añadir varias opciones de colores sería este:

$this->decoration->add_row_option('logs', 'alerta', true, 'danger');
$this->decoration->add_row_option('logs', 'tipo', 'error', 'danger');
$this->decoration->add_row_option('logs', 'tipo', 'msg', 'success');

En este caso le estamos diciendo al decorador que si la línea tiene el valor true en la columna alerta, añada la clase danger (que pinta de rojo). Si la columna tipo tiene el valor 'error', también pinta de rojo. Y si la columna tipo tiene el valor 'msg', entonces pinta de verde (success).

Añadir botones:

$this->add_button($tab_name, $label, $link = '#', $icon = '', $class = 'btn-default', $id = '', $target = '');

Añade un botón con el texto $label y el icono $icon. Al pulsar el botón se redirige al usuario a la url $link.

Opciones avanzadas

Podemos personalizar aun más este controlador cambiando las plantillas o incluso el propio decorador.

Cargar plantilla personalizada

Este controlador dispone de 3 plantillas: la general ($this->template), la de la parte superior ($this->template_top) y la de la parte inferior ($this->template_bottom). Son propiedades públicas que podemos modificar:

$this->template_top = 'mi_plantilla_top';

Añadir filtro personalidado

Podemos crear nuestros propios filtros, simplemente tienen que heredar de fs_list_filter. Para usarlos en el controlador, los añadiremos con la función add_filter().

$filter = new my_custom_filter();
$this->add_filter('my_tab', $filter);

Sustituir el decorador por uno personalizado

Podemos incluso sustituir el decorador entero por uno propio. Este decorador propio debe heredar de la clase fs_list_decoration.

$this->decoration = new custom_list_decoration($this->decoration);

Le pasamos el decorador antiguo como parámetro al constructor para que copie los valores de configuración.