JMiur [E]

Si bien es cierto que los feeds dan muchas posibilidades para leer los datos de nuestro blog usando JSON de manera relativamente simple, esto tiene dos limitaciones importantes, una objetiva y otra subjetiva. La primera es que no podemos leer TODO ya que siempre nos toparemos con que hay un máximo de 500 items; la segunda es que aún así, cargar cantidades importantes es impráctico porque el tiempo de ejecución se multiplica de manera significativa e incluso, hará que aparezcan ventanas de alerta en los navegadores si ese tiempo supera el tiempo máximo establecido por cada uno de ellos y se nos solicitará autorización para continuar o cancelar.

La combinación de ambas limitaciones es el motivo fundamental por la cual debemos usar valores pequeños; leer sólo una cantidad de entradas y mostrar eso pero claro, uno siempre quiere más; entonces se hace imprescindible que tengamos alguna clase de paginación o navegación que nos permita ir mostrando pedacitos de información e irlas cargando a medida que el usuario las solicita.

Acá es cuando podemos hacer uso del parámetro start-index que es el que nos permite solicitar datos a partir de determinada entrada; por ejemplo, esto cargaría las últimas 10 entradas:
http://miblog.blogspot.com/feeds/posts/default?start-index=1&max-results=10&orderby=published&alt=json-in-script&callback=mifuncion
y esto las siguientes diez:
http://miblog.blogspot.com/feeds/posts/default?start-index=11&max-results=10&orderby=published&alt=json-in-script&callback=mifuncion
y así, sucesivamente:
http://miblog.blogspot.com/feeds/posts/default?start-index=21&max-results=10&orderby=published&alt=json-in-script&callback=mifuncion
http://miblog.blogspot.com/feeds/posts/default?start-index=31&max-results=10&orderby=published&alt=json-in-script&callback=mifuncion
Podría, entonces, combinarse eso con alguno de los tantos scripts que hay pero sería engorroso y además, terminaríamos llenando la memoria con tanta cosa que en algún momento colapsaría el navegador o se haría imposible de usar.

Muchos podrían decir que, sin embargo, hay decenas de sitios donde parece que esto de la paginaciòn funciona ya que podemos navegar por la información sin salir de la página, vemos alguna clase de imagen de carga y avanzamos o retrocedemos pero, ese tipo de sitios suele usar PHP o Ajax, dos cosas que en Blogger nos están vedadas así que hay que buscar una solución alternativa y una de ellas es utilizar la idea de cargar scripts de manera dinámica de tal forma que si eso lo combinamos con lo inverso y podemos remover el script, solucionaríamos el problema y podríamos cargar los datos, usarlos y deshacernos de ellos.

Entonces, vamos a tratar de usar eso para mostrar TODAS las entradas del blog en una misma página sin colapsarla, agregándole la posibilidad de navegar por ellas.


Paginar: he ahí el dilema y, como esto va a ser una mezcolanza de cosas, para poder hacer una buena paginación, lo que debemos hacer es usar algo que ya exista; en este caso, uno de los tantos scripts de PHP que hay pero traducido a JavaScript.

¿Cómo paginamos algo? Necesitamos tres datos: saber la cantidad total de entradas, determinar la cantidad de entradas por página que se mostrarán y saber en qué página estamos; lo primero es un dato que tiene el mismo feed así que podemos leerlo ya que hay muchos gadgets que muestran la cantidad de entradas publicadas:
postporpagina = 50; // es un dato que definimos nosotros
cantidadposts = parseInt(json.feed.openSearch$totalResults.$t); // leemos la cantidad de entradas publicadas
cantidadpaginas = parseInt(cantidadposts / postporpagina) + 1; // y calculamos la cantidad total de páginas
Acá van las explicaciones: Ver/Ocultar [+]
// estos son los datos que debemos establecer
var postporpagina = 60; // la cantidad de entradas a mostrar por página
var urlsitio = "http://miblog.blogspot.com"; // la url de nuestro blog
var minpaginas = 5; // la cantidad mínima de páginas a mostrar
var maxpaginas = 10; // la cantidad máxima de páginas a mostrar
var imgxdefecto = "http://xxxxxxxxxxx"; // la dirección de la imagen por defecto a ser utilizada

var firsttime = 0; // lo usamos para detectar la primera vez que se ejecuta
var paginaactual = 1; // contendrá el número de página donde estemos
var cantidadpaginas = 0; // contendrá el número total de páginas
var cantidadposts = 0; // contendrá el número total de entradas

// la función que interpreta los feeds y que siempre es más o menos la misma
function showpageposts(json) {
  var entry, posttitle, posturl, postimg;
  var salida = "";

  // la primera vez que se ejecuta la función, leemos la cantidad de entradas que hay y calculamos la cantidad de páginas
  if(cantidadpaginas==0) {
    cantidadposts = parseInt(json.feed.openSearch$totalResults.$t);
    cantidadpaginas = parseInt(cantidadposts / postporpagina) + 1;
  }

  // leemos los datos que luego mostraremos
  for (var i = 0; i < postporpagina; i++) {
    if (i == json.feed.entry.length) { break; } // si no hay más, salimos
    entry = json.feed.entry[i];

    // el título de las entradas
    posttitle = entry.title.$t;

    // buscamos la url de las entradas
    for (var k = 0; k < entry.link.length; k++) {
      if (entry.link[k].rel == 'alternate') {
        posturl = entry.link[k].href;
        break;
      }
    }

    // buscamos la imagen de las entradas o usamos la que establecimos por defecto
    if ("media$thumbnail" in entry) {
      postimg = entry.media$thumbnail.url;
    } else {
      postimg = imgxdefecto;
    }

    // armamos el código HTML de salida de manera similar a lo que se veía en una <a href="http://vagabundia.blogspot.com/2010/12/usar-json-para-mostrar-las-entradas-del.html" target="_blank">entrada anterior</a>
    salida += "<div class='paginaposts'>";
    salida += "<a href='" + posturl + "' target='_blank'><img src='" + postimg + "' /></a>";
    salida += "<h6><a href='" + posturl + "' target='_blank'>" + posttitle + "</a></h6>";
    salida += "</div>";
  }
  
  // listo, ahora lo mostramos
  document.getElementById("resultados").innerHTML = salida;

  // y ejecutamos la función para paginar
  paginacion();
}

// esta es la función que muestra la paginación
function paginacion() {
  contadorP = 0;
  salida = "";

  // dependiendo de donde estamos, ponemos un enlace para retroceder o no
  if(paginaactual>1) {
    salida += "<a class='antesdespues' href='javascript:incluirscript(" + parseInt(paginaactual-1) + ")'>anterior</a>";
  } else {
    salida += "<span class='deshabilitado'>anterior</span>";
  }

  // se calcula y se muestran los números de las primeras páginas, una sepación y las últimas páginas
  if (cantidadpaginas<(maxpaginas+1)) {
    for (contadorP = 1; contadorP <= cantidadpaginas; contadorP++){
      if (contadorP==paginaactual) {
        salida += "<span class='actual'>" + contadorP + "</span>";
      } else {
        salida += "<a href='javascript:incluirscript(" + contadorP + ")'>" + contadorP + "</a>";
      }
    }
  } else if(cantidadpaginas>(maxpaginas-1)) {
    if(paginaactual<minpaginas) {
      for (contadorP=1; contadorP<(maxpaginas-2); contadorP++){
       if (contadorP == paginaactual) {
         salida += "<span class='actual'>" + contadorP + "</span>";
       } else {
         salida += "<a href='javascript:incluirscript(" + contadorP + ")'>" + contadorP + "</a>";
       }
     }
     salida += " ... ";
     salida += "<a href='javascript:incluirscript(" + parseInt(cantidadpaginas-1) + ")'>" + parseInt(cantidadpaginas-1) + "</a>";
     salida += "<a href='javascript:incluirscript(" + cantidadpaginas + ")'>" + cantidadpaginas + "</a>";
    } else if(cantidadpaginas-(minpaginas-1)>paginaactual&&paginaactual>(minpaginas-1)) {
      salida += "<a href='javascript:incluirscript(1)'>1</a>";
      salida += "<a href='javascript:incluirscript(2)'>2</a>";
      salida += " ... ";
      for (contadorP=paginaactual-2; contadorP<=paginaactual+2; contadorP++) {
        if (contadorP==paginaactual) {
          salida += "<span class='actual'>" + contadorP + "</span>";
        } else {
          salida += "<a href='javascript:incluirscript(" + contadorP + ")'>" + contadorP + "</a>";
        }
      }
      salida += " ... ";
      salida += "<a href='javascript:incluirscript(" + parseInt(cantidadpaginas-1) + ")'>" + parseInt(cantidadpaginas-1) + "</a>";
      salida += "<a href='javascript:incluirscript(" + cantidadpaginas + ")'>" + cantidadpaginas + "</a>";
    } else {
      salida += "<a href='javascript:incluirscript(1)'>1</a>";
      salida += "<a href='javascript:incluirscript(2)'>2</a>";
      salida += " ... ";
      for (contadorP=cantidadpaginas-(minpaginas+1); contadorP<=cantidadpaginas; contadorP++) {
        if (contadorP==paginaactual) {
          salida += "<span class='actual'>" + contadorP + "</span>";
        } else {
          salida += "<a href='javascript:incluirscript(" + contadorP + ")'>" + contadorP + "</a>";
        }
      }
    }
  }

  // dependiendo de donde estamos, ponemos un enlace para avanzar o no
  if (paginaactual<contadorP-1) {
    salida += "<a class='antesdespues' href='javascript:incluirscript(" + parseInt(paginaactual+1) + ")'>siguiente</a>";
  } else {
    salida += "<span class='deshabilitado'>siguiente</span>";
  }

  // mostramos el resultado
  document.getElementById("paginacion").innerHTML = salida;

  // y eventualmente, podemos mostrar la cantidad total
  var iniciopagina = (paginaactual * postporpagina) - (postporpagina - 1);
  var finalpagina = paginaactual * postporpagina;
  var totales = "Total de entradas publicadas: " + cantidadposts + " - Mostrando entradas " + iniciopagina + " a " + finalpagina;
  document.getElementById("totales").innerHTML = totales;
}

// esta es la función que escribe y ejecuta el script de manera dinámica
function incluirscript(pagina) {

  // salvo que sea la primera vez, antes, borramos el script
  if(firsttime==1) {removerscript();}

  // borramos todo y mostramos algún mensaje de carga
  document.getElementById("resultados").innerHTML = "<div id='loadingscript'>cargando ...</div>";
  document.getElementById("paginacion").innerHTML = "";
  document.getElementById("totales").innerHTML = "";

  // calculamos el valor a colocar en start-index
  var iniciopagina = (pagina * postporpagina) - (postporpagina - 1);

  // y armamos la url del feed
  var archivo = urlsitio + "/feeds/posts/default?start-index=" + iniciopagina;
  archivo += "&max-results=" + postporpagina;
  archivo += "&orderby=published&alt=json-in-script&callback=showpageposts";

  // cargamos y ejecutamos el script de manera dinámica
  var nuevo = document.createElement('script');
  nuevo.setAttribute('type', 'text/javascript');
  nuevo.setAttribute('src', archivo);
  nuevo.setAttribute('id', 'TEMPORAL');
  document.getElementsByTagName('head')[0].appendChild(nuevo);

  // establecemos los nuevos datos
  firsttime = 1;
  paginaactual = pagina;
}

// esta es la función que elimina un script previamente agregado utilizando su ID
function removerscript() {
  var el = document.getElementById("TEMPORAL");
  var padre = el.parentNode;
  padre.removeChild(el);
}

// ejecutamos la función por primera vez cuando se termina de cargar nuestro sitio
onload=function() { incluirscript(1); }

Como todo script, lo colocamos entre etiquetas <script type='text/javascript'> </script> aunque imagino que lo ideal sería usar una página estática y, en ese caso si colocamos el script en la plantilla deberíamos condicionarlo o bien alojarlo en algún servidor externo como DropBox o similar.

Faltaría darle alguna clase de estilo y allí, las posibildiades son muchas; en este ejemplo, usé algo así: Ver/Ocultar [+]
<style>
  #resultados { /* es el rectángulo del DIV donde se mostrarán */ }
  #loadingscript { /* es el texto de "cargando" */ }

  /* estas son las reglas de estilo para las entradas */
  .paginaposts { /* cada rectángulo */
    border: 1px solid #555;
    float: left;
    height: 35px;
    margin: 1px;
    padding: 5px;
    width: 197px;
  }
  .paginaposts a { /* los enlaces */
    color: #DDD;
    display: block;
    font-size: 11px;
    text-decoration: none;
  }
  .paginaposts img { /* la imagen miniatura */
    float: left;
    height: 36px;
    width: 36px;
  }
  .paginaposts h6 { /* el título de las entradas */
    float: right;
    height: 45px;
    margin: 0;
    width: 145px;
  }
  .paginaposts:hover { /* un efecto hover */
    background-image: -moz-linear-gradient(100% 100% 90deg, #338, #33F);
    background-image: -webkit-gradient(linear, left bottom, left top, from(#338), to(#33F));
    filter:progid: DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#FF3333FF', EndColorStr='#FF333388');
    border: 1px solid #33F;
  }

  /* estas son las reglas de estilo para la paginación inferior */
  #paginacion { /* el rectángulo contenedor */
    color: #BBB;
    font-family: Lucida Grande;
    font-size: 24px;
    font-weight: bold;
    height: 35px;
    line-height: 28px;
    padding: 20px 0;
    text-align: center;
  }
  #paginacion span, #paginacion a { /* cada número, texto o enlace */
    border: 1px solid #444;
    color: #BBB;
    display: inline-block;
    font-family: Lucida Grande;
    font-size: 24px;
    font-weight: bold;
    margin: 0 2px;
    padding: 0 5px;
    -moz-border-radius: 2px;
    -webkit-border-radius: 2px;
    border-radius: 2px;
  }
  #paginacion span.actual { /* resaltamos la página actual */
    color: #FFF;
    padding: 0 5px;
    -moz-box-shadow: 0 0 30px #DDD inset;
    -webkit-box-shadow: 0 0 30px #DDD inset;
    box-shadow: 0 0 30px #DDD inset;
  }
  #paginacion a:hover { /* efecto hover sobre los enlaces */
    color: #FFF;
    -moz-box-shadow: 0 0 20px #666 inset;
    -webkit-box-shadow: 0 0 20px #666 inset;
    box-shadow: 0 0 20px #666 inset;
  }
  #paginacion .antesdespues { border: none; }
  #paginacion .antesdespues:hover {
    -moz-box-shadow: none;
    -webkit-box-shadow: none;
    box-shadow: none;
  }
  #paginacion span.deshabilitado { /* los enlaces deshabilitados */
    border: none;
    color: #666;
  }

  /* la salida de la cantidad total */
  #totales {text-align:center;}
</style>

Entonces, ya tenemos todo así que en este demo online lo que he creado es una página estática y allí he puesto lo siguiente:
<style>
/* la reglas de estilo
</style>

<!-- cargo el script -->
<script src="URL_miscript.js"></script>

<!-- los divs contenedores -->

<!-- aquí se mostrarán los posts -->
<div id="resultados"> </div>

<!-- elimino flotaciones -->
<div style="clear:both;"> </div>

<!-- aquí se mostrará la paginación -->
<div id="paginacion"> </div>

<!-- aquí se mostrará el texto con los totales  -->
<div id="totales"> </div>

111 comentarios:

Felipe Calvo Cepeda  

¿Nota usted maestro que esto de JSON es muy enviciante? :)
Excelente JMiur.

Responder
NMitra  

muy bonito

Responder
Unknown  

Guau chuli! queda precioso :D

Responder
Gra  

Hola!!!!..Siempre lo sigo aun cuando no escriba!!!....una pregunta:

que iria debajo de:
-- los divs contenedores --

Y si se puede poner esto en un gadget sólo en la portada para no poner los ultimos posts al inicio...
Gracias!!!
Saludos!!!

Responder
Gem@  

Sin palabras, me quedé sin palabras.
¿Dije que no tengo palabras?
Voy a intentarlo :)

Responder
Bloguero  

Buuuuf, esto me viene demasiado grande. Ya lo he intentado según lo he entendido y nada. El efecto es increíble pero llevarlo a la práctica, para mi, es bastante complicado.

Tenemos que copiar el script en nuestro bloc de notas (poniendo nuestra url y los valores que se ajusten al número de entradas y páginas). Dicho script copiado lo colocamos entre etiquetas < script type='text/javascript'> Lo alojamos en un servidor.

Luego en una página estática copiamos tal cual lo pusiste tú, copiando las reglas de estilo.

Así lo he hecho yo y nada. Supongo que hubiera sido un milagro que me hubiera salido.

Saludos.

Responder
JMiur  

Felipe:
Lo noto pero para eso no hay cura.

Gra:
No iría nada, esos textos sólo comentan que es cada cosa; el HTML es simplemente esto:

<div id="resultados"></div>
<div style="clear:both;"></div>
<div id="paginacion"></div>
<div id="totales"></div>

que son los distintos DIVs donde el script mostrará los resultados.

Sí, puede usarse en un elemento HTML sin problemas; si te fijas en mi sidebar, en las entradas individuales uso algo similar a esto y que será tema de otra entrada.

Para verlo en el home simplemente deberás condicionar ese elemento.

Gem@
Eso dijo :D Pruebe y me cuenta.

Daniel Cana:
Sí, así es, exacto. Debería ver tu ejemplo para decirte donde está el error.

Responder
Karla Castañeda  

Luce genial JMiur!, lo probaré en cuanto pueda :P

Que tengas un estupendo día!

Responder
Gra  

Gracias!!!!!....Me tiro a la pileta y le cuento!!!! Para mí tambien es complicado!!!
Saludos!!!

Responder
JMiur  

Saludos, Karla :D

Gra: es ... engorroso más que complicado pero adelante; todo es cuestión de intentarlo :D

Responder
Beben Koben  

hmmmm...still confused with spanish language :-|
but this is look great :O
ugh ugh :(

Responder
Manuel Alberto  

Gracias JMiur, es un excelente post.
Saludos.

Responder
Uchiha Madara  

Hola Jmiur es la primera vez que comento en tu blog pero ya llevo tiempo siguiendo tu blog, para mi el mejor sobre trucos para blogger.

Ahora que he visto esta entrada me preguntaba si tu podrías, hacer un script que mostrara todas las entradas de una etiqueta como con el script "tableindex" pero mezclado con el script "sweet pages" que descubri hace tiempo y que sirve crear lista con paginación.
La idea es que quede una lista de entradas y que por cada 25 items cree una nueva página ,por ejemplo.
Saludos!

Posdata: Por alguna extraña razón mi blog no muestra el número de entradas que le solicito, actualmente lo tengo para que muestre 9 entradas pero hay veces que muestra 3 o 4 o 6, se descontrola cada vez que publico algo nuevo, he revisado la platilla pero no encuentro el error y no creo que sea por lo que publico ya que mis entradas son muy sencillas.Si puedes date una vuelta, tal vez sepas que es lo que le ocurre a mi blog :(

Responder
JMiur  

Uchiha Madara:
Tanto como hacerlo, n osé si podría ya que no conozco cuáles son esos scripts pero, la próxima semana habra algo respecto la paginación de entradas por categoría que es lo que utilzo en la sidebar de este blog que "pagina mostrando griupos de cinco.

Responder
Uchiha Madara  

Gracias JMiur estaré esperando esa entrada :D

Responder
Gem@  

Lo añadí en mi blog sin problemas en la pestaña del menú "Contenido" pero noto algo extraño y es que la imagen por defecto para las entradas sin imagen se muestra aún teniendo imagen la entrada ¿alguna sugerencia?

Responder
Beben Koben  

I tried to use the script provided in the post, do not good well...
Then I tried to see the script from the demo, all went is good well.
All my scripts and CSS input via the Add a Gadget HTML/Javascript and well all went is good well.
Is there something wrong with the script on your post?
Love this hack, this is really great... :)
Thanks, maybe i'll repost after practice² ;) :D

Responder
ritmosymelodiasecuador.blogspot.com  

Jorge, esto es facinante¡ trate de armar un índice como el que tenías hecho manualmente pero no pude :$ resultó muy dificil y despues de molestarte tanto para que explicaras como hacerlo :0, ahora nos traes este que está muy bueno.

Gracias una vez más aunque solo pueda copiar y pegar ya que cuando de asimilar se trata allí si que me pongo como burro en aguacero :X

Responder
JMiur  

Gem@:
Eso es algo que no podemos controlar ya que ese dato (la imagen por defecto) es agregada por Blogegr mismo según su capricho. Si miras el código fuente de las entradas donde se ve esa miniatura, verás que en alguna parte dice:
<link rel="image_src" ..................
que es justamente esa miniatura. Cuando via JSon no se muestra es justamente porque Blogger no ha agregado esa etiqueta y por lo tanto, no aparece en el feed.

Recuerdo que en algún script de Ariane hay algo que permite detectar las etiquetas IMG de una entrada y sería cosa de adaptar eso a estos gadgets para no depender de Blogger. Voy a pensarlo y lo agregaré :D

Beben Koben:
I have checked both codes and I see no difference between them except for the URLs. So it's a mystery

Responder
JMiur  

CUENTAGOTAS:
Paciencia, paciencia y más paciencia :D

Responder
VacilandoUnRap  

Excelente me funciona muy bien, pero solo algo, que pasa cuando los titulos de las entradas son muy largos? hay alguna manera de que se muetren mas cortos en estos cuadritos pequeños... algouna manera de que se 'resuman' estos titulos de las entradas que son muy extensos?

http://www.vacilandounrap.com/p/resultados-es-el-rectangulo-del-div.html


saludos espero tu respuesta.

Responder
JMiur  

Si, no hay problema; si te fijas, en una línea, el script dice esto:

posttitle = entry.title.$t;

ese es el ítulo del post así que debajo de esa línea, pones esto:

posttitle = posttitle.substring(0,20);

donde, ese número 20 es la longitud máxima de caraceteres, usa el valor que quieras; si eltítulo tiene menos caracteres que ese valor, no pasará nada y se mostrará completo.

Responder
EpideMia  

Jmiur, no entiendo. me siento tonto.
no entiendo como hay que hacer y molesta mucho porque es muy bueno el truco.
lo que hice fue pegar todo en una pagina estatica, luego de subir el script a dropbox y pegarlo como vos decis.
pero lo unico que aparece es la palabra "cargando..."


qué estoy haciendo mal???

Responder
JMiur  

No sé dónde está tu ejemplo para mirarlo.

Responder
EpideMia  

te dejo la pagina donde lo puse.
espero que me puedas ayudar.

http://epidemia-mella.blogspot.com/p/resultados-es-el-rectangulo-del-div.html

Responder
JMiur  

No tienes definida la URL de tu sitio en el script:

// estos son los datos que debemos establecer
var postporpagina = 60; // la cantidad de entradas a mostrar por página
var urlsitio = "http://miblog.blogspot.com"; // la url de nuestro blog
var minpaginas = 5; // la cantidad mínima de páginas a mostrar
var maxpaginas = 10; // la cantidad máxima de páginas a mostrar
var imgxdefecto = "http://xxxxxxxxxxx"; // la dirección de la imagen por defecto a ser utilizada

Responder
EpideMia  

wow!!!

era tan simple!!

muy bueno, te felicito, me quedó genial!!

Muchas gracias!!

Responder
JMiur  

Perfecto :D

Responder
Lisandro  

Hola...
Utilizé este script y siguiendo tus tutoriales le agregué un resumen del contenido y la fecha más el título completo en el atributo"title"...
mi pregunta es.. ¿cómo debo hacer para que el resumen del contenido no me corte la última palabra?

He aprendido mucho en tu blog... gracias.

Responder
JMiur  

EnerDelSur:
Mo sé cuál de todas las funciones para resumir estás utilizando porque, para conseguir eso, justamente, hay que modificar esa parte.

Escribo acá una función a ver si se puede ver correctamente:

function eliminartags(cual,longitud){
var r = cual.split("<");
for(var i=0;i<r.length;i++){
if(r[i].indexOf(">")!=-1){
r[i] = r[i].substring(r[i].indexOf(">")+1,r[i].length);
}
}
r = r.join("");
var sss = "", p;
var r2 = r.split(" ");
for(var i=0;i<r2.length;i++){
p = sss + r2[i] + " "
if(p.length>=longitud) {break;}
sss = p;
}
sss += "…"
return sss
}

No se si posee el mismo nombre

postcontent = eliminartags(entry,40);

Lo que hace eso es, en lugar de contar 40 caracteres, cuenta 40 caracteres espacio y de ese modo, las palabras no se cortan.

Responder
JMiur  

Perfecto, Meme007 :D

Responder
Lisandro  

JMiur
¡¡¡¡gracias!!!
Me salió... aunque cambié una línea, se me cortaba el texto a pocos caracteres así que cambié esto:
if(p.length>=longitud) {break;}
por esto:
if(i==longitud) {sss = p+"..."; break;}
también evité que me agregara los puntos suspensivos aunque el título no llegara a la longitud determinada.
Así va...
http://energiadelsur.blogspot.com/p/mural-de-entradas.html

¡¡muchas gracias!!

Responder
JMiur  

¿Y qué quieres que te conteste?

Responder
María Pilar  

Ya está en mi blog, funciona sin problemas; el proceso para instalarlo me ha dado algunos problemas que gracias a su ayuda he ido solventando.

Responder
JMiur  

Me alegro que se resolviera :D

Responder
Luis Reyes  

hola JMiur donde que cambiar el valor para que cambiar el color que tiene al pasar el mouse,
gracias saludos lerh!!

Responder
JMiur  

¿El color de cada rectangulito? El color de fondo lo colocas en:

.paginaposts { ....... }

y el efecto hover sería:

.paginaposts:hover { ....... }

Responder
Luis Reyes  

muchas gracias JMiur era en este:
. pagina posts { ....... }

Responder
nakahito  

Hola Jmuir cuanto tiempo que no te visito, me pase a wordpress después de meses de usar blogger :).. me gusta este script se podrá usar en wordpress? se que tus tutos son para blogger pero cualquier consejo vale.. saludos!

Responder
nakahito  

bueno estuve intentando pero creo que el problema esta en la url del feed :S

Responder
JMiur  

Supongo que podría usarse pero n otiene mucho sentido ya que en WP puedes acceder a la base de datos y por lo tanto, paginar es mucho más simple.

También puedes usar algún plugin; hay cientos de ellos.

Responder
Carlos Martinez  

no entiendo nada este post :s y me gusta como resumista las entradas :s

Responder
TriunfoMania  

Hola! no se si seguiras por aqui... pero tengo una pregunta como puedo añadir la fecha y un resumen del contenido en cada entrada? gracias!

Responder
JMiur  

Cambiando el script, leyendo esos datos y agregando la salida. Fíjate en esta entrada para entender cómo funciona json y que datos puedes leer.

Responder
Blog La Pequeña Grecia  

Hola, Jmiur! Muy bueno, el truco lo hemos implementado en nuestro blog www.lapequenagrecia.com. Muchas gracias!! Saludos!!!

Eres un verdadero Ingeniero de los Códigos!!!

Sócrates Tsokonas

Feliz 2012 para ti y para los tuyos! El truco lo conseguí a través del blog de Gem@.

Responder
JMiur  

Gracias, Sócrates. fel año :D

Responder
Miguel Angel Herrán  

Fantástico blog, y fantástico post, que he utilizado en mi blog.
Dado que aún no tengo muchas entradas en el mismo, me he percatado de un pequeño detalle: en la última página no corresponde bien el texto salvo que el total de post sea múltiplo del número de posts que se muestra en cada página del resumen.
Ello se resuelve muy fácilmente añadiendo una línea de código justo antes de var totales = "Total de entradas publicadas..., que sería la siguiente:
if (finalpagina > cantidadposts) {finalpagina = cantidadposts};
Un pequeño detalle.

Responder
JMiur  

Nunca he notado ese detalle así que será cosa de probarlo, Miguel :-D

Responder
Miguel Angel Herrán  

El resultado se puede ver aquí.

Responder
el Zambullista  

Hola, JMiur. Muchas gracias por la explicación. Agregué todo en una página estática, lo personalicé y quedé muy satisfecho con el resultado (botón "Mosaico" del menú superior). Pero (dicen que siempre hay uno) me gustaría mostrar un resumen o sumario de cada entrada en un tooltip, como se ve en esta otra tabla de contenido:
http://vagabundia.blogspot.com/2007/11/blogger-tabla-de-contenidos.html
Intenté hacerlo solo, comparando los dos códigos, pero no pude. ¿Qué debería agregar en este código de "Resumen de entradas con paginación" para lograr que al pasar el puntero sobre el título y/o la imagen se viera un sumario de, por ejemplo, 250 caracteres?
Gracias de nuevo, y saludos.

Responder
JMiur  

Para empezar, deberías leer ese texto en al función showpageposts(json):

if ("content" in entry) {
var texto = entry.content.$t;
} else if ("summary" in entry) {
var texto = entry.summary.$t;
}

y usar alguna función para eliminar las etiquetas y cortar ese texto, busca alguna en las otras entradas que hablan de json:
texto = eliminartags(var texto,250);

por último, debería crear el HTML del tooltip que no se cuál es, modificando la variable salida

Todo esto, dicho muy en el aire, claro.

Responder
el Zambullista  

Tema resuelto, JMiur.
Ya había intentado por el camino que me indicaste y lo volví a hacer, pero sin éxito. Entonces, con las pistas "muy en el aire" (pero no tan alto como para no servirle a mi vuelo rasante), retomé la comparación con el código del Blog Toc que te mencioné en el comentario anterior y pude resolverlo.

Gracias otra vez por la respuesta rápida y tu tiempo.

Responder
el Zambullista  

La solución que te mencioné en el comentario anterior funcionó... para la primera página solamente. En las siguientes se repetían los tooltips de la primera (¿hablabas de magia negra?). En lugar de averiguar por qué, retomé las indicaciones de tu respuesta #55 y ahora sí lo solucioné. Por si le puede servir a alguien, lo comparto acá.

Primero, al comienzo del script, puse la función de eliminar etiquetas que das en esta entrada, combinada con la que das en el comentario #31 (para que no se corte la palabra de un tooltip si su caracter número 250 --en mi caso-- no es un espacio en blanco). Este es el código resultante:

function eliminattags(cual,longitud){
var resumen = cual.split("<");
for(var i=0;i")!=-1){
resumen[i] = resumen[i].substring(resumen[i].indexOf(">")+1,resumen[i].length);
}
}
resumen = resumen.join("");
var sss = "", p;
var resumen2 = resumen.split(" ");
for(var i=0;i=longitud) {break;}
sss = p;
}
sss += "..."
return sss
}

Segundo, en los datos a establecer (o sea, cantidad de caracteres del sumario) agregué esta línea debajo de "var imgxdefecto" (que define la imagen a usar en caso de que la entrada no tenga una):

var lenresumen = 250;

Tercero, ya dentro de la función "showpageposts(json)", debajo del código que lee la URL de la entrada agregué el que lee su contenido extractado (mismo código de tu otra entrada mencionada):

postcontent = "";
if ("content" in entry) {
postcontent = entry.content.$t;
} else if ("summary" in entry) {
postcontent = entry.summary.$t;
}
postcontent = eliminattags(postcontent,lenresumen);

Cuarto y último paso, modifiqué la salida del título (etiqueta h6; no lo hice con la de la imagen, que está arriba, pero el agregado sería el mismo) para que ese extracto de 250 caracteres se muestre en un tooltip. Para que el editor de comentarios no me siga rechazando el html, lo describo: dentro del link ("a href=") de la etiqueta h6, hay que agregar después de '" + posturl + "' esto:

title='" + postcontent + "'

Ojalá le sea útil a alguien más, y gracias de nuevo por tu laburo. Lo mío sólo fue maña bruta :D

Responder
TriunfoMania  

Hola! instale este código modificandolo un poco, el resultado fantástico, lo único que me gustaría quitar es el espacio en blanco que queda encima ¿Se puede hacer? aquí un ejemplo http://elsecretodeltriunfo.blogspot.com/p/ninal.html

Responder
JMiur  

El espacio en blanco es porque hay dos saltos de línea <br/> creados por el mismo editor de entradas. Somplemente, no dejes líneas en blanco en las etiquetas script y style o agregalas todas en una sola línea.

Responder
Unknown  

Interesante JMiur. Lo encontre gracias al blog de Gem@ y voy a probarlo a ver quetal

Responder
Unknown  

Hecho! Este script no se lleva muy bien con el menu tipo doc que tengo en el footer, pero me ha venido muy bien.

una pregunta, que veo que tenga dificil respuesta. Estoy creando una agenda de conciertos, que dentro de una pagina estatica ocupa mucho espacio, es posible crear una pagincaion sin tener que crear varias paginas diferentes????

Responder
JMiur  

No sé cuál es exactamente tu idea pero puedes usar algún tipo de script que mantenga oculto cierto contenido y se despliegue o algún tipo de acordeón. Sea como sea, el contenido estará todo en la misma página por lo que el tiempo de carga será el mismo y sólo será afectado el aspecto visual.

Responder
Unknown  

Gracias por la respuesta Jmiiur, pero no son validos... La idea que quiero es algo tipo esto:
http://www.musikazuzenean.com/agenda

Responder
JMiur  

En ese sitio, lo que ocurre es que el calendario var cargando distintas páginas web ya definidas, usando un plugin de jQuery llamado datepicker o algo similar:
http://jqueryui.com/demos/datepicker/

Fíjate que la URL cambia en función de la fecha:
http://www.musikazuzenean.com/agenda/eguna/data/2012-02-07
http://www.musikazuzenean.com/agenda/eguna/data/2012-02-12

No hay una paginación sino enlaces a páginas varias cuyas URL, seguramente se arman de modo sistemático: AÑO-MES-DIA.

Responder
Unknown  

Entonces, la unica manera de realizarlo, o me creo una paginacion casera o me creoo un blog aparte pare la agenda?

Supongo que este lugar llevara el mismo sistema no?
http://www.laganzua.net/conciertos/agendaconciertos.php?pagina=2&comunidad=Euskadi

gracias por tu ayuda

Responder
JMiur  

Parecido. Fíjate en la URL. Cambia con las distintas opciones:

http://www.laganzua.net/conciertos/agendaconciertos.php
http://www.laganzua.net/conciertos/agendaconciertos.php?orden=grupos
http://www.laganzua.net/conciertos/agendaconciertos.php?pagina=21

Responder
christian neyra  

Hola JMiur necesito algunos trucos para mi blog.

quiero saber si hay algun código que muestre las entradas de los post como en el siguiente enlace. http://www.laps3.com/ sólo quiero el titulo, la imágen y un pequeño resumen, he visto entradas estilo magazine pero no se como puedo hacer para conseguir lo que busco, me puedes ayudar y también entradas relacionadas, las que se ponen al final de cada post, pero que sólo muestre enlace nada de imágenes. gracias espero respuesta.

Responder
JMiur  

Es exactamente lo que dices, un resumen de las entradas como cualuqiera que hays visto en los estilos magazine al que luego, deberías personalizar si es que quieres que la forma de mostrarse sea de un tip odeterminado.
Lo básico es esto

Responder
JMiur  

No sé. No tengo idea.

Responder
Gem@  

Recién me han avisado que no funcionaba este sistema en mi blog, lo que hice fue verificar si la url del script seguía funcionando como así era y a partir de ahí empezó a funcionar de nuevo pero ahora vuelve a fallar el invento y veo que aquí también ocurre.
Me da que todo esto está relacionado con los últimos cambios ¿no crees?

JMiur  

No veo problemas con mi ejemplo pero, efectivamente, no veo el tuyo.

El navegador me dice que hay un error en el script. Puede ser un problema en Google Sites porque tampoco veo que funcione iBox en tu blog y ambos scripts están en el mismo servidor ¿Será un problema de permisos?

Gem@  

No, no es problema de estar accesible el archivo y encima ahora funciona es para volverse locos, gracias por mirarlo :)

JMiur  

Tal vez. sólo se tomó vacaciones de fin de semana :-)

Responder
Obed  

Se puede aplicar esto para mostrar todas las entradas de una etiqueta? y como lo hago?

JMiur  

Fíjate en esta entrada.

Responder
Otto la piloto  

Hola Jmiur,
genial entrada. La estoy intentando adaptar a mi blog.
Me gustaría que no hubiera texto, sólo las imágenes grandes. Se podría hacer?? También me aparecen en el slide las entradas de 'índice' y 'resumen del blog', cómo puedo quitarlas??
http://operaporelchocolate.blogspot.com.es/2012/04/de-que-color-quieres-comer.html
Muchas gracias!

JMiur  

La forma de leer los datos es siempre igual; la forma de mostrar esos datos es variable y depende de lo que cada uno quiera. Es lo que puedes modificar o adaptar en eso que en el script se llama salida que no es otra cosa que el HTML que se mostrará.

Si no quieres ver el título por ejemplo, elimina esta línea:

salida += "<h6><a href='" + posturl + "' target='_blank'>" + posttitle + "</a></h6>";

Si, además, quieres filtrar algún tipo de entrada, las cosas se complican y ahí habría que pensar métodos alternativos y verificarlos uno por uno

Responder
Otto la piloto  

Gracias por la respuesta! En cuanto a lo de seleccionar qué entradas no quiero que salgan, se te ocurre algún método que pueda investigar para ir probando??

JMiur  

Las etiquetas pueden leerse ya que es un dato del feed; por ejemplo, si sólo tienen una, el nombre de la etiqueta es esta:

var etiqueta =entry.category[0] .term;

si tienen varias, debe leerse el array entry.category[0] entry.category[1] entry.category[2] etc
ese sería el método mas simple de filtrar la salida para que no se muestren ciertas entradas.

Si son entradas surtidas hay que leer las urls y compararlas una por una.

Ambas cosas harán que el esquema gráfico de salida sea variable, es decir, no habrá una cantidad igual de entradas en cada página sino que será cambiante.

Responder
Otto la piloto  

Ok, intento pillarlo, jeje. Creo que casi estoy: dónde debería copiar esta línea?

JMiur  

¿Esa linea? En ningún lado. No puedo darte un un código exacto porque eso que quieres hacer es muy personal y por lo tanto, no hay forma generar un código genérico.

Responder
Dahe Ugi  

you are really smart, very nice blog

Responder
admin  

Hola!!
por que no lo puedo poner 2 veces en una sola pagina??
quisiera usar este metodo pero para una misma pagina!!
utilizando etiquetas diferentes
saludos!!

JMiur  

Si puedes hacerlo, debes duplicar las cosas y establecer IDs diferentes para cada uno.

Responder
♥ Ana  

Hola JMiur
Hace tiempo que vi ésta entrada tuya y la tengo guardada, yo quería poner un índice con miniaturas de imagen en el blog pero, por lo que he visto hay que hacerlo manualmente e ir poniendo las miniaturas de una en una en tablas, pero, cada vez que veo ésta entrada me pregunto si éste tipo de resumen de entradas no se podría poner de manera que se colocara alfabéticamente a modo de índice
Me parece que pido mucho, jejeje, muchas gracias de antemano
Saludos

JMiur  

No, no es necesario hacerlo manualmente si lees y muestras los feeds. Ordenarlos alfabéticamente es más complejo pero hay varias opciones para mostrar cosas similares: 1 | 2 | 3

♥ Ana  

JMiur,ahora tengo que ver si soy capaz de hacerlo y puedo poner miniaturas de imagenes, buffff, lo veo un poco complicado pero ¡¡hay que intentarlo!!
De todas maneras no entiendo muy bien como hacerlo mediante los feeds de mi blog, yo tengo puesta una pestaña en mi blog que pone RSS , pero, ahí se ven solo algunas entradas (25) y las imágenes y el contenido de cada entrada está en su formato original, sin miniaturas y, por supuesto, sin orden alfabético, están por orden de publicación
Muchas gracias por tu respuesta, a ver que consigo hacer, jejeje

Responder
Edgar  

Hola que tal.. me ha funcionado a la perfeccion... el unico detalle es que le he cambiado el estilo y la imagen debe ser mas grande... por lo tanto aparece distorcionada... como puedo hacer para que la imagen sea presentada con mayor resolucion??... aqui el ejemplo... http://imaginacine.blogspot.mx/

JMiur  

Si, eso es posible. En el feed, Blogger utiliza una imagen de 72x72 pero genera todo tipo de miniaturas de modo automático así que podrías agregar una línea extra al script y donde dice:

// buscamos la imagen de las entradas o usamos la que establecimos por defecto
if ("media$thumbnail" in entry) {
postimg = entry.media$thumbnail.url;
} else {
postimg = imgxdefecto;
}

debajo, poner esto:

postimg = postimg.replace('s72-c','s180-c');

si es que vas a usar imágenes de 180x180 tal como se ve en tu blog; si es otro tamaño, cambia el número:
s200-c si es de 200x200
s250-c si es de 250x250
etc

Edgar  

Ha funcionado a la perfección :D... muchas gracias por la ayuda.. excelente blog (Y)...

JMiur  

Perfecto, Edgar.

Responder
Unknown  

Hola JMiur, disculpa la molestia pero eh intentado hacer lo que dices y la verdad no consigo que ande, si bien esta claro lo que debo hacer. Parece ser el problema dropbox (aquí en teoría copio la URL que me da el mismo dropbox) y la pego en donde dice, pero esta tiene "https://" y veo en tu explicación "htpp://" osea sin la "s" se la quito a la dirección que me da dropbox y nada.

Entonces, estos son los pasos que seguí y no obtuve resultados...
1 descargue el archivo y modifique lo que dices imagen y url del script
2 pegue en una página estática lo que mencionas
3 reemplace donde dice "/* la reglas de estilo" por la que muestras tu y nada de nada...
Pense que al txt tenia que ponerlo entre "< script type='text/javascript' > < /script >" y nada...

La verdad no se que estoy haciendo mal, disculpa la molestia...
Aquí intente implementarlo, por si puedes darte una vuelta, aunque no se como le vas hacer para chequearlo porque esto es todo nuevo para mi este es el blog en el que estoy probando y no anda http://mismodvisdin.blogspot.com.ar/p/indice.html

Responder
Unknown  

Yo otra vez, jejeje ya logre hacerlo andar, efectivamente el problema era
el alojamiento del archivo, por lo cual probé site y no lo conseguí así que lo puse directo en la plantilla y ahora si quedo!!!

JMiur  

Lo que debió ser erróneo es la url que usabas. Da lo mismo que sea http o https siempre que sea la dirección pública al archivo y no la dirección a la página.

Unknown  

Hola de vuelta!!! Gracias por tu respuesta, logre que ande... "http://mitrabajon-line.blogspot.com.ar/p/indice.html" como no tengo entradas aún lo estoy probando con tus entradas, ahora el problema es que no puedo mover las imágenes para que queden alineadas con el contenedor, me podrías decir como se hace???? Y además me gustaria poner un cargando mas grande como se ve en el tuyo como le hago???? Desde ya muchas gracias

JMiur  

No sé a qué te refieres con alinearlos. Deberías quitarle la altura a .paginaposts {} ya que height: 35px; es un valor escaso para contener la imagen y su borde con lo cual, la parte inferior de ese rectángulo parece tener un margen menor que la parte superior.

Tal como está ahora, la altura debería ser 45 pixeles.

En .paginaposts img {} usas left y top ero eso no tiene efecto alguno al menos que esa etiqueta tenga una propiedad position relative o absolute.

Puedes usar cualquier imagen de carga; debes definirla en la regla #loadingscript {}

Unknown  

Muchas gracias!!! Un saludo, seguro seguiré dando vuelta por tu post!!!!

Responder
Diana T  

Hello! Thank you for the script! Very usefull. There is a small question to it: is it possible to add to the "Title"-information also a "meta-description" of the posts? Thank you!

JMiur  

Yes. You have to modify the script, read the json feed:

entry = json.feed.entry[i];
if ("content" in entry) {
postcontent = entry.content.$t;
} else if ("summary" in entry) {
postcontent = entry.summary.$t;
}

postcontent is the html of the entry but you have to eliminate the tags


Diana T  

Thank you very much for you so quick answer!! Unfortunately it ist not exactly that, what I mean. (Sorry, I'm not so good in all these technical stuff). I meant this parameter "meta expr:content='data:blog.metaDescription' name='description'/".
For example, the page shoud be seen like these (by the user, who will read the Blog):
"Picture 1"-"Name of the post 1"-"What is the post 1 about"
"Picture 2"-"Name of the post 2"-"What is the post 2 about"
etc.
Thank you for your help! :))

JMiur  

The meta description tag must be defined in the head and the summary can only be read it in the body inside the includable post; so, you can add a meta tag inside that includable but will not have any effect. The boots, who read the page looking for that information, only looks the head part of the code and ignores the rest:

http://vagabundia.blogspot.com/2011/08/meta-description-en-blogger-si-o-no.html
http://vagabundia.blogspot.com/2012/03/las-opciones-de-las-etiquetas-meta.html
http://vagabundia.blogspot.com/2011/07/optimizar-las-etiquetas-meta-para.html

You have to add that description in every post; the option is in the right side.

Responder
Cmsplit  

Hola JMiur
desde donde puedo centrar todo el bloque,ya que me queda muy a la izquierda.
aca puedes verlo:
http://pruebaelegante.blogspot.com.ar/p/blog-page_10.html
Saludos! :)Y gracias.

JMiur  

Hay muchas formas. Por ejemplo:

#resultados {margin: 0 auto; width: 805px;}

o bien:

#resultados {margin-left: 43px;}

o si lo quieres más genérico, cambia el float:left de .paginaposts{} por display: inline-block; y luego:

#resultados {text-align: center;}

Cmsplit  

Muchas gracias!
tema resuelto con la segunda opción que me das quedó perfecto.
Saludos! :D

Responder
Unknown  

Hello Dear,
Here is a Problem with me in script that is about Thumbnail.
this script change thumbnail url and display lower quality thumb.
Example: Like on your demo page this post:

http://vagabundia.blogspot.com/2013/04/comentarios-google-blogs-y-el-final-de.html

In this post Image url is:

http://4.bp.blogspot.com/-N98uMuIiD8s/UXBLfu3lacI/AAAAAAAAWOQ/RD0E5wm5Mn4/s00/comentariosmas1.png


But in this script Image Url is:

http://4.bp.blogspot.com/-N98uMuIiD8s/UXBLfu3lacI/AAAAAAAAWOQ/RD0E5wm5Mn4/s72-c/comentariosmas1.png

You See its change "/s00/" in Original Image to "/s72-c/"

Kindly Help me to Solve this Problem

JMiur  

The feed only contains the image thumbnail (72x72). You can change it in this way:

if ("media$thumbnail" in entry) {
postimg = entry.media$thumbnail.url;
} else {
postimg = imgxdefecto;
}

postimg = postimg .replace('s72-c','s000');

Responder
Unknown  

Thanks For Fast Reply...

But One more Problem is There. I want to Show Thumbnails from Youtube Server Like This:

< img border="0" height="0" src="http://i2.ytimg.com/vi/8CDfELtGCMo/mqdefault.jpg" width="0" / >

But this Script Doesn't showing Thumbnail when i add Image Link in Post.

Kindly Guide me How to Solve This?

JMiur  

The script looks for this entry:
entry.media$thumbnail.url;
the image thats Blogger sets as the thumbnail and, it's usually the first one but not always.

If you need complete control, change the script and use this part:
http://vagabundia.blogspot.com/2011/05/json-detectar-la-primera-imagen-de-cada.html

if ("media$thumbnail" in entry) {
postimg = entry.media$thumbnail.url;
} else {
var s, a, b, c, d;
postimg = imgxdefecto;
s = entry.content.$t;
a = s.indexOf("<img");
b = s.indexOf("src=\"",a);
c = s.indexOf("\"",b+5);
d = s.substr(b+5,c-b-5);
if((a!=-1)&&(b!=-1)&&(c!=-1)&&(d!="")) {
postimg = d;
}
}

Responder
José L. Bravo  

Hola.

¿Esto funcionaría con las páginas de archivos por mes?:

http://miblog.blogspot.com/2013_01_01_archive.html


Saludos.

JMiur  

No hay un feed para eso así que no; debería usarse alguna otra cosa.

José L. Bravo  

Me refería a que si se podía condicionar para que solo apareciera en él, pero veo que tampoco se puede.

Responder
Anónimo  

Hola soy yo de nuevo quiero hacer una pregunta como puedo poner este truco en un dadget o ponerlo en la pagina principal que se vea junto a las otras entradas noce si sera posible convertirlo para un dadget ya lo probe asi pero no funciona pero si no se puede realizar ese metodo me preguntaba si tienes alguna entrada con un dadget que muestre las ultimas entradas que sea similar a este sera que me puedes ayudar? gracias de ante mano...

JMiur  

Es un script que usa json por lo tanto, puede ser colocado en cualquier parte, ya sea un post, una página estática (tal como muestra el ejemplo) o en un elemento HTML independiente.

Responder
Unknown  

como se podria hacer este codigo pero para una pagina web en html utilizando casi la misama logica en vez de dar una url configurar la conexion ala base de dato,

JMiur  

Eso sería imposible de responder en un comentario. Busca en la web ya que hay decenas de ejemplos para distintos lenguajes.

Responder

¿Quiere dejar un comentario?

recuerde que los comentarios están siendo moderados y serán publicados a la brevedad ...

Nota: sólo los miembros de este blog pueden publicar comentarios.

Si le gusta ir a lo seguro utilice este botón para abrir los comentarios en una ventana modal en esta misma pagina.

Si añora tiempos idos, use este enlace para agregar un comentario al viejo estilo ...

 
CERRAR