Buscar aquí

domingo, 4 de octubre de 2009

Pasar un arreglo en PHP a uno en JavaScript


El otro día necesitaba hacer una aplicación para administrar contactos que trabajan para sucursales de un almacén en distintas ciudades.
Ahora bien, en el formulario para llenar la información de contacto hay un combo que se despliega mostrando las ciudades en las que hay almacenes, ahí se puede seleccionar la ciudad en la que labora el contacto y el siguiente campo es un combo que se despliega mostrando los almacenes de dicha ciudad, por que no seria ni estético ni funcional mostrar todos los almacenes si ya se discrimino una ciudad, y para llenar el combo de almacén debo ejecutar a una consulta en la BD que seleccione los almacenes que están en la ciudad escogida en el combo:

select almacen from almacenes where ciudad = "ciudad seleccionada en el combo"

donde almacen es el nombre del almacen y almacenes la tabla, pero esto me implicaria enviar la pagina solo para obtener eso y luego enviarla de nuevo para guardar, me pregunte entonces si no podria obtener todos los almacenes con sus ciudades:

$con="select almacen, ciudad from almacen";
$res=mysqli_query($link,$con);


y guardarlo todo en un arreglo:

$f=mysqli_fetch_array($res)

y que se envié el arreglo de php a la pagina en un arreglo javascript para que en una funcion javascript se decida como se va a llenar el combo de almacén.

Asi fue como lo hice:

$i=mysqli_num_rows($res);

Rescato cuantas filas devolvio la consulta, cuantos almacenes tenemos.


echo "<script language='javascript'> var almacencito= new Array($i); </script>";
echo "<script language='javascript'>var ciudad = new Array($i); </script>";


Defino desde el codigo php dos arreglos que tengan por tamaño tantas filas tiene la consulta.
Y cargo cada campo del arreglo de javascript con cada campo de la consulta que esta en php.

while($f=mysqli_fetch_array($res)){
$temporal=$f['ciudad'];
echo "<script language='javascript'>ciudad[$i]='$temporal';</script>";
$temporal=$f['almacen'];
echo "<script language='javascript'>almacencito[$i]='$temporal'; </script>";
$i++;
}



Asi cuando ya se ha seleccionado el campo ciudad una funcion javascript llena el combo almacen.

function almacen()
{
var i=0;
var k=0;
var j= document.f1.ciudad.selectedIndex;
while(i<ciudad.length)
alert(document.f1.ciudad.selectedIndex+" "+i.toString()+" "+almacencito[i].toString());
if(document.f1.ciudad.options[j].text==ciudad[i])
{
document.f1.Almacen.length=k+1;
document.f1.Almacen.options[k].value=almacencito[i].toString();
document.f1.Almacen.options[k].text=almacencito[i].toString();
k++;
}
i++;
}
}


Se que existen formas mas eficientes y sofisticadas de hacer esto, pero esta me saco de un apuro.

Comando apt-get al rescate

El otro día intente torpe y tontamente actualizar mi Amarok 2.1 (que me dejo con ganas de mi Amarok 1.4) a Amarok 2.2, pero cual fue mi sorpresa cuando al día siguiente prendí de nuevo el compu, todo era caos y desolación, habia perdido plasma. Se estaba ejecutando pero, y aunque no lo puedo explicar mejor que esto, muchas de sus partes no funcionaban, tenia el panel de kde (barra de tareas), el reloj, pero de ahi en adelante nada, no aparecias las aplicaciones en ejecución el panel y tampoco tenia escritorio, nada ni fondo ni plasmoides ni nada.
Soy bastante novata y la verdad estaba bien perdida y no fue mucho, practicamente nada lo que encontre en Internet.
Asi que intente razonar que podia estar pasando y que era lo que habia hecho que podia producir eso, asi due como le heche la culpa a Amarok, pues al intentar actualizar seguramente se habian instalado librerias y paquetes que entraban en conflicto con KDE 4.2 (si estoy hablando muchas tonterias que alguien me corrija), pero el caso es que la solución que le di funciono y me hace pensar que estoy no totamente pero casi complatamente en lo cierto.

Al iniciar por gnome me decia que se habia intentando una actualizacion que no habia terminado bien, (lo que es tecnicamente cierto).

Intente sudo apt-get update: que se usa para sincronizar el índice de paquetes respecto a sus fuentes, de los lugares especificados en /etc/apt/sources.list. Por ejemplo, cuando se usa un archivo de Debian, esta orden descarga y analiza los ficheros Packages.gz, de tal forma que la información acerca de nuevos paquetes pasa a estar disponible. Siempre se debe realizar un update antes de un upgrade o un dist-upgrade. (según el manual de apt-get).

No funciono obviamente por que apt-get update solo descargará descripciones. Es con propósito informativo.

Pude haber intentado un upgrade: se usa para instalar la versión más nueva de todos los paquetes instalados en el sistema provenientes de alguna de las fuentes listadas en /etc/apt/sources.list. Los paquetes instalados con una nueva versión disponible son descargados y actualizados, bajo ninguna circunstancia se desinstalarán paquetes, o se instalarán paquetes nuevos. Las nuevas versiones de programas instalados que no puedan ser actualizados sin cambiar el estado de instalación de otros paquetes no se instalarán, manteniéndose la versión actual. Debe realizarse un update antes para que apt-get sepa cuales son las versiones disponibles de los paquetes.

Pero al final me decidi por dist-upgrade: además de realizar las acciones de upgrade, maneja inteligentemente los cambios de dependencias debidos a nuevas versiones de paquetes, tiene un sofisticado sistema de resolución de conflictos, si es necesario tratará de actualizar los paquetes más importantes a costa de los menos importantes.

Esto se oye mas impresionante y prometedor, sobre todo si se tiene un conflicto tan extraño de dependencias.

Lo intente: sudo apt-get dist-upgrade.
Pero no funciono, mas conflictos. Asi que por consejo de la terminal intente lo mismo pero con --fix-missing, que no tiene en cuenta los paquetes que no se hayan podido descargar o que después de la descarga se encuentren dañados, estos paquetes se tratan como no modificables y se continúa con el resto. Si un paquete se selecciona para su normal instalación (particularmente si se hace mediante la línea de órdenes) y no puede ser descargado, será tratado como no modificable.

Esto obviamente tiene sus riesgos, pues luego de leer queda claro que arrasara con quien se interponga en su camino, pero la verdad aun no encontrado nada de lo que deba arrepentirme, quede con kde 4.3 y todo esta bien, un paquete quedo roto, kstart, y lo arregle con synaptic.
Y sigo con Amarok 2.1, creo que lo voy a dejar asi unos días.

Supongo que no es la solución mas ortodoxa, ya que lo que hice fue actualizar. Pero funciono y kde 4.3 esta super.

Bibliografía: paginas que me fueron de utilidad. Muchas gracias!!!! xD