Foros del Web » Programando para Internet » Javascript »

SELECTS dependientes con inteligencia hacia atrás

Estas en el tema de SELECTS dependientes con inteligencia hacia atrás en el foro de Javascript en Foros del Web. Había visto muchos sistemas para crear SELECT'S dependientes en el que al seleccionar un valor del primero, el segundo quedase condicionalmente modificado. Lo que no ...
  #1 (permalink)  
Antiguo 25/04/2007, 17:09
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
SELECTS dependientes con inteligencia hacia atrás

Había visto muchos sistemas para crear SELECT'S dependientes en el que al seleccionar un valor del primero, el segundo quedase condicionalmente modificado.

Lo que no he visto nunca es que si seleccionamos una opción en el tercer SELECT, se seleccionasen automáticamente las opciones en el SELECT1 y en el SELECT2 que corresponden (una especie de inteligencia-ahorro para el usuario).


Me decidí a crearlo, y tras varios intentos lo cedo para que lo pongáis a prueba y ver vuestras sugerencias:

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
title></title>
<
meta name="Author" content="derkeNuke">
</
head>

<
body>



<
script>

/****************************************************************
    ESTRUCTURA BÁSICA
****************************************************************/
var paises=["PAIS1","PAIS2","PAIS3"];
var 
provincias=[
    [
"PROVINCIA1 (p1)","PROVINCIA2 (p1)",  "PROVINCIA3 (p1)""PROVINCIA4 (p1)"], 
    [
"PROVINCIA1 (p2)""PROVINCIA2 (p2)""PROVINCIA3 (p2)""PROVINCIA4 (p2)""PROVINCIA5 (p2)""PROVINCIA6 (p2)"], 
    [
"PROVINCIA1 (p3)""PROVINCIA2 (p3)""PROVINCIA3 (p3)" ]
];
var 
ciudades=[
    [
        [
"ciud1-1-1""ciud1-1-2""ciud1-1-3""ciud1-1-4""ciud1-1-5" ],
        [
"ciud1-2-1""ciud1-2-2""ciud1-2-3""ciud1-2-4" ],
        [
"ciud1-3-1""ciud1-3-2""ciud1-3-3""ciud1-3-4" ],
        [
"ciud1-4-1""ciud1-4-2""ciud1-4-3" ]
    ],
    
    [
        [
"ciud2-1-1""ciud2-1-2""ciud2-1-3""ciud2-1-4""ciud2-1-5""ciud2-1-6""ciud2-1-7""ciud2-1-8" ],
        [
"ciud2-2-1""ciud2-2-2""ciud2-2-3""ciud2-2-4""ciud2-2-5""ciud2-2-6" ],
        [
"ciud2-3-1""ciud2-3-2""ciud2-3-3""ciud2-3-4""ciud2-3-5""ciud2-3-6" ],
        [
"ciud2-4-1""ciud2-4-2""ciud2-4-3""ciud2-4-4""ciud2-4-5""ciud2-4-6""ciud2-4-7" ],
        [
"ciud2-5-1""ciud2-5-2""ciud2-5-3""ciud2-5-4""ciud2-5-5" ],
        [
"ciud2-6-1""ciud2-6-2""ciud2-6-3""ciud2-6-4""ciud2-6-5" ]
    ],
    
    [
        [
"ciud3-1-1""ciud3-1-2""ciud3-1-3""ciud3-1-4""ciud3-1-5""ciud3-1-6""ciud3-1-7""ciud3-1-8" ],
        [
"ciud3-2-1""ciud3-2-2""ciud3-2-3" ],
        [
"ciud3-3-1""ciud3-3-2""ciud3-3-3""ciud3-3-4" ]
    ]
];


/****************************************************************
    FUNCIONES ÚTILES PARA ARRAYS Y SELECTS
****************************************************************/

//agrega un option a un select, con un par de atributos extra que nos serán útiles
function agregarOpt(elSel,txt,valor,suPais,suProvincia,contieneProvincias,contieneCiudades) {
    var 
indice=elSel.options.length;
    
elSel.optionsindice ] = new Option(txt,valor);
    
elSel.optionsindice ].suPais=suPais;
    
elSel.optionsindice ].suProvincia=suProvincia;
    
elSel.optionsindice ].contieneProvincias=contieneProvincias;
    
elSel.optionsindice ].contieneCiudades=contieneCiudades;
}

//selecciona la opción iPos en el select elSelect
function selecciona(elSelect,iPos) { 
    
elSelect.options[iPos].selected="selected";        // para los estándares
    
elSelect.options.selectedIndex=iPos;            // a la manera IE
}

//devuelve true si el elemento elem se encuentra entre los elementos del array
Array.prototype.existe=function(elem) {
    for(var 
i=0;i<this.length;i++)
        if( 
this[i] == elem ) return true;
    return 
false;
}

//borra todas las opciones de un select cuyo valor no se encuentre entre los elementos de elArray
function dejarOpcionesExistentes(elSelect,elArray) {
    for(var 
i=0i<elSelect.options.lengthi++) {
        if( !
elArray.existeelSelect.options[i].value ) ) {
            
//borramos la opcion
            
elSelect.options[i]=null;
            
i--;    //reducimos i porque tenemos que iterar más veces (el length de las options es uno menos)
        
}
    }
}

/****************************************************************
    CREACIÓN Y RELLENADO DE LOS SELECTS
****************************************************************/

//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT");

//la función coloca en los selects creados todos los valores de los arrays, pudiendo salvar el select que se indique en los argumentos
function reiniciar_selects(conPaises,conProvincias,ConCiudades) {
    
//eliminamos las option de los selects que procedan
    
while( (conPaises==undefined || conPaises) && selPais.options.length>)
        
selPais.options[0]=null;
    while( (
conProvincias==undefined || conProvincias) && selProv.options.length>)
        
selProv.options[0]=null;
    while( (
ConCiudades==undefined || ConCiudades) && selCiud.options.length>)
        
selCiud.options[0]=null;
    
//colocamos las opciones nuevas si procede
    
for(var i=0i<paises.lengthi++) {
        if(
conPaises==undefined || conPaises 
            
agregarOpt(selPaispaises[i], paises[i], nullnullprovincias[i].toString().split(","), ciudades[i].toString().split(",") );
        for(var 
j=0j<provincias[i].lengthj++) {
            if(
conProvincias==undefined || conProvincias )  
                
agregarOpt(selProvprovincias[i][j], provincias[i][j], inullnullciudades[i][j].toString().split(",") );
            for(
k=0k<ciudades[i][j].lengthk++) {
                if(
ConCiudades==undefined || ConCiudades ) {
                    
//cuenta regresiva para contar todas las provincias anteriores (cuantas provincias habia en los paises anteriores)
                    
var aux=i-1provinciasAnteriores=0;
                    while(
aux>=0)
                        
provinciasAnteriores+=provincias[aux--].length;
                    
agregarOpt(selCiudciudades[i][j][k], ciudades[i][j][k], iprovinciasAnteriores+jnullnull);
                }
            }
        }
    }
}

reiniciar_selects(true,true,true);        //todos los valores en todos los selects

//adjuntamos al documento
document.body.appendChild(selPais);
document.body.appendChild(selProv);
document.body.appendChild(selCiud);



/****************************************************************
    EVENTOS ONCHANGE PARA CADA UNO DE LOS SELECTS
****************************************************************/
selPais.onchange=function() {
    
//restablecemos provincias, ciudades
    
reiniciar_selects(false,true,true);
    
//cambiar provincias para que sólo contengan .contieneProvincias
    
var contieneProvincias=this.options[this.options.selectedIndex].contieneProvincias;
    
dejarOpcionesExistentes(selProv,contieneProvincias);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selProv.onchange=function() {
    
//restablecemos sólo ciudades
    
reiniciar_selects(false,false,true);
    
//seleccionar el pais al que pertenece la provincia
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selCiud.onchange=function() {
    
//seleccionar el pais al que pertenece la ciudad
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//seleccionar la provincia a la que pertenece la ciudad
    
var suProvincia=this.options[this.options.selectedIndex].suProvincia;
    
selecciona(selProv,suProvincia);
}



//creamos un botón por si acaso se necesita restablecer todo:
var boton=document.createElement("INPUT");
with(boton) {
    
type="button"value="Restablecer"onclick=reiniciar_selects;
}
document.body.appendChild(boton);


</script>

</body>
</html> 
Sé que es largo, pero lo he comentado y separado cada función para que sea lo más legible posible, no parece demasiado complicado si uno lo mira tranquilamente.

Probado en: FF2, IE6.

Opiniones por favor


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #2 (permalink)  
Antiguo 01/05/2007, 14:17
 
Fecha de Ingreso: abril-2006
Ubicación: Colombia
Mensajes: 648
Antigüedad: 18 años
Puntos: 3
Re: SELECTS dependientes con inteligencia hacia atrás

Hola Derkenuke

Bueno, pues yo habia hecho algo similar pero en php, pero con tu ej en javascript es también bastante bueno, y de hecho funciona perfecto en iexplorer 6.0.2900.2180, pero en firefox 2.0.0.3 se queda congelado, es decir, si por ej escojo pais3 del primer select el se devuelve a pais1 y asi con los demás combos, siempre se devuelve al primer valor, de resto pues muy útil tú ejemplo.
__________________
Suerte.
_______________________________
"La vida es el principio de la muerte".
  #3 (permalink)  
Antiguo 01/05/2007, 14:32
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SELECTS dependientes con inteligencia hacia atrás

eh! pues pensaba que funcionaba bien! si básicamente yo pruebo los script en firefox antes que en IE!

Ojo que tampoco funciona simplemente esto:
Código PHP:
<script>

/****************************************************************
    ESTRUCTURA BÁSICA
****************************************************************/
var paises=["PAIS1","PAIS2","PAIS3"];
var 
provincias=[
    [
"PROVINCIA1 (p1)","PROVINCIA2 (p1)",  "PROVINCIA3 (p1)""PROVINCIA4 (p1)"], 
    [
"PROVINCIA1 (p2)""PROVINCIA2 (p2)""PROVINCIA3 (p2)""PROVINCIA4 (p2)""PROVINCIA5 (p2)""PROVINCIA6 (p2)"], 
    [
"PROVINCIA1 (p3)""PROVINCIA2 (p3)""PROVINCIA3 (p3)" ]
];
var 
ciudades=[
    [
        [
"ciud1-1-1""ciud1-1-2""ciud1-1-3""ciud1-1-4""ciud1-1-5" ],
        [
"ciud1-2-1""ciud1-2-2""ciud1-2-3""ciud1-2-4" ],
        [
"ciud1-3-1""ciud1-3-2""ciud1-3-3""ciud1-3-4" ],
        [
"ciud1-4-1""ciud1-4-2""ciud1-4-3" ]
    ],
    
    [
        [
"ciud2-1-1""ciud2-1-2""ciud2-1-3""ciud2-1-4""ciud2-1-5""ciud2-1-6""ciud2-1-7""ciud2-1-8" ],
        [
"ciud2-2-1""ciud2-2-2""ciud2-2-3""ciud2-2-4""ciud2-2-5""ciud2-2-6" ],
        [
"ciud2-3-1""ciud2-3-2""ciud2-3-3""ciud2-3-4""ciud2-3-5""ciud2-3-6" ],
        [
"ciud2-4-1""ciud2-4-2""ciud2-4-3""ciud2-4-4""ciud2-4-5""ciud2-4-6""ciud2-4-7" ],
        [
"ciud2-5-1""ciud2-5-2""ciud2-5-3""ciud2-5-4""ciud2-5-5" ],
        [
"ciud2-6-1""ciud2-6-2""ciud2-6-3""ciud2-6-4""ciud2-6-5" ]
    ],
    
    [
        [
"ciud3-1-1""ciud3-1-2""ciud3-1-3""ciud3-1-4""ciud3-1-5""ciud3-1-6""ciud3-1-7""ciud3-1-8" ],
        [
"ciud3-2-1""ciud3-2-2""ciud3-2-3" ],
        [
"ciud3-3-1""ciud3-3-2""ciud3-3-3""ciud3-3-4" ]
    ]
];


/****************************************************************
    FUNCIONES ÚTILES PARA ARRAYS Y SELECTS
****************************************************************/

//agrega un option a un select, con un par de atributos extra que nos serán útiles
function agregarOpt(elSel,txt,valor,suPais,suProvincia,contieneProvincias,contieneCiudades) {
    var 
indice=elSel.options.length;
    
elSel.optionsindice ] = new Option(txt,valor);
    
elSel.optionsindice ].suPais=suPais;
    
elSel.optionsindice ].suProvincia=suProvincia;
    
elSel.optionsindice ].contieneProvincias=contieneProvincias;
    
elSel.optionsindice ].contieneCiudades=contieneCiudades;
}


/****************************************************************
    CREACIÓN Y RELLENADO DE LOS SELECTS
****************************************************************/

//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT");

//la función coloca en los selects creados todos los valores de los arrays, pudiendo salvar el select que se indique en los argumentos
function reiniciar_selects(conPaises,conProvincias,ConCiudades) {
    
//eliminamos las option de los selects que procedan
    
while( (conPaises==undefined || conPaises) && selPais.options.length>)
        
selPais.options[0]=null;
    while( (
conProvincias==undefined || conProvincias) && selProv.options.length>)
        
selProv.options[0]=null;
    while( (
ConCiudades==undefined || ConCiudades) && selCiud.options.length>)
        
selCiud.options[0]=null;
    
//colocamos las opciones nuevas si procede
    
for(var i=0i<paises.lengthi++) {
        if(
conPaises==undefined || conPaises 
            
agregarOpt(selPaispaises[i], paises[i], nullnullprovincias[i].toString().split(","), ciudades[i].toString().split(",") );
        for(var 
j=0j<provincias[i].lengthj++) {
            if(
conProvincias==undefined || conProvincias )  
                
agregarOpt(selProvprovincias[i][j], provincias[i][j], inullnullciudades[i][j].toString().split(",") );
            for(
k=0k<ciudades[i][j].lengthk++) {
                if(
ConCiudades==undefined || ConCiudades ) {
                    
//cuenta regresiva para contar todas las provincias anteriores (cuantas provincias habia en los paises anteriores)
                    
var aux=i-1provinciasAnteriores=0;
                    while(
aux>=0)
                        
provinciasAnteriores+=provincias[aux--].length;
                    
agregarOpt(selCiudciudades[i][j][k], ciudades[i][j][k], iprovinciasAnteriores+jnullnull);
                }
            }
        }
    }
}

reiniciar_selects(true,true,true);        //todos los valores en todos los selects

//adjuntamos al documento
document.body.appendChild(selPais);
document.body.appendChild(selProv);
document.body.appendChild(selCiud);




//creamos un botón por si acaso se necesita restablecer todo:
var boton=document.createElement("INPUT");
with(boton) {
    
type="button"value="Restablecer"onclick=reiniciar_selects;
}
document.body.appendChild(boton);


</script> 
¿Por qué podrá ser?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #4 (permalink)  
Antiguo 01/05/2007, 14:50
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SELECTS dependientes con inteligencia hacia atrás

Bueno, resulta que después de batallar con él, quitando y poniendo código durante media hora me he dado cuenta que no se puede hacer:
Código PHP:
boton.onclick=funcion 
en vez de eso he puesto
Código PHP:
boton.setAttribute("onclick""funcion()"); 
Más que nada para no tener que poner dos líneas con aquello del addEventListener y atachEvent para diferentes navegadores...

Aunque no sabía que no se pudiera poner como lo había puesto yo.

Código definitivo para IE6 y FF2:
Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
title>SELECTs depedientes con inteligencia hacia atr&#225;s</title>
<meta name="Author" content="derkeNuke">
</
head>

<
body>



<
script>

/****************************************************************
    ESTRUCTURA BÁSICA
****************************************************************/
var paises=["PAIS1","PAIS2","PAIS3"];
var 
provincias=[
    [
"PROVINCIA1 (p1)","PROVINCIA2 (p1)",  "PROVINCIA3 (p1)""PROVINCIA4 (p1)"], 
    [
"PROVINCIA1 (p2)""PROVINCIA2 (p2)""PROVINCIA3 (p2)""PROVINCIA4 (p2)""PROVINCIA5 (p2)""PROVINCIA6 (p2)"], 
    [
"PROVINCIA1 (p3)""PROVINCIA2 (p3)""PROVINCIA3 (p3)" ]
];
var 
ciudades=[
    [
        [
"ciud1-1-1""ciud1-1-2""ciud1-1-3""ciud1-1-4""ciud1-1-5" ],
        [
"ciud1-2-1""ciud1-2-2""ciud1-2-3""ciud1-2-4" ],
        [
"ciud1-3-1""ciud1-3-2""ciud1-3-3""ciud1-3-4" ],
        [
"ciud1-4-1""ciud1-4-2""ciud1-4-3" ]
    ],
    
    [
        [
"ciud2-1-1""ciud2-1-2""ciud2-1-3""ciud2-1-4""ciud2-1-5""ciud2-1-6""ciud2-1-7""ciud2-1-8" ],
        [
"ciud2-2-1""ciud2-2-2""ciud2-2-3""ciud2-2-4""ciud2-2-5""ciud2-2-6" ],
        [
"ciud2-3-1""ciud2-3-2""ciud2-3-3""ciud2-3-4""ciud2-3-5""ciud2-3-6" ],
        [
"ciud2-4-1""ciud2-4-2""ciud2-4-3""ciud2-4-4""ciud2-4-5""ciud2-4-6""ciud2-4-7" ],
        [
"ciud2-5-1""ciud2-5-2""ciud2-5-3""ciud2-5-4""ciud2-5-5" ],
        [
"ciud2-6-1""ciud2-6-2""ciud2-6-3""ciud2-6-4""ciud2-6-5" ]
    ],
    
    [
        [
"ciud3-1-1""ciud3-1-2""ciud3-1-3""ciud3-1-4""ciud3-1-5""ciud3-1-6""ciud3-1-7""ciud3-1-8" ],
        [
"ciud3-2-1""ciud3-2-2""ciud3-2-3" ],
        [
"ciud3-3-1""ciud3-3-2""ciud3-3-3""ciud3-3-4" ]
    ]
];


/****************************************************************
    FUNCIONES ÚTILES PARA ARRAYS Y SELECTS
****************************************************************/

//agrega un option a un select, con un par de atributos extra que nos serán útiles
function agregarOpt(elSel,txt,valor,suPais,suProvincia,contieneProvincias,contieneCiudades) {
    var 
indice=elSel.options.length;
    
elSel.optionsindice ] = new Option(txt,valor);
    
elSel.optionsindice ].suPais=suPais;
    
elSel.optionsindice ].suProvincia=suProvincia;
    
elSel.optionsindice ].contieneProvincias=contieneProvincias;
    
elSel.optionsindice ].contieneCiudades=contieneCiudades;
}

//selecciona la opción iPos en el select elSelect
function selecciona(elSelect,iPos) { 
    
elSelect.options[iPos].selected="selected";        // para los estándares
    
elSelect.options.selectedIndex=iPos;            // a la manera IE
}

//devuelve true si el elemento elem se encuentra entre los elementos del array
Array.prototype.existe=function(elem) {
    for(var 
i=0;i<this.length;i++)
        if( 
this[i] == elem ) return true;
    return 
false;
}

//borra todas las opciones de un select cuyo valor no se encuentre entre los elementos de elArray
function dejarOpcionesExistentes(elSelect,elArray) {
    for(var 
i=0i<elSelect.options.lengthi++) {
        if( !
elArray.existeelSelect.options[i].value ) ) {
            
//borramos la opcion
            
elSelect.options[i]=null;
            
i--;    //reducimos i porque tenemos que iterar más veces (el length de las options es uno menos)
        
}
    }
}

/****************************************************************
    CREACIÓN Y RELLENADO DE LOS SELECTS
****************************************************************/

//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT");

//la función coloca en los selects creados todos los valores de los arrays, pudiendo salvar el select que se indique en los argumentos
function reiniciar_selects(conPaises,conProvincias,ConCiudades) {
    
//eliminamos las option de los selects que procedan
    
while( (conPaises==undefined || conPaises) && selPais.options.length>)
        
selPais.options[0]=null;
    while( (
conProvincias==undefined || conProvincias) && selProv.options.length>)
        
selProv.options[0]=null;
    while( (
ConCiudades==undefined || ConCiudades) && selCiud.options.length>)
        
selCiud.options[0]=null;
    
//colocamos las opciones nuevas si procede
    
for(var i=0i<paises.lengthi++) {
        if(
conPaises==undefined || conPaises 
            
agregarOpt(selPaispaises[i], paises[i], nullnullprovincias[i].toString().split(","), ciudades[i].toString().split(",") );
        for(var 
j=0j<provincias[i].lengthj++) {
            if(
conProvincias==undefined || conProvincias )  
                
agregarOpt(selProvprovincias[i][j], provincias[i][j], inullnullciudades[i][j].toString().split(",") );
            for(
k=0k<ciudades[i][j].lengthk++) {
                if(
ConCiudades==undefined || ConCiudades ) {
                    
//cuenta regresiva para contar todas las provincias anteriores (cuantas provincias habia en los paises anteriores)
                    
var aux=i-1provinciasAnteriores=0;
                    while(
aux>=0)
                        
provinciasAnteriores+=provincias[aux--].length;
                    
agregarOpt(selCiudciudades[i][j][k], ciudades[i][j][k], iprovinciasAnteriores+jnullnull);
                }
            }
        }
    }
}

reiniciar_selects(true,true,true);        //todos los valores en todos los selects

//adjuntamos al documento
document.body.appendChild(selPais);
document.body.appendChild(selProv);
document.body.appendChild(selCiud);



/****************************************************************
    EVENTOS ONCHANGE PARA CADA UNO DE LOS SELECTS
****************************************************************/
selPais.onchange=function() {
    
//restablecemos provincias, ciudades
    
reiniciar_selects(false,true,true);
    
//cambiar provincias para que sólo contengan .contieneProvincias
    
var contieneProvincias=this.options[this.options.selectedIndex].contieneProvincias;
    
dejarOpcionesExistentes(selProv,contieneProvincias);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selProv.onchange=function() {
    
//restablecemos sólo ciudades
    
reiniciar_selects(false,false,true);
    
//seleccionar el pais al que pertenece la provincia
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selCiud.onchange=function() {
    
//seleccionar el pais al que pertenece la ciudad
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//seleccionar la provincia a la que pertenece la ciudad
    
var suProvincia=this.options[this.options.selectedIndex].suProvincia;
    
selecciona(selProv,suProvincia);
}



//creamos un botón por si acaso se necesita restablecer todo:
var boton=document.createElement("INPUT");
with(boton) {
    
type="button"value="Restablecer"setAttribute("onclick","reiniciar_selects(true,true,true)");
}
document.body.appendChild(boton);


</script>

</body>
</html> 

Bueno, a ver si ahora va la vencida....
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 01/05/2007, 15:57
 
Fecha de Ingreso: abril-2006
Ubicación: Colombia
Mensajes: 648
Antigüedad: 18 años
Puntos: 3
Re: SELECTS dependientes con inteligencia hacia atrás

Hola

Bueno, en efecto ahora si funciona bien en firefox también , pero ahora el botón de restablecer solo funciona en firefox, en iexplorer no.

Tocaria capturar que navegador se esta usando y dependiendo si es explorer o firefox haga el with con uno u otro código (con el with del primer codigo que posteaste funciona el botón en iexplorer pero no en firefox, y con el codigo reciente viceversa) y ya con eso creo que ahora si la tercera seria la vencida
__________________
Suerte.
_______________________________
"La vida es el principio de la muerte".
  #6 (permalink)  
Antiguo 01/05/2007, 17:26
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SELECTS dependientes con inteligencia hacia atrás

Vale, queda eso pendiente, que es muy sencillito y he descubierto otro fallo.

Cuando se selecciona una ciudad directamente la provincia se pone bien, pero cuando cambiamos de pais y el select de provincias se modifica automáticamente, al cambiar las ciudades siguen diciendo al select provincias que se cambien al mismo índice que en el primer caso, luego la provincia queda mal seleccionada. Creo que plantee mal esto, tendré que pensarlo en la manera más elegante de solventarlo.


Saludos y gracias El Patrón.!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 01/05/2007, 17:57
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SELECTS dependientes con inteligencia hacia atrás

Bueno yo diría que ya está:

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
title>SELECTs depedientes con inteligencia hacia atrás</title>
<
meta name="Author" content="derkeNuke">
</
head>

<
body>



<
script>

/****************************************************************
    ESTRUCTURA BÁSICA
****************************************************************/
var paises=["PAIS1","PAIS2","PAIS3"];
var 
provincias=[
    [
"PROVINCIA1 (p1)","PROVINCIA2 (p1)",  "PROVINCIA3 (p1)""PROVINCIA4 (p1)"], 
    [
"PROVINCIA1 (p2)""PROVINCIA2 (p2)""PROVINCIA3 (p2)""PROVINCIA4 (p2)""PROVINCIA5 (p2)""PROVINCIA6 (p2)"], 
    [
"PROVINCIA1 (p3)""PROVINCIA2 (p3)""PROVINCIA3 (p3)" ]
];
var 
ciudades=[
    [
        [
"ciud1-1-1""ciud1-1-2""ciud1-1-3""ciud1-1-4""ciud1-1-5" ],
        [
"ciud1-2-1""ciud1-2-2""ciud1-2-3""ciud1-2-4" ],
        [
"ciud1-3-1""ciud1-3-2""ciud1-3-3""ciud1-3-4" ],
        [
"ciud1-4-1""ciud1-4-2""ciud1-4-3" ]
    ],
    
    [
        [
"ciud2-1-1""ciud2-1-2""ciud2-1-3""ciud2-1-4""ciud2-1-5""ciud2-1-6""ciud2-1-7""ciud2-1-8" ],
        [
"ciud2-2-1""ciud2-2-2""ciud2-2-3""ciud2-2-4""ciud2-2-5""ciud2-2-6" ],
        [
"ciud2-3-1""ciud2-3-2""ciud2-3-3""ciud2-3-4""ciud2-3-5""ciud2-3-6" ],
        [
"ciud2-4-1""ciud2-4-2""ciud2-4-3""ciud2-4-4""ciud2-4-5""ciud2-4-6""ciud2-4-7" ],
        [
"ciud2-5-1""ciud2-5-2""ciud2-5-3""ciud2-5-4""ciud2-5-5" ],
        [
"ciud2-6-1""ciud2-6-2""ciud2-6-3""ciud2-6-4""ciud2-6-5" ]
    ],
    
    [
        [
"ciud3-1-1""ciud3-1-2""ciud3-1-3""ciud3-1-4""ciud3-1-5""ciud3-1-6""ciud3-1-7""ciud3-1-8" ],
        [
"ciud3-2-1""ciud3-2-2""ciud3-2-3" ],
        [
"ciud3-3-1""ciud3-3-2""ciud3-3-3""ciud3-3-4" ]
    ]
];


/****************************************************************
    FUNCIONES ÚTILES PARA ARRAYS Y SELECTS
****************************************************************/

//agrega un option a un select, con un par de atributos extra que nos serán útiles
function agregarOpt(elSel,txt,valor,suPais,suProvincia,contieneProvincias,contieneCiudades) {
    var 
indice=elSel.options.length;
    
elSel.optionsindice ] = new Option(txt,valor);
    
elSel.optionsindice ].suPais=suPais;
    
elSel.optionsindice ].suProvincia=suProvincia;
    
elSel.optionsindice ].contieneProvincias=contieneProvincias;
    
elSel.optionsindice ].contieneCiudades=contieneCiudades;
}

//selecciona la opción iPos en el select elSelect
function selecciona(elSelect,iPos) { 
    
elSelect.options[iPos].selected="selected";        // para los estándares
    
elSelect.options.selectedIndex=iPos;            // a la manera IE
}

//devuelve true si el elemento elem se encuentra entre los elementos del array
Array.prototype.existe=function(elem) {
    for(var 
i=0;i<this.length;i++)
        if( 
this[i] == elem ) return true;
    return 
false;
}

//borra todas las opciones de un select cuyo valor no se encuentre entre los elementos de elArray
function dejarOpcionesExistentes(elSelect,elArray) {
    for(var 
i=0i<elSelect.options.lengthi++) {
        if( !
elArray.existeelSelect.options[i].value ) ) {
            
//borramos la opcion
            
elSelect.options[i]=null;
            
i--;    //reducimos i porque tenemos que iterar más veces (el length de las options es uno menos)
        
}
    }
}

/****************************************************************
    CREACIÓN Y RELLENADO DE LOS SELECTS
****************************************************************/

//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT");

//la función coloca en los selects creados todos los valores de los arrays, pudiendo salvar el select que se indique en los argumentos
function reiniciar_selects(conPaises,conProvincias,ConCiudades) {
    if (
conPaises==undefined || conPaises)
        
haCambiadoPais=false;
    
//eliminamos las option de los selects que procedan
    
while( (conPaises==undefined || conPaises) && selPais.options.length>)
        
selPais.options[0]=null;
    while( (
conProvincias==undefined || conProvincias) && selProv.options.length>)
        
selProv.options[0]=null;
    while( (
ConCiudades==undefined || ConCiudades) && selCiud.options.length>)
        
selCiud.options[0]=null;
    
//colocamos las opciones nuevas si procede
    
for(var i=0i<paises.lengthi++) {
        if(
conPaises==undefined || conPaises 
            
agregarOpt(selPaispaises[i], paises[i], nullnullprovincias[i].toString().split(","), ciudades[i].toString().split(",") );
        for(var 
j=0j<provincias[i].lengthj++) {
            if(
conProvincias==undefined || conProvincias )  
                
agregarOpt(selProvprovincias[i][j], provincias[i][j], inullnullciudades[i][j].toString().split(",") );
            for(
k=0k<ciudades[i][j].lengthk++) {
                if(
ConCiudades==undefined || ConCiudades ) {
                    
//cuenta regresiva para contar todas las provincias anteriores (cuantas provincias habia en los paises anteriores)
                    
var aux=i-1provinciasAnteriores=0;
                    while(
aux>=0)
                        
provinciasAnteriores+=provincias[aux--].length;
                    
agregarOpt(selCiudciudades[i][j][k], ciudades[i][j][k], iprovinciasAnteriores+";"+jnullnull);
                }
            }
        }
    }
}

var 
haCambiadoPais=false;        //elemento de control para contar las provincias al cambiar de ciudad
reiniciar_selects(true,true,true);        //todos los valores en todos los selects

//adjuntamos al documento
document.body.appendChild(selPais);
document.body.appendChild(selProv);
document.body.appendChild(selCiud);



/****************************************************************
    EVENTOS ONCHANGE PARA CADA UNO DE LOS SELECTS
****************************************************************/
selPais.onchange=function() {
    
//restablecemos provincias, ciudades
    
reiniciar_selects(false,true,true);
    
//cambiar provincias para que sólo contengan .contieneProvincias
    
var contieneProvincias=this.options[this.options.selectedIndex].contieneProvincias;
    
dejarOpcionesExistentes(selProv,contieneProvincias);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
    
haCambiadoPais=true;
}
selProv.onchange=function() {
    
//restablecemos sólo ciudades
    
reiniciar_selects(false,false,true);
    
//seleccionar el pais al que pertenece la provincia
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selCiud.onchange=function() {
    
//seleccionar el pais al que pertenece la ciudad
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//seleccionar la provincia a la que pertenece la ciudad
    
var suProvincia=this.options[this.options.selectedIndex].suProvincia;
    if(!
haCambiadoPaissuProvincia=eval( suProvincia.replace(";","+") );        //suma de las provincias de los anteriores paises más la suya
    
else suProvincia=suProvincia.split(";")[1];                                    //sólo la suya
    
selecciona(selProv,suProvincia);
}



//creamos un botón por si acaso se necesita restablecer todo:
var boton=document.createElement("INPUT");
with(boton) {
    
type="button"value="Restablecer";
    
setAttribute("onclick","reiniciar_selects(true,true,true)");        // estándar
    
boton.onclick=reiniciar_selects;                                    // IE
}
document.body.appendChild(boton);


</script>

</body>
</html> 
Para solventarlo con los mínimos cambios posibles he añadido la variable de control haCambiadoPais que es un boolean que indica lo que dice su nombre.

En la propiedad suProvincia de cada option del select ciudad en vez de guardar un único valor numérico para el caso haCambiadoPais=false como tenía antes, ahora es un string con formato "X;Y". X se encarga de contar las provincias de los paises anteriores a los que no pertenece la ciudad, Y es el número de provincia dentro del país al que pertenece la ciudad.

De manera que si haCambiadoPais=false la provincia a seleccionar será todas las de los paises anteriores (X) más las provincias de nuestro país (Y).
Si haCambiadoPais=true en el select de provincias sólo habrá las de nuestro país, luego a la provincia que hay que cambiar es únicamente Y:

Código PHP:
    if(!haCambiadoPaissuProvincia=eval( suProvincia.replace(";","+") );        //suma de las provincias de los anteriores paises más la suya
else suProvincia=suProvincia.split(";")[1];                                    //sólo la suya 
Para el botón he simplificado código y he metido las dos maneras, no sé lo correcto que será esto, pero no me da errores ni en uno ni en otro:
Código PHP:
    setAttribute("onclick","reiniciar_selects(true,true,true)");        // estándar
boton.onclick=reiniciar_selects;                                    // IE 


Bueno, me gustaría que alguien lo testeara en otros navegadores como Opera o Safari, especialmente Opera, yo no lo tengo instalado en esta máquina.


Un saludo.


PD: Que nadie intente entender el código sin estas explicaciones
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #8 (permalink)  
Antiguo 01/05/2007, 18:13
 
Fecha de Ingreso: abril-2006
Ubicación: Colombia
Mensajes: 648
Antigüedad: 18 años
Puntos: 3
Re: SELECTS dependientes con inteligencia hacia atrás

Hola, bueno, por nada, y como no, en efecto ahora si funciona a las mil maravillas en ambos exploradores, yo tampoco tengo instalado opera en este equipo pero mañana ire a un equipo que si lo tiene, asi que mirare alla y comento, saludos
__________________
Suerte.
_______________________________
"La vida es el principio de la muerte".
  #9 (permalink)  
Antiguo 18/01/2008, 19:49
Avatar de nes24  
Fecha de Ingreso: julio-2005
Mensajes: 746
Antigüedad: 18 años, 9 meses
Puntos: 3
Adaptacion De Select A Datos De Bd

Cita:
Iniciado por derkenuke Ver Mensaje
Había visto muchos sistemas para crear SELECT'S dependientes en el que al seleccionar un valor del primero, el segundo quedase condicionalmente modificado.

Lo que no he visto nunca es que si seleccionamos una opción en el tercer SELECT, se seleccionasen automáticamente las opciones en el SELECT1 y en el SELECT2 que corresponden (una especie de inteligencia-ahorro para el usuario).


Me decidí a crearlo, y tras varios intentos lo cedo para que lo pongáis a prueba y ver vuestras sugerencias:

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
title></title>
<
meta name="Author" content="derkeNuke">
</
head>

<
body>



<
script>

/****************************************************************
    ESTRUCTURA BÁSICA
****************************************************************/
var paises=["PAIS1","PAIS2","PAIS3"];
var 
provincias=[
    [
"PROVINCIA1 (p1)","PROVINCIA2 (p1)",  "PROVINCIA3 (p1)""PROVINCIA4 (p1)"], 
    [
"PROVINCIA1 (p2)""PROVINCIA2 (p2)""PROVINCIA3 (p2)""PROVINCIA4 (p2)""PROVINCIA5 (p2)""PROVINCIA6 (p2)"], 
    [
"PROVINCIA1 (p3)""PROVINCIA2 (p3)""PROVINCIA3 (p3)" ]
];
var 
ciudades=[
    [
        [
"ciud1-1-1""ciud1-1-2""ciud1-1-3""ciud1-1-4""ciud1-1-5" ],
        [
"ciud1-2-1""ciud1-2-2""ciud1-2-3""ciud1-2-4" ],
        [
"ciud1-3-1""ciud1-3-2""ciud1-3-3""ciud1-3-4" ],
        [
"ciud1-4-1""ciud1-4-2""ciud1-4-3" ]
    ],
    
    [
        [
"ciud2-1-1""ciud2-1-2""ciud2-1-3""ciud2-1-4""ciud2-1-5""ciud2-1-6""ciud2-1-7""ciud2-1-8" ],
        [
"ciud2-2-1""ciud2-2-2""ciud2-2-3""ciud2-2-4""ciud2-2-5""ciud2-2-6" ],
        [
"ciud2-3-1""ciud2-3-2""ciud2-3-3""ciud2-3-4""ciud2-3-5""ciud2-3-6" ],
        [
"ciud2-4-1""ciud2-4-2""ciud2-4-3""ciud2-4-4""ciud2-4-5""ciud2-4-6""ciud2-4-7" ],
        [
"ciud2-5-1""ciud2-5-2""ciud2-5-3""ciud2-5-4""ciud2-5-5" ],
        [
"ciud2-6-1""ciud2-6-2""ciud2-6-3""ciud2-6-4""ciud2-6-5" ]
    ],
    
    [
        [
"ciud3-1-1""ciud3-1-2""ciud3-1-3""ciud3-1-4""ciud3-1-5""ciud3-1-6""ciud3-1-7""ciud3-1-8" ],
        [
"ciud3-2-1""ciud3-2-2""ciud3-2-3" ],
        [
"ciud3-3-1""ciud3-3-2""ciud3-3-3""ciud3-3-4" ]
    ]
];


/****************************************************************
    FUNCIONES ÚTILES PARA ARRAYS Y SELECTS
****************************************************************/

//agrega un option a un select, con un par de atributos extra que nos serán útiles
function agregarOpt(elSel,txt,valor,suPais,suProvincia,contieneProvincias,contieneCiudades) {
    var 
indice=elSel.options.length;
    
elSel.optionsindice ] = new Option(txt,valor);
    
elSel.optionsindice ].suPais=suPais;
    
elSel.optionsindice ].suProvincia=suProvincia;
    
elSel.optionsindice ].contieneProvincias=contieneProvincias;
    
elSel.optionsindice ].contieneCiudades=contieneCiudades;
}

//selecciona la opción iPos en el select elSelect
function selecciona(elSelect,iPos) { 
    
elSelect.options[iPos].selected="selected";        // para los estándares
    
elSelect.options.selectedIndex=iPos;            // a la manera IE
}

//devuelve true si el elemento elem se encuentra entre los elementos del array
Array.prototype.existe=function(elem) {
    for(var 
i=0;i<this.length;i++)
        if( 
this[i] == elem ) return true;
    return 
false;
}

//borra todas las opciones de un select cuyo valor no se encuentre entre los elementos de elArray
function dejarOpcionesExistentes(elSelect,elArray) {
    for(var 
i=0i<elSelect.options.lengthi++) {
        if( !
elArray.existeelSelect.options[i].value ) ) {
            
//borramos la opcion
            
elSelect.options[i]=null;
            
i--;    //reducimos i porque tenemos que iterar más veces (el length de las options es uno menos)
        
}
    }
}

/****************************************************************
    CREACIÓN Y RELLENADO DE LOS SELECTS
****************************************************************/

//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT");

//la función coloca en los selects creados todos los valores de los arrays, pudiendo salvar el select que se indique en los argumentos
function reiniciar_selects(conPaises,conProvincias,ConCiudades) {
    
//eliminamos las option de los selects que procedan
    
while( (conPaises==undefined || conPaises) && selPais.options.length>)
        
selPais.options[0]=null;
    while( (
conProvincias==undefined || conProvincias) && selProv.options.length>)
        
selProv.options[0]=null;
    while( (
ConCiudades==undefined || ConCiudades) && selCiud.options.length>)
        
selCiud.options[0]=null;
    
//colocamos las opciones nuevas si procede
    
for(var i=0i<paises.lengthi++) {
        if(
conPaises==undefined || conPaises 
            
agregarOpt(selPaispaises[i], paises[i], nullnullprovincias[i].toString().split(","), ciudades[i].toString().split(",") );
        for(var 
j=0j<provincias[i].lengthj++) {
            if(
conProvincias==undefined || conProvincias )  
                
agregarOpt(selProvprovincias[i][j], provincias[i][j], inullnullciudades[i][j].toString().split(",") );
            for(
k=0k<ciudades[i][j].lengthk++) {
                if(
ConCiudades==undefined || ConCiudades ) {
                    
//cuenta regresiva para contar todas las provincias anteriores (cuantas provincias habia en los paises anteriores)
                    
var aux=i-1provinciasAnteriores=0;
                    while(
aux>=0)
                        
provinciasAnteriores+=provincias[aux--].length;
                    
agregarOpt(selCiudciudades[i][j][k], ciudades[i][j][k], iprovinciasAnteriores+jnullnull);
                }
            }
        }
    }
}

reiniciar_selects(true,true,true);        //todos los valores en todos los selects

//adjuntamos al documento
document.body.appendChild(selPais);
document.body.appendChild(selProv);
document.body.appendChild(selCiud);



/****************************************************************
    EVENTOS ONCHANGE PARA CADA UNO DE LOS SELECTS
****************************************************************/
selPais.onchange=function() {
    
//restablecemos provincias, ciudades
    
reiniciar_selects(false,true,true);
    
//cambiar provincias para que sólo contengan .contieneProvincias
    
var contieneProvincias=this.options[this.options.selectedIndex].contieneProvincias;
    
dejarOpcionesExistentes(selProv,contieneProvincias);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selProv.onchange=function() {
    
//restablecemos sólo ciudades
    
reiniciar_selects(false,false,true);
    
//seleccionar el pais al que pertenece la provincia
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selCiud.onchange=function() {
    
//seleccionar el pais al que pertenece la ciudad
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//seleccionar la provincia a la que pertenece la ciudad
    
var suProvincia=this.options[this.options.selectedIndex].suProvincia;
    
selecciona(selProv,suProvincia);
}



//creamos un botón por si acaso se necesita restablecer todo:
var boton=document.createElement("INPUT");
with(boton) {
    
type="button"value="Restablecer"onclick=reiniciar_selects;
}
document.body.appendChild(boton);


</script>

</body>
</html> 
Sé que es largo, pero lo he comentado y separado cada función para que sea lo más legible posible, no parece demasiado complicado si uno lo mira tranquilamente.

Probado en: FF2, IE6.

Opiniones por favor


Un saludo.
hola, intenter porcerca de 5 hras adaptar la informacion de la sigiente tabla al sistema de selects (el de este post)y no pude, alguien que por favor me idique comoo puedo hacerlo.
La cuestion es muy sencilla el dato2 depende del 1 y el tres del 2 como en el select

dato 1 dato 2 dato 3


CONTABILIDAD * *
CONTABILIDAD --------EVA *
FINANZAS * *
RESIDUO * *
FINANZAS -------------MONEDA------------- INTERNACIONAL *
FINANZAS --------------MONEDA -------------INTERNACIONAL ECONOMIA LOCAL
GERENCIA------------------------- * *
GERENCIA---------------ORDEN *
GERENCIA------------ ORDEN ------------BANCARIOS
ECONOMIA------------GASTOS *------------
ECONOMIA------------GASTOS------------ MEXICO
MOTIVACION------------ESTUDIANTES *
MOTIVACION------------ESTUDIANTES------------PERU
CONTABILIDAD------------EVA------------NORMATIVA
CONTABILIDAD------------EVA------------FUNDAMENTOS
CONTABILIDAD------------EVA------------FORTALESAS
CONTABILIDAD------------EVA------------NUEVAS NORMAS
CONTABILIDAD------------EVA------------INGESTIONES
CONTABILIDAD------------EVA------------TRANSMISIONES


Yo creo que mi problema radica en que como los datos depender deuna base de datos noseria sudiciente con solo whiles y forearchsi no que hay formasde hacerlo con funciones mas sencillas las cualesno conosco.

Última edición por nes24; 18/01/2008 a las 19:52 Razón: reedicion
  #10 (permalink)  
Antiguo 19/01/2008, 11:30
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SELECTS dependientes con inteligencia hacia atrás

Hola nes24:

Si los datos los tienes en tu base de datos, únicamente tienes que volcar todos los datos a los tres arrays iniciales (paises, provincias, ciudades). Es así de simple. Si el problema es cómo pasar un array de PHP a javascript, se ha resuelto varias veces por aquí.

Sin embargo, si tu base de datos es muy extensa, este método no es recomendable, ya que el documento podría resultar de demasiado tamaño para ser accesible a conexiones lentas. Lo que se suele utilizar entonces es AJAX, para una vez cambiada la opción del primer select, preguntarle a la base de datos qué tendría que ir en el segundo select.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #11 (permalink)  
Antiguo 20/01/2008, 18:19
Avatar de nes24  
Fecha de Ingreso: julio-2005
Mensajes: 746
Antigüedad: 18 años, 9 meses
Puntos: 3
Re: SELECTS dependientes con inteligencia hacia atrás

gracias, salvo que tengo los datos en una base de datos de esta forma;

PAIS CIUDAD HABITANTES
Colombia bogota 6 millones(hab)
peru lima 8 millones (hab)
.........................

Lo inte3nte por mas de 3 horas pero he tenido problemas con los [ ] y con otras cosas mas..... de casualidad no tenes un codigo que ponga los datos desde una Base de datos....????

quisiera publicar el codigo que hice pero es todo un fiasco y ademas no sirvio... gracias
  #12 (permalink)  
Antiguo 21/01/2008, 05:19
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SELECTS dependientes con inteligencia hacia atrás

Hola de nuevo nes24.

No, no tengo ese código que pasa de base de datos a javascript, pero creo que es un tema que ya no tiene nada que ver con el de los selects, es algo independiente. Si tienes dudas de cómo hacer eso busca en el foro, se ha tratado en algún post. Si tienes más dudas lo conveniente sería crear un nuevo hilo.

Lo que tienes que hacer es recorrer todos los registros de la base de datos de la siguiente manera:
Recorremos la tabla de paises (ordenados alfabéticamente) y la escribimos en el array de javascript paises, sin complicaciones.
Recorremos la tabla de ciudades (ordenándola por paises alfabéticamente) y lo imprimimos en el array de javascript provincias. Ten en cuenta que tendrás que tener dos bucles anidados aquí: Uno para recorrer los paises y otro para recorrer las ciudades.
El tercer paso es análogo: Recorrer la tabla habitantes (¿es que hay dos cantidades de habitantes para una ciudad?) e imprimirla en ciudades. Tendrás que tener tres bucles anidados: para pais, ciudad y habitantes.
La estructura PHP sería mas o menos así:
Código PHP:
// imprimo declaraciones de javascript: paises, provincias y ciudades
echo "var paises = new Array();\n";
echo 
"var provincias = new Array();\n";
echo 
"var ciudades = new Array();\n";
for(
$n=0$n<$nPaises$n++) {
    
// añado el pais
    
echo "paises[".$n."] = '".$BDD["paises"][$n]."';\n";
    for(
$m=0$m<$mCiudades$m++) {
        
// añado las ciudades
        
echo "provincias[".$n."][".$m."] = '".$BDD["ciudades"][$o]."';\n";
        for(
$o=0$o<$oHabitantes$o++) {
            
// añado los habitantes
            
echo "ciudades[".$n."][".$m."][".$o."] = '".$BDD["habitantes"][$o]."';\n";
        }
        
    }

Pero antes tendrás que obtener los datos de tu base de datos de manera ordenada para que no se forme un follón...
Con ello habremos imprimido en el documento todo el javascript necesario para llenar los arrays paises, provincias y ciudades, si no me he equivocado demasiado. Podrás verlo en el código fuente de tu documento PHP una vez procesado.



Espero que te sirva así, un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 18:52.