Si lo prefiere, puede identificarse mediante sus redes sociales.
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
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');
}
}
En esta función es donde debes añadir las pestañas y sus opciones.
$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.
$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'].
$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:
$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.
$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', '>=');
$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');
$this->decoration->add_column($tab_name, $col_name, $type = 'string', $title = '', $class = '', $base_url = '');
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);
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).
$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.
Podemos personalizar aun más este controlador cambiando las plantillas o incluso el propio decorador.
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';
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);
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.