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