Simple datagrid con opciones

De KumbiaPHP Framework Wiki

helpers para crear de forma simple un datagrid (con algunas opciones adicionales), con base en el Simple datagrid del FiDeLio

Código del helpers

<?php

class Registro {

    /**
     * Helpers para crear un datagrid sencillo a partir de un ActiveRecord
     * Ejemplo:
     * Sin Opciones
     * <code>
     * $campos = array(
     *		'Codigo' => 'id',
     *		'Nombre' => 'nombre',
     *		'Telefono' => 'telefono',
     *		'Direccion' => 'direccion');
     * </code>
     * Con Opciones
     * <code>
     * $campos = array(
     *		'Codigo' => 'id',
     *		'Nombre' => 'nombre',
     *		'Telefono' => 'telefono',
     *		'Direccion' => 'direccion',
     *          'Opciones' => '$');
     *
     * $opciones = array(
     *		'Actulizar' => 'controlador/actualizar/',
     *		'Modificar' => 'controlador/modificar/',
     *		'Detalles' => 'controlador/detalles/',
     *		'Borrar' => 'controlador/borrar/');
     * </code>
     * Adicionales
     * <code>
     * $campos = array(
     *		'sexo' => 'Femenino|Masculino',
     *		'estado' => 'Activo|Inactivo',
     *		't_vivienda' => 'Propia|Alquilada|Heredada|Choza');
     * </code>
     *
     * @param Object $modelo
     * @param Array $campos
     * @param Array/Null $opciones
     * @param Array/Null $adicionales
     * @return String 
     *
     */
    public static function datagrid($modelo, $campos, $opciones = NULL, $adicionales = NULL) {

        // Agregar el ccs para el datagrid
        Tag::css('datagrid');

        // Cabecera
        $grid = "<div id=\"datagrid\">";
        $grid .= "<table border=\"0px\" cellpadding=\"0px\" cellspacing=\"0px\" align=\"center\">";
        $grid .= "<thead><tr>";

        // Titulo de la tabla
        foreach ($campos as $titulo => $valor):

            // Campo pequeño si es Id o Código
            if ( $titulo == "C&oacute;digo" || $titulo == "Id" ):
                $grid .= "<th width=\"10px\">";
            else:
                $grid .= "<th>";
            endif;

            $grid .= $titulo;
            $grid .= "</th>";

        endforeach;

        $grid .= "</tr></thead><tbody>";
        $i = 1;

        // Datos de la tabla
        if (count($modelo)) :
            foreach ($modelo as $model):

                // Columnas pares o impares
                if ( ($i%2) == 0 ):
                    $colm = 'par';
                else:
                    $colm = 'impar';
                endif;
                $grid .= "<tr class=\"$colm\">";
                $i++;

                // Data
                foreach ($campos as $campo):

                    // Si es activado la fila Opciones
                    if ( $campo == '$' ):

                        $grid .= "<td align=\"center\" width=\"150\">";
                        $cant = count($opciones);
                        $j = 1;

                        foreach ($opciones as $opcion => $link):

                            $link = $link . $model->id;
                            $grid .= Html::link($link, $opcion);

                            if ($cant != $j):
                                 $grid .= " | ";
                            endif;

                            $j++;
                        endforeach;

                        $grid .= "</td>";
                    else:

                        // Centrar si el campo es el id
                        if ( $campo == "id" ):
                            $campoc = "align=\"center\"";
                        else:
                            $campoc = "align=\"left\"";
                        endif;

                        if (count($adicionales)) :
                            if (array_key_exists ($campo, $adicionales)):
                                    $addons = explode("|", $adicionales[$campo]);
                                    $grid .= "<td $campoc>" . $addons[$model->$campo] . "</td>";
                            else:
                                $grid .= "<td $campoc>" . $model->$campo . "</td>";
                            endif;
                        else:
                            $grid .= "<td $campoc>" . $model->$campo . "</td>";
                        endif;

                    endif;
                endforeach;

                $grid .= "</tr>";

            endforeach;
        else:
            $grid .= "<tr><td colspan='" . count($campos) . "' align='center'>No hay registros </td></tr>";
        endif;
        $grid .= "</tbody></table></div>";
        
        return $grid;
    }
}
?>

Modo de Uso

En el controlador

Aquí definimos algunos parámetros para dar una respuesta bastante completa del datagrid

        // Datos para datagrid
        $this->modelo = Load::model('datos_personales')->find();
        $controlador = $this->controller_name;
        $this->campos = array(
            'Credencial' => 'credencial',
            'Primer Nombre' => 'primer_nombre',
            'Primer Apellido' => 'primer_apellido',
            'Sexo' => 'sexo',
            'Opciones' => '$'
        );

        // Definimos las acciones que tendremos en la columna Opciones
        $this->opciones = array(
            'Modificar' => "$controlador/crear/",
            'Borrar' => "$controlador/borrar/"
        );

        // El asignamos unos String equivalente para el campo sexo esto 
        // para que no muestre un resultado más amigable que 0 ó 1
        // podría servir igual para estado en que se obtendría Activo ó Inactivo
        $this->adicionales = array(
            'sexo' => 'Femenino|Masculino'
        );

En la vista

	<?php echo Registro::datagrid($modelo, $campos, $opciones, $adicionales) ?>

Realizado por Jaro Marval (Jamp)