<?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>Sentido Web &#187; paginacion</title>
	<atom:link href="http://sentidoweb.com/tag/paginacion/feed" rel="self" type="application/rss+xml" />
	<link>http://sentidoweb.com</link>
	<description>Desarrollo web, HTML, CSS, Javascript, PHP, MySQL</description>
	<lastBuildDate>Tue, 10 Apr 2012 01:02:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Consejos para mejorar la paginación</title>
		<link>http://sentidoweb.com/2008/09/25/consejos-para-mejorar-la-paginacion.php</link>
		<comments>http://sentidoweb.com/2008/09/25/consejos-para-mejorar-la-paginacion.php#comments</comments>
		<pubDate>Fri, 26 Sep 2008 00:30:00 +0000</pubDate>
		<dc:creator>displaynone</dc:creator>
				<category><![CDATA[MYSQL]]></category>
		<category><![CDATA[paginacion]]></category>

		<guid isPermaLink="false">http://sentidoweb.com/2008/09/25/consejos-para-mejorar-la-paginacion.php</guid>
		<description><![CDATA[La paginación es algo de lo más costoso a la hora de realizar una búsqueda. Si nos ponemos en el caso de miles de registros con ordenación por cierto campo, la búsqueda puede ser una query muy costosa. Si además unimos el cálculo total de registros encontrados, la página puede tardar mucho en devolverse. Debido [...]]]></description>
			<content:encoded><![CDATA[<p>La paginación es algo de lo más costoso a la hora de realizar una búsqueda. Si nos ponemos en el caso de miles de registros con ordenación por cierto campo, la búsqueda puede ser una query muy costosa. Si además unimos el cálculo total de registros encontrados, la página puede tardar mucho en devolverse.</p>
<p>Debido a ello, para agilizar este tipo de páginas existen unos consejos a tener en cuenta:</p>
<ul><li><strong>Cachea todo lo que se pueda</strong>: el caché evita que se realicen consultas a la BD.</li>
<li><strong>No muestres todos los resultados</strong>: Google no lo hace y nadie se queja por ello. Limita el total de registros a 100 o 500, nadie visita más de 10 páginas normalmente.</li>
<li><strong>No muestres el total de páginas o páginas intermedias</strong>: ofrece tan solo en enlace a &#8220;página siguiente&#8221;, para lo cual puedes obtener 21 registros y mostrar solo 20, así si la consulta te devuelve menos de 21 es que no hay página siguiente.</li>
<li><strong>Estima el número de resultados</strong>: esto también lo hace Google, en vez de calcular el número exacto, se trata de estimar el número aproximado de resultados. Usa EXPLAIN para obtener ese número, puedes usar el campo rows como aproximación.</li></ul>
<p><a href="http://www.mysqlperformanceblog.com/2008/09/24/four-ways-to-optimize-paginated-displays/">Four ways to optimize paginated displays</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sentidoweb.com/2008/09/25/consejos-para-mejorar-la-paginacion.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Smooth Paginator: paginación 2.0</title>
		<link>http://sentidoweb.com/2006/09/07/smooth-paginator-paginacion-2-0.php</link>
		<comments>http://sentidoweb.com/2006/09/07/smooth-paginator-paginacion-2-0.php#comments</comments>
		<pubDate>Thu, 07 Sep 2006 22:30:00 +0000</pubDate>
		<dc:creator>displaynone</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[paginacion]]></category>
		<category><![CDATA[smooth paginator]]></category>
		<category><![CDATA[smooth paginator paginacion]]></category>

		<guid isPermaLink="false">http://sentidoweb.com/2006/09/07/smooth-paginator-paginacion-2-0.php</guid>
		<description><![CDATA[La paginación suele ser algo que suele ir según gustos, los hay quienes quieren un sencillo [anterior] [siguiente], los hay quienes muestran la página actual y algunas anteriores y otras posteriores. Aún sean las preferencias de cada cual, no se puede negar que este estilo de paginación es muy 2.0. Muesta unos enlaces que nos [...]]]></description>
			<content:encoded><![CDATA[La paginación suele ser algo que suele ir según gustos, los hay quienes quieren un sencillo <em>[anterior] [siguiente]</em>, los hay quienes muestran la página actual y algunas anteriores y otras posteriores. Aún sean las preferencias de cada cual, no se puede negar que este estilo de paginación es muy 2.0.
<img alt="smoothpaginator.png" src="http://sentidoweb.com/img/2006/09/smoothpaginator.png" width="400" height="55" class="center"/>
Muesta unos enlaces que nos llevan a páginas y otros enlaces que nos llevan a un grupo de páginas. Por ejemplo, si estamos en la página 20, nos aparecerá también el grupo [60..69], así no tendremos que ir navegando hasta poder llegar a este grupo, podremos acceder de forma rápida.
Incluye un efecto que despliega la paginación, muy vistoso, pero supongo que si la paginación se encuentra oculta por el scrolling (como suele pasar), no se apreciará en absoluto.
<a href="http://www.bigtrapeze.com/2006/08/24/smooth-paginator-v-01/">Smooth Paginator</a>
Vía / <a href="http://www.dzone.com/rsslinks/smooth_paginator_v_01.html">dzone</a>
]]></content:encoded>
			<wfw:commentRss>http://sentidoweb.com/2006/09/07/smooth-paginator-paginacion-2-0.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX paso a paso: paginación de entradas para WordPress</title>
		<link>http://sentidoweb.com/2006/05/25/ajax-paso-a-paso-paginacion-de-entradas-para-wordpress.php</link>
		<comments>http://sentidoweb.com/2006/05/25/ajax-paso-a-paso-paginacion-de-entradas-para-wordpress.php#comments</comments>
		<pubDate>Fri, 26 May 2006 02:15:00 +0000</pubDate>
		<dc:creator>displaynone</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[MYSQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[ajax paginacion wordpress]]></category>
		<category><![CDATA[paginacion]]></category>

		<guid isPermaLink="false">http://sentidoweb.com/2006/05/25/ajax-paso-a-paso-paginacion-de-entradas-para-wordpress.php</guid>
		<description><![CDATA[Siguiendo con AJAX, hoy vamos a realizar un ejemplo que puede ser útil para los usuarios de WordPress. Se trata de un marco que muestra una lista con las entradas de nuestro blog, con paginación y efecto de fundido para darle más vistosidad. El método que vamos a seguir es el siguiente: la aplicación se [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con AJAX, hoy vamos a realizar un ejemplo que puede ser útil para los usuarios de WordPress. Se trata de un marco que muestra una lista con las entradas de nuestro blog, con paginación y efecto de fundido para darle más vistosidad.
<img alt="ajax-paginacion.png" src="http://sentidoweb.com/img/2006/05/ajax-paginacion.png" width="216" height="144" class="center"/></p>

<span id="more-246"></span>
<p>El método que vamos a seguir es el siguiente: la aplicación se conecta mediante AJAX a un script PHP que nos devuelve 5 entradas del blog, las cuales mostraremos en la ventana, inicialmente carga 3 páginas y cuando se avance en la paginación irá cargando otra página.</p>
<p>Esta es la parte AJAX, la parte HTML funciona de la siguiente manera: hay un marco que tiene <a href="http://en.wikipedia.org/wiki/Clipping_%28computer_graphics%29">clipping</a> para solo mostrar lo que nos interesa, y donde estará la página actual que estamos viendo, el resto de las páginas estarán a la derecha o a la izquierda de esta (ocultas debido al clipping). Si se avanza en la paginación, la página actual irá a la izquierda al igual que la nueva que se va a mostrar (que se habrá cargado con AJAX y que inicialmente estará a la derecha). Si se retrocede en la paginación, la página actual irá a la derecha, al igual que la que queremos mostrar. A parte habrá un efecto de fundido para darle más espectacularidad.</p>
<p>La parte PHP es las más sencilla, consta de dos partes: una que obtiene los datos de la base de datos y otra que crea un XML con los datos y los devuelve.</p>
<p>En WordPress existe una tabla que se llama <em>wp_posts</em> que contiene las entradas del blog, tiene dos columnas que nos interesan: el título del post (<em>post_title</em>) y la url del post (<em>guid</em>). Estas dos columnas son las que necesitamos para crear nuestra lista de entradas.</p>
<pre><code>$inc = 5;
$pos = $_GET['pos'];
// Conectamos a la BD
$bd = mysql_connect("localhost", $usuario, $password) or
die("No se puede conectar a la BD: " . mysql_error());
mysql_select_db($nombreBD);
// Obtenemos las entradas y sus enlaces
$res = mysql_query("SELECT guid, post_title FROM wp_posts w where guid is not null AND guid &lt;&gt; '' LIMIT ".($pos-1).", ".($pos+$inc-1));
$datos = null;
// Cargamos los datos en un array
while ($fila = mysql_fetch_array($res)) {
$datos[count($datos)] = array($fila['guid'], $fila['post_title']);
//$datos[count($datos)] = array($fila, $fila);
}
// Liberamos
mysql_free_result($res);
mysql_close($bd);</code></pre>
<p>La creación del XML es simple: leemos los datos, nos creamos una cadena de texto con el XML y lo devolvemos. El XML tiene una raíz llamada <em>datos</em> (como en los ejemplos anteriores de AJAX que hemos publicado), y de este cuelga una elemento <em>entrada</em> por cada uno de los post, y este a su vez un elemento <em>titulo</em> y otro <em>url</em>:</p>
<pre><code>// Devuelvo el XML con la palabra que mostramos (con los '_') y si hay éxito o no
$xml  = '&lt;?xml version="1.0" standalone="yes"?&gt;';
$xml .= '&lt;datos&gt;';
$xml .= '&lt;total&gt;'.count($datos).'&lt;/total&gt;';
$xml .= '&lt;inicio&gt;'.$pos.'&lt;/inicio&gt;';
$xml .= '&lt;final&gt;'.min($pos+$inc-1, count($datos)).'&lt;/final&gt;';
for ($i = 0; $i&lt;count($datos); $i++) {
$xml .= '&lt;entrada&gt;';
$xml .= '&lt;titulo&gt;'.$datos[$i][0].'&lt;/titulo&gt;';
$xml .= '&lt;url&gt;'.$datos[$i][1].'&lt;/url&gt;';
$xml .= '&lt;/entrada&gt;';
}
$xml .= '&lt;/datos&gt;';
header('Content-type: text/xml');
echo $xml;</code></pre>
<p>La parte HTML/Javascript quizás sea un poco más compleja, pero supongo que no habrá problemas para entenderla. Dispondremos de dos capas, una que contiene el fondo y el recuadro para la paginación y otra que contendrá las distintas páginas.</p>
<pre><code>&lt;div class="contenedor"&gt;
&lt;p id="paginacion"&gt;
&lt;a href="javascript: anterior()"&gt;&lt;&lt;&lt;/a&gt;
&nbsp;&lt;span id="inicio"&gt;_&lt;/span&gt; al &lt;span id="final"&gt;_&lt;/span&gt; (&lt;span id="total"&gt;_&lt;/span&gt;)&nbsp;
&lt;a href="javascript: siguiente()"&gt;&gt;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="contenido"&gt;
&lt;div id="marco"&gt;&lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>Con sus estilos:</p>
<pre class="code_no"><code>div.contenedor {
margin: 0 0 0 50%;
left: -100px;
position: absolute;
}
div#contenido {
margin: 0 0 0 50%;
left: -100px;
width: 200px;
height: 120px;
border: 2px solid #008585;
xoverflow: auto;
position: relative;
background: url(gr.gif) repeat-x;
}
div#marco {
width: 200px;
height: 120px;
position: absolute;
clip: rect(auto 200px auto auto);
}
div#contenido p {
width: 200px;
margin: 0px;
padding: 2px 4px 2px 4px;
}
a {
color: #008585;
font-family: Arial;
font-weight: bold;
text-decoration: none;
font-size: 9pt;
}
p#paginacion {
text-align: center;
font-weight: bold;
top: 102px;
position: relative;
border: 2px solid #008585;
background-color: #FFFFFF;
width: 110px;
left: 46px;
font-family: Arial;
font-size: 9pt;
z-index: 100;
}
div#contenido p a {
font-weight: bold;
display: block;
position: relative;
}
div#contenido p a:hover {
background-color: #008585;
color: #FFFFFF;
}</code></pre>
<p>El elemento que se encarga la paginación consta de varios <em>span</em> que son los que modificaremos para escribir de cual a cual enseñamos y cuantos hay en total. El elemento <em>marco</em> es el que usaremos para añadir cada una de las páginas y es el que tiene el clipping. Cuando se carga una página se colocará a la derecha del recuadro (fuera del clipping), menos la página para la posición 1 (la primera), que se colocará dentro del recuadro.</p>
<pre><code>function paginacion(pos) {
max = Math.max(pos, max);
ajax = ajaxobj();
ajax.open("GET", "paginacion.php?pos="+pos, true);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
// Accion que ejecutamos cuando recibimos los datos
var datos = ajax.responseXML;
var entradas = datos.getElementsByTagName('entrada');
var contenido = document.getElementById("marco");
// Creamos una capa con posición
// absoluta para poder moverla
// La capa representa la página
var capa = document.createElement("DIV");
capa.id = "capa"+pos;
capa.style.position = "absolute";
// Si no es la primera página la colocamos a la derecha
if (pos != 1) {
capa.style.left = ancho+"px";
}
// Para cada entrada nos creamos mediante DOM
// un objeto P y dentro un objeto A con el enlace
// a la página
for (var i=0; i&lt;entradas.length; i++) {
var p = document.createElement("P");
var link = document.createElement("A");
link.setAttribute("href", entradas[i].childNodes[0].firstChild.data);
var txt = entradas[i].childNodes[1].firstChild.data;
// Acortamos el texto para que no se sobrepase
var linkTxt = document.createTextNode(txt.substring(0, 25)+(txt.length &lt;= 25? "":"..."));
link.appendChild(linkTxt);
p.appendChild(link);
capa.appendChild(p);
}
contenido.appendChild(capa);
var ini = datos.getElementsByTagName('inicio').item(0).firstChild.data;
var act = datos.getElementsByTagName('final').item(0).firstChild.data;
var tot = datos.getElementsByTagName('total').item(0).firstChild.data;
paginas[ini] = new Array(act, tot);
// Si es el primero modificamos los datos de paginacion
// si no, ya se cambiarán cuando avancemos/retrocedamos
if (pos == 1) {
document.getElementById("inicio").innerHTML = ini;
document.getElementById("final").innerHTML = act;
document.getElementById("total").innerHTML = tot;
inicio = false;
}
}
}
ajax.send(null);
}</code></pre>
<p>Las funciones para avanzar o retroceder en la paginación existen las siguientes funciones:</p>
<pre><code>// Avanza en la paginacion
function siguiente() {
if (paginas[posActual + inc]) {
// Muevo a la izquierda la actual
desplazar("capa"+posActual, false, 1);
posActual += inc;
visitados[posActual] = true;
// Muevo a la izquierda la nueva
desplazar("capa"+posActual, false, ancho);
document.getElementById("inicio").innerHTML = posActual;
document.getElementById("final").innerHTML = paginas[posActual][0];
document.getElementById("total").innerHTML = paginas[posActual][1];
// Cargo una nueva pagina
if (posActual &lt; paginas[posActual][1]) {
paginacion(parseInt(max)+inc);
}
}
}
// Retroce en la paginacion
function anterior() {
if (paginas[posActual - inc]) {
// Muevo a la derecha la actual
desplazar("capa"+posActual, true, 1);
posActual -= inc;
// Muevo a la derecha la nueva
desplazar("capa"+posActual, true, -ancho);
document.getElementById("inicio").innerHTML = posActual;
document.getElementById("final").innerHTML = paginas[posActual][0];
document.getElementById("total").innerHTML = paginas[posActual][1];
}
}</code></pre>
<p>Y las funciones para desplezar las capas y el efecto de fundido son las siguientes:</p>
<pre><code>function desplazar(id, derecha, pos) {
var obj = document.getElementById(id);
var desp = (derecha? -1: 1)*velocidad;
obj.style.left = (pos-desp)+"px";
if (Math.abs(pos-desp) < ancho &#038;&#038; pos-desp != 0) {
setTimeout("desplazar('"+id+"', "+derecha+", "+(pos-desp)+")", 30);
}
transparencia(obj, 100 - (Math.abs(pos-desp)*100/ancho));
}
function transparencia(obj, porc) {
if (typeof obj.style.filter != 'undefined') { // Es IE
obj.style.filter = "alpha(opacity="+porc+")";
} else {
obj.style.opacity = porc/100;
}
}</code></pre>
<p>Podéis bajaros el código <a href="http://sentidoweb.com/img/2006/05/paginacion.zip">aquí</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sentidoweb.com/2006/05/25/ajax-paso-a-paso-paginacion-de-entradas-para-wordpress.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

