Este script de DHTML ordena los registros de una tabla HTML segun el campo elegido.
Puede hacerlo ascendente o descendentemente. Ordenar la tabla no requiere de ninguna comunicación con el servidor. Es una operación "client-side".
Los datos que aparecen en la tabla requieren de un formato especial. Debe proporcionarse: 1º) un nombre a la tabla (p.eje., var nombreTabla = "Personas::Edades"; ); 2º una array que contenga los nombres de los campos (p.ej., var campos = ['Nombre','Apellido','Edad']; );3º) un array multidemensional (numRegistros, numCampos) con los registros
(p.ej., var registros = [ ['jose','lopez','45'], ['ramon','mera','15'], ['angeles','varela','42'], ['miguel','carril','45'], ['mar','mera','39'] ]; ).
Tanto el nombre de las variables ('nombreTabla','campos','registros'), como la estructura han de respetarse. Si algun campo es del tipo fechas, éstas deben estar en el formato aaaa-mm-dd para ser correctamente ordenadas.
El script funcionará únicamente para una tabla de la página. Además de los datos a presentar usted puede modificar el formato de presentación final de los mismos ( función representaTabla() )
Un posibilidad interesante sería generar las tablas de datos en el servidor mediante PHP o ASP, guardarlas en un archivo (p.ej., "datos.asp" o "datos.php") y después incluirlas en la página correspondiente (p.ej., "pagina.php") siguiendo las reglas de esos lenguajes.
Por ejemplo, "datos.php" podría ser:
<?php
echo ("<script type=\"text/javascript\">\n") ;
echo ("var nombreTabla = \"Personas::Edades\";\n") ;
echo (" var campos = ['Nombre','Apellido','Edad'];\n") ;
echo (" var registros = [\n") ;
echo (" ['jose','lopez','45'],\n") ;
echo (" ['ramon','mera','15'],\n") ;
echo (" ['angeles','varela','42'],\n") ;
echo (" ['miguel','carril','45'],\n") ;
echo (" ['mar','mera','39']\n") ;
echo (" ];\n") ;
echo ("</script>") ;
echo ("\n") ;
?>
En "pagina.php" usted pondría:
<? include("datos.php")?>
<script language="JavaScript" type="text/javascript">
var numRegistros = registros.length;
var numCampos = campos.length;
var tablaOrdenada = new Array(numRegistros);
... ... ...
En HEAD
<script language="JavaScript" type="text/javascript">
var nombreTabla = "Personas::Edades";
// array nombres de los campos
var campos = ['Nombre','Apellido','Edad'];
// array multidimensional con los registros
var registros = [
['jose','lopez','45'],
['ramon','mera','15'],
['angeles','varela','42'],
['miguel','carril','45'],
['mar','mera','39']
];
var numRegistros = registros.length;
var numCampos = campos.length;
var tablaOrdenada = new Array(numRegistros);
//función ordenaTabla
// campOrden: número que indica el campo elegido para ordenar;
// si campOrden = -1 los registros no se ordenan.
// tipoOrden puede ser 'asc' (ascendente) o 'desc' (descendente)
function ordenaTabla(campOrden,tipoOrden){
// no ordenado
if (campOrden == -1){
for(i = 0; i<numRegistros;i++){
tablaOrdenada[i] = i;
}
}
// ordenado
else{
var aux = new Array();
var j = 0;
for(j;j<numRegistros;j++){
aux[j] = registros[j][campOrden] + "::" + j;
}
var auxOrdenada = aux.sort();
if (tipoOrden == "desc"){
auxOrdenada = auxOrdenada.reverse();
}
for (t = 0 ; t<numRegistros;t++){
x = auxOrdenada[t].split("::");
auxOrdenada[t] = x[1];
}
tablaOrdenada = auxOrdenada;
}
representaTabla(campOrden,tipoOrden);
}
// función representar los datos ordenados en tabla
// TABLA CON LOS DATOS
function representaTabla(campOrden,tipoOrden){
var textoTabla = "";
var indice = "";
textoTabla +='<table border="1" cellpadding="10">';
// añadimos el nombre de la tabla
textoTabla += "<caption>Nombre de la Tabla: <b>" + nombreTabla + "</b></caption>";
// cabecera de la tabla: añadimos los nombres de los campos
textoTabla +='<tr>';
for(w=0;w<numCampos;w++){
textoTabla += '<td align="center"><b>' + campos[w] + '</b></td>';
}
textoTabla +='</tr>';
// cuerpo de la tabla con los datos
for (i = 0;i<numRegistros;i++){
indice = tablaOrdenada[i];
// fila
textoTabla +='<tr>';
// columna
for (z=0;z<numCampos;z++){
textoTabla +=' <td>(' + indice + ","+ z + ") =>" + registros[indice][z] + '</td>';
}
textoTabla +='</tr>';
}
// pie de la tabla: añadimos los enlaces para ordenar
textoTabla +='<tr>';
for(w=0;w<numCampos;w++){
textoTabla += '<td align="center"><a href="javascript:ordenaTabla('+w+',\'asc\')">';
textoTabla += '<img src="ir2.gif" border="0" alt="Ordena ASCENDENTEMENTE">';
textoTabla += '</a> <a href="javascript:ordenaTabla('+w+',\'desc\')">';
textoTabla += '<img src="ir1.gif" border="0" alt="Ordena DESCENDENTEMENTE">';
textoTabla += '</a></td>';
}
textoTabla +='</tr>';
textoTabla +='</table>';
// añadimos un resumen.
textoTabla +='<p>Información:<ul>';
textoTabla +='<li>Número de Campos => <b>' + numCampos + '</b></li>';
textoTabla +='<li>Número de Campos => <b>' + numRegistros + '</b></li>';
if (campOrden == -1){
textoTabla +='<li><b>No ordenada [Posición original]</p></li>';
}else{
textoTabla +='<li>Orden segun => <b>' + campos[campOrden] + " [" + tipoOrden + ']</b></li>';
textoTabla +='<li><a href="javascript:ordenaTabla(-1)">Posición inicial [Reiniciar]</a></li>';
}
textoTabla +='</ul></p>';
// escribimos en la página
document.getElementById("tabla").innerHTML = textoTabla;
}
</script>
En la etiqueta body.
Añada el tributo onload de este forma
<body onload="ordenaTabla(-1,'asc')">
En donde va a aparecer la tabla.
En el lugar donde usted haya elegido para que se escriba la tabla dinámica escriba los siguiente:
<div id="tabla"></div>