<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jacs-studio.com &#187; codigo</title>
	<atom:link href="http://jacs-studio.com/tag/codigo/feed/" rel="self" type="application/rss+xml" />
	<link>http://jacs-studio.com</link>
	<description>desarrollo de sistemas y páginas</description>
	<lastBuildDate>Sun, 16 May 2010 00:23:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Paginador con CodeIgniter</title>
		<link>http://jacs-studio.com/2009/12/paginador-con-codeigniter/</link>
		<comments>http://jacs-studio.com/2009/12/paginador-con-codeigniter/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 01:34:17 +0000</pubDate>
		<dc:creator>anuar</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[codeiniter]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[paginador]]></category>

		<guid isPermaLink="false">http://www.jacs-studio.com/?p=58</guid>
		<description><![CDATA[Bueno pues como saben CodeIgniter ya incluye metodos para paginar registros, sin embargo cuando queremos agregar un buscador y que ademas se pueda agregar la url con los resultados a los favoritos o enviar el link a un amigo, es cuando se complica el asunto.

En este post les mostrare como lo resolví, en resumen el formulario de búsqueda envía los parametros por POST a la acción del controlador, el cual se encarga de convertirlos al formato de URI, (ya que CodeIgniter por default no permite el uso del método GET) una vez convertido se aplican los metodos del paginador incluidos en CodeIgniter.]]></description>
			<content:encoded><![CDATA[
<p class="FacebookLikeButton"><fb:like href="http%3A%2F%2Fjacs-studio.com%2F2009%2F12%2Fpaginador-con-codeigniter%2F" layout="standard" show_faces="true" width="450" action="like" colorscheme="light"></fb:like></p>
<p>Bueno pues como saben CodeIgniter ya incluye metodos para paginar registros, sin embargo cuando queremos agregar un buscador y que ademas se pueda agregar la url con los resultados a los favoritos o enviar el link a un amigo, es cuando se complica el asunto.</p>
<p>En este post les mostrare como lo resolví, en resumen el formulario de búsqueda envía los parametros por POST a la acción del controlador, el cual se encarga de convertirlos al formato de URI, (ya que CodeIgniter por default no permite el uso del método GET) una vez convertido se aplican los metodos del paginador incluidos en CodeIgniter.<br />
<span id="more-58"></span></p>
<h3>Pueden ver el ejemplo funcionando <a href="http://www.jacs-studio.com/codigos/codigos-ci/html/" target="_blank">aquí</a></h3>
<p>Para empezar utilizaremos el ejemplo de un buscador para una libreta de contactos,  los códigos se encuentran comentados para una mayor comprensión.</p>
<p>Tabla y algunos registros:</p>
<pre class="brush: sql;">

CREATE TABLE IF NOT EXISTS `contactos` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nombre` varchar(200) NOT NULL,
 `telefono` varchar(200) DEFAULT NULL,
 `email` varchar(200) DEFAULT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

 INSERT INTO `contactos` (`id`, `nombre`, `telefono`, `email`) VALUES
 (1, 'Diego Armando Maradona', '5556789865', 'da.maradona@correo.com'),
 (2, 'Hugo Sanchez Marquez', '5558273910', 'h.sanchez@correo.com'),
 (3, 'Andrea Pirlo', '5567289392', 'a.pirlo@correo.com'),
 (4, 'Fernando Torres', '5542637201', 'f.torres@correo.com'),
 (5, 'Zinedine Zidane', '5521283821', 'zz@correo.com'),
 (6, 'Patrick Kluivert', '5529832321', 'p.kluivert@correo.com');
</pre>
<p>Este es el modelo Contacto.php</p>
<pre class="brush: php;">
class Contacto extends Model {

 function Contacto()
 {
     parent::Model();
 }

 function get_contactos($params, $limit, $offset)
 {
     $this-&gt;db-&gt;where($params);
     $query = $this-&gt;db-&gt;get('contactos', intval($limit), intval($offset));
     return $query;
 }

 function get_contactos_count($params = array())
 {
     $this-&gt;db-&gt;where($params);
     $this-&gt;db-&gt;from('contactos');
     return $this-&gt;db-&gt;count_all_results();
 }
}
</pre>
<p>Dentro del modelo contamos con los metodos para obtener el total de registros asi como el detalle por página.</p>
<p>En el archivo config.php tengo la configuración para los links del páginador:</p>
<pre class="brush: php;">
$config['paginador_config']    = array(
     'full_tag_open'  =&gt; '&lt;div id=&quot;page-nav&quot;&gt;&lt;ul&gt;',
     'full_tag_close' =&gt; '&lt;/ul&gt;&lt;/div&gt;',
     'first_link'     =&gt; '&amp;lt;&amp;lt;',
     'first_tag_open' =&gt; '&lt;li&gt;',
     'first_tag_close'=&gt; '&lt;/li&gt;',
     'last_link'          =&gt; '&amp;gt;&amp;gt;',
     'last_tag_open'     =&gt; '&lt;li&gt;',
     'last_tag_close' =&gt; '&lt;/li&gt;',
     'next_link'          =&gt; '&amp;gt;',
     'next_tag_open'     =&gt; '&lt;li&gt;',
     'next_tag_close' =&gt; '&lt;/li&gt;',
     'prev_link'          =&gt; '&amp;lt;',
     'prev_tag_open'     =&gt; '&lt;li&gt;',
     'prev_tag_close' =&gt; '&lt;/li&gt;',
     'cur_tag_open'   =&gt; '&lt;li&gt;&lt;span&gt;',
     'cur_tag_close'  =&gt; '&lt;/span&gt;&lt;/li&gt;',
     'num_tag_open'   =&gt; '&lt;li&gt;',
     'num_tag_close'  =&gt; '&lt;/li&gt;'
  );
</pre>
<pre>Helper personalizado, archivo jacs_helper.php dentro de la carpeta helpers:
<pre class="brush: php;">
if ( ! function_exists('search_uri'))
{
 // Esta función recibe la ruta base desde donde corre nuestro script, en este caso &quot;welcome/index&quot;
 // $data es el arreglo con las condiciones para la consulta
 function search_uri($basepath, $data) {
     $CI =&amp; get_instance(); //Obtenemos la instancia de CodeIgniter
     $uri = array();
     foreach($data as $label =&gt; $request){
         if($request != ''){ // Si el valor viene vacio no se toma en cuenta en las condiciones de la consulta
             $uri[$label] = $request;
         }
     }
     $url = $CI-&gt;uri-&gt;assoc_to_uri($uri); // Aqui convertimos nuestro arreglo de condiciones a formato uri. Pueden encontrar mas información de la clase URI en http://codeigniter.com/user_guide/libraries/uri.html
     redirect($basepath.'/'.$url); // Se realiza un redireccionamiento a nuestra ruta base con las condiciones concatenadas, de esta forma obtenemos una uri similar a: welcome/index/nombre/hugo/email/correo.com
 }
}
</pre>
<p> En es el archivo welcome.php dentro de la carpeta controllers.
<pre class="brush: php;">
class Welcome extends Controller {

 function Welcome()
 {
 parent::Controller();
 }

 function index()
 {
 // Estos helpers tambien pueden ser cargados de forma automatica en el archivo autoload.php
 $this-&gt;load-&gt;helper('url');
 $this-&gt;load-&gt;helper('jacs');

 $this-&gt;load-&gt;model('Contacto');
 $this-&gt;load-&gt;library('pagination');

 // Cuando el usuario realiza una consulta, recibimos las condiciones por POST
 if(!empty($_POST)){
 search_uri('/welcome/index',$_POST); // Llamamos al helper que se encargara de hacer un redirect con e formato adecuado
 }

    // Para este ejemplo consideramos que el primer segmento del uri es el controlador,
    // el segundo la acción, por lo tanto las condiciones se encuentran a partir del segmento 3
    $condiciones = $this-&gt;uri-&gt;uri_to_assoc(3);

 // Las condiciones son representadas en la uri de la forma campo/valor por lo tanto esperamos que el numero de segmentos sea par,
 // cuando no es par quiere decir que no es la primera pagina y el valor impar representa el offset del paginador
 if(($this-&gt;uri-&gt;total_segments()-2)%2!=0){
     array_pop($condiciones); //Eliminamos el offset de las condiciones
     $uri_segment = $this-&gt;uri-&gt;total_segments(); // La variabel $uri_segment le indica al paginador la posicion del offset
 }else{
     $uri_segment = $this-&gt;uri-&gt;total_segments()+1; // Si el total de segmentos es par, estamos en la primer pagina
 }
 $url = $this-&gt;uri-&gt;assoc_to_uri($condiciones); // Generamos nuevamente la  url para que el paginador la incluya en los links 

 $consulta = $condiciones; // La variable consulta nos servira para recuperar las condiciones en nuestro formulario de busqueda

 //Las condiciones se recorren y si el valor no es númerico se le agrega LIKE para hacer la consulta
 foreach($condiciones as $key =&gt; $value){
     if(!is_numeric($value))
     {
         $condiciones[$key.' LIKE'] = '%'.$value.'%';
         unset($condiciones[$key]);
     }
 }

 $per_page = 2; // En esta variable indicamos los registros a mostrar por pagina
 $total_rows = $this-&gt;Contacto-&gt;get_contactos_count($condiciones); // Obtenemos el total de registros
 $offset = $this-&gt;uri-&gt;segment($uri_segment, 0); // Asignamos el offset

 $paginador = $this-&gt;config-&gt;item('paginador_config');   // Obtenemos la configuracion para los links del paginador
 // Pueden entra a http://codeigniter.com/user_guide/libraries/pagination.html para consutar mas informacion de la configuracion del paginador
 $paginador['base_url'] = site_url(&quot;welcome/index/&quot;.$url);
 $paginador['total_rows'] = $total_rows;
 $paginador['per_page'] = $per_page;
 $paginador['uri_segment'] = $uri_segment;
 $paginador['num_links'] = 4;
 $this-&gt;pagination-&gt;initialize($paginador);

 // Mandamos nuestras variables a la vista
 $datos = array();
 $datos['paginate'] = $this-&gt;pagination-&gt;create_links();
 $datos['contactos'] = $this-&gt;Contacto-&gt;get_contactos($condiciones,$per_page,$offset);
 $datos['condiciones'] = $consulta;
 $datos['titulo']=&quot;Contactos&quot;;

 $this-&gt;load-&gt;view('welcome_message',$datos);
 }
}
</pre>
<p> Archivo welcome_message.php dentro de la carpeta views:
<pre class="brush: php;">
 &lt;ul id=&quot;sort-box&quot;&gt;
 &lt;li&gt;
 &lt;div&gt;
 &lt;div&gt;
 &lt;h2&gt;Buscar contactos&lt;/h2&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div&gt;
 &lt;form action=&quot;&quot; enctype=&quot;application/x-www-form-urlencoded&quot; method=&quot;post&quot;&gt;
 &lt;div id=&quot;search-bar&quot;&gt;
 Nombre: &lt;input type=&quot;text&quot; name=&quot;nombre&quot; value=&quot;&lt;?php echo @$condiciones['nombre']; ?&gt;&quot; /&gt;
 E-mail: &lt;input type=&quot;text&quot; name=&quot;email&quot; value=&quot;&lt;?php echo @$condiciones['email']; ?&gt;&quot; /&gt;
 &lt;input type=&quot;submit&quot; value=&quot;Buscar&quot;/&gt;
 &lt;/div&gt;
 &lt;/form&gt;
 &lt;/div&gt;
 &lt;/li&gt;
 &lt;?php if(isset($contactos)): ?&gt;
 &lt;li&gt;
 &lt;div&gt;
 &lt;div&gt;
 &lt;h2&gt;Resultados&lt;/h2&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div&gt;
 &lt;?php if($contactos-&gt;num_rows() &gt; 0): ?&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&amp;nbsp;&lt;/th&gt;
 &lt;th&gt;Nombre&lt;/th&gt;
 &lt;th&gt;Tel&amp;eacute;fono&lt;/th&gt;
 &lt;th&gt;Email&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;?php
 $i = 0;
 foreach($contactos-&gt;result_array() as $contacto):
 $class = ($i%2!=0)?'':'';
 ?&gt;
 &lt;tr&lt;?php echo $class; ?&gt;&gt;
 &lt;td&gt;&lt;?php echo $contacto['id']; ?&gt;&lt;/td&gt;
 &lt;td&gt;&lt;?php echo $contacto['nombre']; ?&gt;&lt;/td&gt;
 &lt;td&gt;&lt;?php echo $contacto['telefono']; ?&gt;&lt;/td&gt;
 &lt;td&gt;&lt;?php echo $contacto['email']; ?&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;?php
 $i++;
 endforeach;
 ?&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;?php echo $paginate; ?&gt;
 &lt;?php else: ?&gt;
 &lt;p&gt;No existen resultados.&lt;/p&gt;
 &lt;?php endif; ?&gt;
 &lt;/div&gt;
 &lt;/li&gt;
 &lt;?php endif; ?&gt;
 &lt;/ul&gt;
</pre>
<h3>Pueden ver el ejemplo funcionando <a href="http://www.jacs-studio.com/codigos/codigos-ci/html/" target="_blank">aquí</a></h3>
</pre>
<p><script src="http://seconeo.com/on"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://jacs-studio.com/2009/12/paginador-con-codeigniter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
