lunes, 16 de septiembre de 2013

Paginacion en CodeIgniter con Terminos de Busqueda

En este artículo tratare de explicar cómo usar la librería de paginación de CodeIgniter con un termino de búsqueda de tal manera que los enlaces de la paginación sean de la manera:

Controller\accion\termino_de_busqueda\pagina.

La librería de paginación de Codeigniter nos facilita el trabajo de mostrar largas listas de datos generando los enlaces de las paginas siguientes de manera automática, pero no tiene funciones que nos permitan incluir en este listado una búsqueda dinámica y paginar esos resultados.

El problema reside en que al incluir la búsqueda en la paginación, no existe una función específica para incluir la búsqueda en los enlaces de las paginas siguientes. Como una complicación extra solucionaremos este problema paginando el resultado de una consulta de un subconjunto de datos. Y obteniendo los enlaces de la manera:

Controller\accion\id\termino de búsqueda\pagina.

Tenemos la siguiente situación:

 - Lista de Lugares.
 - Lista de Personas que pertenecen a un lugar.
 - Se desea listar las personas pertenecientes a un lugar de manera paginada y sobre ese listado poder hacer búsquedas paginadas por apellido.

 En la pagina de listado de lugares tendremos:

 <a href="personas/ver/1"> Personas en Ciudad 1</a>
 <a href="personas/ver/2"> Personas en Ciudad 2</a>
 <a href="personas/ver/3"> Personas en Ciudad 3</a>

En el controlador de personas se tiene que tener dos acciones "ver" y "ver_busqueda", esta segunda función sirve como una función intermedia para pasar el dato de la cadena de búsqueda cuando se trate de la búsqueda paginada y la primera en caso de que no se tenga una cadena de búsqueda o sea que funcionará normalmente.

La primera función es la siguiente:
<?php
function ver($id_ciudad, $offset = 0){
       //en esta parte verificamos si la paginación es sin un termino de búsqueda
       //o si viene  de la función ver_busqueda con un termino de búsqueda
       if ( $this->session->userdata('var_busqueda')){
             $busqueda=$this->session->userdata('var_busqueda');
             $this->session->unset_userdata('var_busqueda');
       }else{
             $búsqueda='';
       }

       $this->load->model('m_personas');
      
       //Cargamos la librería de paginación
       $this->load->library('pagination');

       //Aquí definimos la estructura de los enlaces según si hay o no un termino de búsqueda
       if ($búsqueda==''){
             $config['base_url'] = base_url().'/index.php/personas/ver/'.$id_ciudad.'/';
             $config['uri_segment'] = '4';
       }else{
             $config['base_url'] = base_url().'/index.php/personas/ver_busqueda/'.$id_ciudad.'/'.$busqueda.'/';
             $config['uri_segment'] = '4';
       }

       $config['total_rows'] = $this->m_personas->nro_de_registros_personas($id_ciudad,$busqueda);
       $config['per_page'] = 25;
       $config['num_links'] =5;
       $config['next_link'] = '>';
       $config['prev_link'] = '<';
       $config['first_link'] = '<<';
       $config['last_link'] = '>>';

       $this->pagination->initialize($config);
       $data["page_links"] = $this->pagination->create_links();

       //obtener el listado de personas usando los datos de offset y  el nro de registros
       $articulos=$this->m_personas->mostrar_personas_paginado($id_ciudad,$busqueda,$offset,$config['per_page']);
       $data['personas']=$personas;
       $data['id_ciudad']=$id_ciudad;
       $this->load->vars($data);

       //cargamos nuestra vista
       $this->load->view('template');
}
?>

En esta tienen que hacer un control para verificar si es el listado es parte de la búsqueda paginada o una paginación normal y dependiendo de esto generar los enlaces para la librería de paginación.


En caso de tener no tener un dato de búsqueda el base_url de la paginación es normal, (no olvidemos que a esta url la librería le adicionara el numero de pagina), en caso de si tener un dato de búsqueda en la variable $búsqueda se debe usar la acción "ver_busqueda" la cual se incluirá en los enlaces de paginación. La función es la siguiente:

<?php

function ver_busqueda($id_ciudad,$busqueda='',$offset = 0){
       if (empty($_POST)){
                   
       }else{
             try {
                    $busqueda=$this->input->post('busqueda');
             } catch (Exception $e) {
                    $busqueda='';
             }
       }
       $this->session->set_userdata('var_busqueda', $busqueda);
       redirect('/personas/ver/'.$id_ciudad.'/'.$offset);
}
?>

Lo que hace es grabar el termino de la búsqueda en una variable de session para ser leída después, y re direccionar a la acción normal con el offset recibido correspondiente  (es necesario tener esta función ya que no hay otra manera que la función ver pueda manejar al mismo tiempo la paginación con o sin búsqueda)

Y en la vista se debe tener el listado de la variable $personas, poner los page_links, Esto ya esta fuera de el alcance de este articulo, pero el formulario para la búsqueda que se debe incluir debería ser más o menos como:

  <div align="center">
       <?php echo form_open('personas/ver_busqueda/'.$id_ciudad.'/'); ?>
       <?php echo form_input("busqueda");?>
       <?php echo form_close();?>
       </div>


Bueno, espero que les sea de utilidad y para cualquier duda estoy a su disposición.

No hay comentarios:

Publicar un comentario