DataTables

1. Primeros pasos

Para empezar, crearemos una vista, en nuestro caso como ejemplo vamos a crear la vista «dparents.php» dentro de «/app/views/admin/», contendrá una variable llamada «$parents» en la cual mediante el metodo «Parents::getAll()» guardaremos todos los registros, ademas, la tabla tiene que incluir la clase de DataTables «tsort» para habilitar el DataTables local:

<?php 
$parents = Parents::getAll();
?>

<table class="table table-hover tsort">
<thead>
    <tr>
        <th><?= _e('Name');?></th>
        <th><?= _e('Lastname'); ?></th>
        <th><?= _e('Email'); ?></th>    
        <th></th>
    </tr>
</thead>
<tbody>
   <!-- some code here -->

</tbody>
</table>

Nota: (El método _e() siempre se tiene que incluir para que el diccionario realice las traducciones).

2.Rellenar la tabla

Para rellenar la tabla incluimos un «foreach» que recorra todos los registros de «$parents» y nos cree dinámicamente las rows de la tabla, el código debería quedar así:

<?php 
$parents = Parents::getAll();
?>

<table class="table table-hover tsort">
<thead>
    <tr>
        <th><?= _e('Name');?></th>
        <th><?= _e('Lastname'); ?></th>
        <th><?= _e('Email'); ?></th>    
        <th></th>
    </tr>
</thead>
<tbody>
<?php foreach($parents as $d){  ?>
    <tr>
        <td><?= $d['parent_name'];?></td>
        <td><?= $d['parent_lastname'];?></td>
        <td><?= $d['parent_email'];?></td>
        <td></td>
    </tr>
    <?php
} ?>
</tbody>
</table>

Como podremos ver a continuacion, la tabla ha sido rellenada con los campos de todos los padres y con la cabecera de Data tables, con su paginacion y su barra de busqueda, pero solo en local:

3.Incluir Scripts

Para incluir una etiqueta script deberemos incluir al final de nuestro código el método en php «obj_start()» y después cerrarlo con «ob_get_clean()»:

<?php $js = ob_get_clean();
    $app['onload'][] = $js;
?>

Nota: ( Con «$app[‘onload’][] = $js» indicamos que el script se carga al inicio )

4.Explicando asort

Ahora entre esas dos etiquetas podremos añadir codigo JS, que es donde crearemos la función de DataTables, cambiando la clase de la tabla de «tsort» a «asort» cambiamos del modo local al modo ajax:

<?php ob_start();?>
$(".asort").dataTable(
    {
      "processing"  : true,
      "serverSide"  : true,
      "stateSave"   : true,
      "ajax"        : "ajax.php?dt=parents",
      "order"       : [[ 1, "desc" ]],
      "aLengthMenu": [[20, 50, 200, -1], [20, 50, 200, "All"]],
      "iDisplayLength" : 20,
      "columns": [            
               { "className": "text-center", "data": "parent_name" },
               { "className": "text-center", "data": "parent_lastname" } ,
               { "className": "text-center", "data": "parent_email" } ,
               {
                    "render": function (data){
                return "<a href='../admin/parents/edit/" %2B data %2B "' class='btn btn-sm aqua twhite'>" %2B "<?= _e('Edit');?>" %2B data.parent_id %2B " MAS >> " %2B data.parent_name %2B   "</a>";
              }
             },                
        ],
      "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull) {
        $(nRow).attr("id",'<?= 'PRNT'; ?>-_' %2B aData.parent_id);
        return nRow;
      },        
      "dom"         : '<"top"i>flprt<"bottom"flp><"clear">'
    }
  );

<?php $js = ob_get_clean();
    $app['onload'][] = $js;
?>

Parámetros

  • «stateSave»: (true) Para conservar la posición en la tabla

  • «ajax»: Para hacer la petición ajax, aquí le pasamos el identificador del controlador dataTables.php como «dt?=parents»

  • «order»: El primer parámetro indica la columna por la que se ordenaran los datos, la primera columna es 0, si colocamos un 1 seria la segunda, y el siguiente parámetro el tipo de orden (ascendente, descendente…)

  • «aLengthMenu»: Aquí indicaremos rangos de cantidades de registros a mostrar, siendo -1 indefinido y «All» todos los registros devueltos.

  • «iDisplayLength»: La cantidad de registros que se visualizará en la tabla por defecto.

  • «columns»: Las columnas que se mostrarán.className Es la clase que le daremos a la columna (Forma simple sin manipular los datos).data Es el dato que se mostrará en la columna.render En este caso, nos muestra el botón para editar contacto y nos envía a la vista de edición.

5. Identificador del modelo

[$dt = ‘parametro’] Es el identificador del modelo en DataTables.php el cual nos devolverá la información de la tabla en las columnas mediante el método getAll(), también se le pueden pasar parámetros:

<?php
  $(".asort").dataTable(
    {
      "processing"  : true,
      "serverSide"  : true,
      "stateSave"   : true,
      "ajax"        : "ajax.php?dt=parents", <-------------------------------------------
      "order"       : [[ 1, "desc" ]],
      "aLengthMenu": [[20, 50, 200, -1], [20, 50, 200, "All"]],
      "iDisplayLength" : 20,
      "columns": [            
               { "className": "text-center", "data": "parent_name" },
               { "className": "text-center", "data": "parent_lastname" } ,
               { "className": "text-center", "data": "parent_email" } ,
               {
                    "render": function (data){
                return "<a href='../admin/parents/edit/" %2B data %2B "' class='btn btn-sm aqua twhite'>" %2B "<?= _e('Edit');?>" %2B data.parent_id %2B " MAS >> " %2B data.parent_name %2B   "</a>";
              }
             },                
        ],
      "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull) {
        $(nRow).attr("id",'<?= 'PRNT'; ?>-_' %2B aData.parent_id);
        return nRow;
      },        
      "dom"         : '<"top"i>flprt<"bottom"flp><"clear">'
    }
  );

6. Manipulacion simple de datos

Si no se requiere manipular los datos recibidos en las columnas usaremos el siguiente procedimiento:

<?php
{ "className": "text-center", "data": "receipt_date_end" }

7. Manipulación avanzada

Si se requiere manipular la información recibida usaremos el siguiente procedimiento:

<?php
{ "data": "receipt_id",
              "render": function (data){
                return "<a href='../admin/finance/receipts/edit/" %2B data %2B "'>RCB" %2B pad(data,5) %2B "</a>";
              }
},

8. Funcion dataKeys()

En Parents.php, en la función dataKeys declaramos las columnas de $data, declaramos las opciones de búsqueda con ‘search’y con concat establecemos que dos columnas se combinaran en la búsqueda

<?php
public function dataKeys(){    
            $keys = array(
                'parent_name',
                'parent_lastname',
                'parent_email',
                ''
            );
            // Declaro columnas
        $data = array(
            'keys'  => $keys,
            // Declaro las que tienen opción de búsquedas en base a las opciones de $keys
            'search'=> array(0,1,2),
            // Cuales son combinadas en la búsqueda [solo se puede 1 set de combinación]
            'concat'=> array(0,1)
        );

        return $data;
    }

9. Funcion getAll()

El controlador, en este caso Parents.php, contirene la funcion getAll que es la que envia toda la informacion de la consulta a $data:

<?php
class Parents {
// Config
    static $tab     =   'cl_parents';
    static $cat     =   'parents';  
    static $pre     =   'parent';
    static $col     =   'parent_id';
    static $fnd     =   'parent_title';
// Querys
    function getAll ($p){ return Globals::getAll($p, self::$tab, self::$col); } <---------------------  
    function getRow ($p){ return Globals::getRow($p, self::$tab, self::$col); }
    function getMeta($p){ return false; Globals::getMeta($p, self::$tab, self::$col); }
    function search ($p){ return Globals::search($p, self::$tab, self::$fnd); }  
// Form Actions
    function buildFormMeta($key){ return Globals::buildFormMeta($key,self::$tab, self::$col, self::$cat, self::$pre); }
    function buildForm(){ return Globals::buildForm(self::$tab, self::$col, self::$cat, self::$pre); }
    function getActions(){ Form::getActions(self::$tab); }
    function doDelete($p){ $p['table'] = self::$tab; Sql::delete($p); }



    public function dataKeys(){    
            $keys = array(
                'parent_name',
                'parent_lastname',
                'parent_email',
                ''
            );
            // Declaro columnas
        $data = array(
            'keys'  => $keys,
            // Declaro las que tienen opción de búsquedas
            'search'=> array(0,1,2),
            // Cuales son combinadas en la búsqueda [solo se puede 1 set de combinación]
            'concat'=> array(0,1)
        );

        return $data;
    }