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.

miércoles, 5 de junio de 2013

Como configurar Codeigniter para conectarse a SQL Server 2008

Este post es para aclarar el procedimiento para habilitar la conexión a Microsoft SQL Server desde Codeigniter ya que recientemente tuve la necesidad de hacerlo y me encontré con varios problemas y ninguna explicación clara, Para estas instrucciones tomen en cuenta que utilicé XAMPP en el servidor, pero se puede aplicar a cualquier otro stack que utilicen:

PARA WINDOWS XP

Para windows XP tenemos que limitarnos a usar php version 5.3.x, mas adelante les indicare por que, por lo tanto si usáran XAMPP, la version 1.7.3 funciona perfecto.Versiones antiguas de Xampp.

1er Paso - Instalar el SQL Native Client de Microsoft:

Para Windows XP es suficiente la versión SQL Native Cliente de 2008 para la version de el driver que instalaremos en el paso 2, pero se puede instalar la del 2012 tambien si se desea. La version del cliente para 2008 pueden descargarlo Aqui

2do Paso - Instalacion del Driver de Microsoft para PHP para SQL Server:

Para usar los Microsoft Drivers for PHP for SQL Server, deben tener instalado el SQL Server Native Client de el punto 1 en el mismo equipo donde esta corriendo PHP.
Bajaremos la versión 2 , que necesita el Native Cliente para 2008 que bajamos en el punto 1 , bajenselo de Microsoft Drivers 3.0 for PHP for SQL Server (Bajen la versión 2 ).
Por que la versión 2, pues es la que funciona con php 5.3.x, contiene los archivos:

php_sqlsrv_53_ts_vc6.dll
php_pdo_sqlsrv_53_ts_vc6.dll

Para mi caso, para su caso especifico, deben fijarse en la funcion phpinfo() de su servidor, qué version de PHP (de ahí la parte 53, osea 5.3.X) tienen, y con que Versión esta compilada( de ahí la parte vc6) y la opción Thread Safety, si esta activada ( de ahí a parte ts).

Este Driver lo tienen que instalar en la carpeta de extensiones de PHP, en el caso del Xampp esta en c:\xampp\php\ext

3er Paso- Configuracion en PHP.ini :

En la configuración de PHP, específicamente en el archivo php.ini, debemos activar estas extensiones adicionando las lineas:

extension=php_sqlsrv_53_ts_vc6.dll
extension=php_pdo_sqlsrv_53_ts_vc6.dll

Seguidamente debemos detener el servidor y volver a iniciarlo.

4to Paso - Configuracion en CodeIgniter:

Finalmente en el archivo database.php en la carpeta de configuración de Codeigniter debemos dejar las opciones de la siguiente manera (presten atención a los detalles):

$db['default']['hostname'] = '192.168.XX.XX'; //el ip o nombre del Servidor SQL
$db['default']['username'] = 'sa';
$db['default']['password'] = 'tupassword';
$db['default']['database'] = 'tu_DB';
$db['default']['dbdriver'] = 'sqlsrv'; //si, poner sqlsrv
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE; //ponerlo a False
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

Y listo, pueden usar MS SQL Server como base da datos para su proyecto en CodeIgniter.


PARA WINDOWS 7 O MAYOR:

Para Windows 7 podemos usar la ultima versión del XAMPP  que viene con PHP 5.4.x por lo tanto pueden bajarse la ultima versión del XAMPP de Aqui

1er Paso - Instalar el SQL Native Client de Microsoft:

Ahora si, necesitamos la versión para SQL Server 2012 pueden descargarla de Aqui

2do Paso - Instalación del Driver de Microsoft para PHP para SQL Server:

Para usar los Microsoft Drivers for PHP for SQL Server, deben tener instalado el SQL Server Native Client de el punto 1 en el mismo equipo donde esta corriendo PHP.
En el caso de Windows 7 podemos bajar la versión 3 para que trabaje con nuestro PHP versión 5.4.x, bajenselo de Microsoft Drivers 3.0 for PHP for SQL Server (Bajen la versión 3 ).

Contiene, ente otros, los archivos:

php_sqlsrv_54_ts.dll
php_pdo_sqlsrv_54_ts.dll
php_sqlsrv_54_nts.dll
php_pdo_sqlsrv_54_nts.dll

Según su PHP este configurado como Thread Safety(ts) o no (nts).

Este Driver lo tienen que instalar en la carpeta de extensiones de PHP, en el caso del Xampp esta en c:\xampp\php\ext

3er Paso- Configuracion en PHP.ini :

En la configuración de PHP, específicamente en el archivo php.ini, debemos activar estas extensiones adicionando las lineas:

extension=php_sqlsrv_54_ts.dll
extension=php_pdo_sqlsrv_54_ts.dll

Seguidamente debemos detener el servidor web y volver a iniciarlo.

4to Paso - Configuración en CodeIgniter :

Finalmente en el archivo database.php en la carpeta de configuración de CodeIgniter debemos dejar las opciones de la siguiente manera (presten atención a los detalles):

$db['default']['hostname'] = '192.168.XX.XX'; //el ip o nombre del Servidor SQL
$db['default']['username'] = 'sa';
$db['default']['password'] = 'tupassword';
$db['default']['database'] = 'tu_DB';
$db['default']['dbdriver'] = 'sqlsrv'; //si, poner sqlsrv
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE; //ponerlo a False
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

Bueno, eso es todo espero que les sea de ayuda.



lunes, 27 de mayo de 2013

Como reducir el registro de SQL Server 2008

Este es un problema muy comun, el registro de SQL Server crece en exceso y puede llegar a llenar un servidor pequeño. En versiones Anteriores el problema era mas complejo, pero desde la version 2008 el reducir este archivo se puede lograr con el siguiente script 100% garantizado:

Use mi_db
GO
 
Alter Database mi_db Set Recovery Simple
GO

Alter Database mi_db Set Recovery Full
GO

DBCC SHRINKFILE ('mi_db_Registro', 1)
GO

Donde "mi_db" es el nombre de tu base de datos y "mi_db-registro" es el nombre del regsitro de tu base de datos, puedes verificarlo en las propiedades de la base de datos.

Espero que les sea de Ayuda.