Hace mucho tiempo había puesto algo parecido que requería de la librería Prototype y que terminé quitando porque ... no me acuerdo por qué pero seguro que era una buena razón o no.
Ahora repito la experiencia y veremos qué pasa pero, sin librerías extras ya que luego de un par de años y doscientos mil quinientos treinta y dos errores, más o menos he logrado comprender como funciona esto de Json que es, claro, lo que debe usarse en cualquiera de estos casos porque no hay otra manera de filtrar y acceder a los datos de Blogger que no sea leyendo los feeds.
http://miblog.blogspot.com/search/label/NOMBRE_etiqueta
La idea es reemplazar esos enlaces para que, en lugar de abrir una página, se puedan ver sin salirse de la página y navegar por ellas, avanzando o retrocediendo por todas las entradas que existan con esa etiqueta, sin importar si son veinte o cientos ya que intentaremos no colapsar el sitio, cargando los scripts uno por uno y borrándolos de la memoria una vez que ya no se usan.
El criterio básico es utilizar el mismo esquema que en esta otra entrada y como no puedo pensar en abstracto y no existe un esquema idéntico en todas las plantillas, me limito a mostrar qué hice y las variaciones deberán ser investigadas ya que son casi infinitas.
Primero, expando la plantilla y busco el lugar donde tengo agregados los posts relacionados y allí, haré dos cosas, indicaré la altura del DIV que los contiene y debajo, agregaré una serie de etiquetas con IDs específicos que son en aquellas donde el script escribirá los datos:
<div class='post-footer-line post-footer-line-4'>
<div id='postsrelacionados' style='height:190px;'>
<script type='text/javascript'>mostrarrelacionados();</script>
</div>
<div style='clear:both;'/>
</div>
<div class='post-footer-line post-footer-line-5'>
<div id='etiquetasbajopost' style='height:0px;'>
<div id='navetiquetas'/>
<div id='navetiquetassel'/>
<div id='navetiquetasfooter'/>
</div>
</div>
Busco ahora el LOOP donde Blogger escribe las etiquetas y por las dudas, condiciono los enlaces porque sólo quiero que esto funcione en las páginas individuales:
<b:loop values='data:post.labels' var='label'> ....... <b:if cond='data:blog.pageType == "item"'> <a expr:onclick='"setnavetiquetas(\"" + data:label.name + "\");return false;"' href='javascript:void(0);' rel='tag'><data:label.name/></a> <b:else/> <a expr:href='data:label.url' rel='tag'><data:label.name/></a> </b:if> ....... </b:loop>
<b:if cond='data:blog.pageType == "item"'>
<script type='text/javascript'>
//<![CDATA[
var laetiqueta; // es la etiqueta que se mostrará
var navetiquetasflagfirst = 0; // al inicio es cero
var labelsporpagina = 4; // definir cuántas entradas queremos ver
var labelanterior, labelsiguiente;
// esta es la función genérica que elimina las etiquetas y crea el resumen
// si ya la o usamos alguna similar no hace falta repetirla
function eliminartags(cual,longitud){
var resumen = cual.split("<");
for(var i=0;i<resumen.length;i++){
if(resumen[i].indexOf(">")!=-1){
resumen[i] = resumen[i].substring(resumen[i].indexOf(">")+1,resumen[i].length);
}
}
resumen = resumen.join("");
resumen = resumen.substring(0,longitud-1);
return resumen;
}
// inicializamos la etiqueta a mostrar porque un post puede tener varias
function setnavetiquetas(cual) {
navetiquetasflagfirst = 0;
laetiqueta = cual;
navetiquetas(0);
return false;
}
// es la función muestra las etiquetas y nos permite navegar por ellas
function navetiquetas(direccion){
var p, parametros;
if(direccion==-1) {
// si navegamos hacia atrás
p = labelanterior.indexOf("?");
parametros = labelanterior.substring(p);
} else if (direccion==1) {
// si navegamos hacia adelante
p = labelsiguiente.indexOf("?");
parametros = labelsiguiente.substring(p);
} else {
// si es la primera vez que se ejecuta ocultamos los posts relacionados
document.getElementById("postsrelacionados").style.height = "0px"; // ocultar
// y mostramos este sistema
document.getElementById("etiquetasbajopost").style.height = "270px"; // la altura
// los parámetros para leer Json
parametros = "?start-index=1&max-results=" + labelsporpagina + "&orderby=published&alt=json-in-script"
}
parametros += "&callback=shownavetiquetas";
incluirscriptlabels(parametros);
}
// esta es la funcion que carga el script de manera dinámica
function incluirscriptlabels(parametros) {
// si no es la primera vez, borramos el script anterior
if(navetiquetasflagfirst==1) {removerscriptlabels();}
// borramos todo y ponemos un texto o una imagen de carga
document.getElementById("navetiquetas").innerHTML = "<div id='navetiquetasloading'></div>";
document.getElementById("navetiquetassel").innerHTML = "";
// este es el archivo con los feeds
var archivofeeds = "/feeds/posts/default/-/" + laetiqueta + parametros;
// lo cargamos y ejecutamos
var nuevo = document.createElement('script');
nuevo.setAttribute('type', 'text/javascript');
nuevo.setAttribute('src', archivofeeds);
nuevo.setAttribute('id', 'NAVLABELTEMPORAL');
document.getElementsByTagName('head')[0].appendChild(nuevo);
navetiquetasflagfirst = 1;
}
// esta es la función que remueve el script cargado previamente
function removerscriptlabels() {
var el = document.getElementById("NAVLABELTEMPORAL");
var padre = el.parentNode;
padre.removeChild(el);
}
// esta es la función que cierra este sector y restaura los posts relacionados
function cerrarnavetiquetas() {
document.getElementById("etiquetasbajopost").style.height = "0px"; // ocultar
document.getElementById("postsrelacionados").style.height = "190px"; // la altura deende del diseño
}
// esta es la misma función de siempre que nos permite leer el feed
function shownavetiquetas(json) {
var entry, posttitle, posturl, postimg, postcontent;
var salida = "";
labelanterior = "";
labelsiguiente = "";
// vamos a buscar las direcciones para navegar la lista
for (var k = 0; k < json.feed.link.length; k++) {
if (json.feed.link[k].rel == 'previous') {
// esta es la página anterior
labelanterior = json.feed.link[k].href;
}
if (json.feed.link[k].rel == 'next') {
// esta es la página siguinte
labelsiguiente = json.feed.link[k].href;
}
}
// leemos tantas entradas como definimos
for (var i = 0; i < labelsporpagina; i++) {
// si no hay más, terminamos el bucle
if (i == json.feed.entry.length) { break; }
entry = json.feed.entry[i];
// este es título de cada entrada
posttitle = entry.title.$t;
// buscamos la URL de la entrada
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
posturl = entry.link[k].href;
break;
}
}
// buscamos el contendio de la entrada y lo guardamos
if ("content" in entry) {
postcontent = entry.content.$t;
} else if ("summary" in entry) {
postcontent = entry.summary.$t;
} else {
postcontent = "";
}
// buscamos la imagen o usamos una imagen por defecto
if ("media$thumbnail" in entry) {
postimg = entry.media$thumbnail.url;
} else {
postimg = "URL_imagen_por_defecto"; // colocar dirección de la imagen
}
// terminada la lectura, vamos creando el código HTML
// que en este caso tienen la misma clase CSS que los posts relacionados
salida += "<div class='relsposts'>";
salida += "<a href='" + posturl + "' target='_blank'><img src='" + postimg + "' /></a>";
salida += "<h6><a href='" + posturl + "' target='_blank'>" + posttitle + "</a></h6>";
salida += "<p>" + eliminartags(postcontent,75) + " ...</p>";
salida += "</div>";
}
document.getElementById("navetiquetas").innerHTML = salida;
// creo el HTML de la barra de navegación inferior
salida = "<a href='javascript:cerrarnavetiquetas()' class='close'></a>"
if(labelanterior) {
salida += "<a href='javascript:navetiquetas(-1);' class='anterior'></a>";
} else {
salida += "<span class='deshabilitado anterior'></span>";
}
if(labelsiguiente) {
salida += "<a href='javascript:navetiquetas(1);' class='siguiente'></a>";
} else {
salida += "<span class='deshabilitado siguiente'></span>";
}
salida += "<a href='javascript:navetiquetas(0);' class='inicio'>inicio</a>";
document.getElementById("navetiquetassel").innerHTML = salida;
// creo una línea más para dar la opcion de usar las páginas "normales"
// y agrego un enlace para suscripciones
salida = "<a href='/search/label/" + laetiqueta + "' target='_blank'>ver página de etiquetas</a>
salida += "<a style='float: right;' href='/feeds/posts/summary/-/" + laetiqueta + "' target='_blank'>Suscribirse a " + laetiqueta + "</a>";
document.getElementById("navetiquetasfooter").innerHTML = salida;
}
//]]>
</script>
</b:if>
<style> /* el div contenedor */ #etiquetasbajopost { height:0px; overflow:hidden; } /* el div con las entradas */ #navetiquetas { height: 190px; /* la altura dependerá de los detalles personales */ width: 100%; } /* cada una de las entradas */ .relsposts { float: left; height: 180px; margin: 0 5px; overflow: hidden; padding: 5px; text-align: center; width: 130px; } .relsposts:hover { /* si se quiere algún efecto */ } .relsposts a { color: #EEE; display: inline; font-family: Helvetica; font-size: 11px; line-height: 1; } .relsposts img { height: 72px; padding: 5px; width: 72px; } .relsposts h6 { display: table-cell; height: 5em; margin: 5px 0 0; overflow: hidden; padding-bottom: 2px; vertical-align: middle; width: 130px; } .relsposts p { color: #AAA; font-size: 10px; height: 4em; line-height: 1.2; margin: 5px 0 0; overflow: hidden; padding: 5px 0; text-align: left; } /* la navegación inferior */ #navetiquetassel { height: 24px; line-height: 24px; margin: 20px auto 0; padding: 1px 10px; text-align: center; width: 500px; } /* las medidas dependerán de las imágenes */ #navetiquetassel .anterior { background: transparent url(IMAGEN_ATRAS) no-repeat right 50%; float: left; height: 24px; width: 17px; } #navetiquetassel .siguiente { background: transparent url(IMAGEN_ADELANTE) no-repeat left 50%; float: right; height: 24px; width: 17px; } #navetiquetassel .close { background: transparent url(IMAGEN_CERRAR) no-repeat scroll left 4px; float: right; height: 24px; margin-left: 100px; width: 17px; } #navetiquetassel a { opacity: 0.8; filter:alpha(opacity=80); } #navetiquetassel a:hover { opacity:1;filter:alpha(opacity=100); } #navetiquetassel .deshabilitado { opacity:.3;filter:alpha(opacity=30); } /* la linea inferior */ #navetiquetasfooter { height: 36px; line-height: 36px; margin: 0 auto; width: 500px; } #navetiquetasfooter a { /* propiedades de los textos */ } #navetiquetasfooter a:hover { /* si se quiere algún enlace */ } #navetiquetasfooter a.enlacefeed { float: right; } /* una imagen de carga temporal */ #navetiquetasloading { background: transparent url(URL_IMAGEN) no-repeat 50% 50%; height: 190px; width: 100%; } </style>
10 comentarios:
Ole. ole y oleeeeeeeeeeeeeee ha quedado de lujo, me gusta porque visualmente no se mezclan etiquetas y relacionadas y con paginación.
Superior, o de 10 como dirían algunos :D
your blog really full amazing feature...cool ☻
hola amigos les escribo para pedirles un favor tengo el sgte blog http://razhielanime.blogspot.com/
esta plantilla la cree con el artisteer 3 y me gustaria que al darle en el wabget de etiquetas se despliegen estas y se contraigan ya saben por estetica he intentado con varios codigos el que me funciono con las plantillas de blogger fue este http://elescaparatederosa.blogspot.com/2009/05/expandir-y-contraer-gadget-con.html
pero no con esta plantilla y me gustaria que me ayudaran con esto y si en algo les puedo servir con mucho gusto lo haria
gracias
Gem@, Beben Koben:
Fue divertido hacerlo, creo que quedó bien.
carlos:
Como ese blog usa JQuery y la entrada de Rosa habla de un script usando Prototype, no funcionará; primero, porque no has agregado las librerías y segundo porque son incompatibles entre si. Debes buscar algo que funcione con la lbrería de scripts que utilizas.
¡Uy que locura!
Esto es bellísimo.
Veo que tengo trabajo para el fin de semana.
Lo primero que me gustaría saber es si se puede utilizar sabiendo que para las entradas relacionadas no utilizo JSON, es decir lo aplico mediante otro script.
gracias , voy a ver si se ven en mi blog y me voy a matar con el diseño haber si me queda gustando.
Hola JM, no tiene demasiado que ver con esta entrada mi pregunta, pero como era cuando una quería usar las etiquetas... hay no se como explicarme... a ver... en un menú, así por ejemplo http://www.sonando-porbailar.com.ar/search/label/So%C3%B1ando%20por%20Bailar y que no salga el cartelito de "Mostrando entradas con la etiqueta Soñando por Bailar"? Se entiende? Tengo un menú en base a etiquetas y sale siempre ese cartel, me acuerdo que en algún lado se sacaba eso, pero no donde :S
Gracias :-)
Supongo que hablas de este código:
<b:include data='top' name='status-message'/>
si se elimina, deja de mostrarse ese detalle.
Supongo que será ese, pero lo quité y sigue saliendo el mismo cartelito :S
No he dicho nada :S volví a mirar la plantilla y estaba todavía el código ahí, volví a eliminarlo y ahora si se fue el cartel, se ve que no habría tomado el cambio o vaya una a saber esas cosas de Blogger ;-)
Mil gracias :)
¿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 ...