Programación Web y Scripting > PHP
Menus Desplegables Dinamicos
tuxie:
:huh: Hola a todos.
Tengo que hacer un formulario de registro de usuarios con ciertos datos y con 3 menus desplegables, uno de pais, otro de estado (o provincia) y otro de ciudad, en el cual si cambio el pais, me cambie el menu desplegable de estado y si elijo un estado de ese pais me cambie el menu desplegable a las ciudades correspondientes a dicho estado. debido a que se manejan todos los paises y es mucha información, guarde los nombres en una BD en mysql con las siguientes tablas y campos:
tabla pais:
campos: id_pais, nombre_pais
tabla estado:
campos: id_estado, id_pais, nombre_estado
tabla ciudad:
campos: id_ciudad, id_estado, nombre_ciudad
como hago esto mezclando php, mysql y javascript?
agradezco de antemano cualquier colaboracion que se me brinde para resolver este problema. :unsure:
vichofeo:
hola yp tambien tuve el mismo problema, alle dos soluciones en internet, al aplicarlas note que importa mucho la cantidad de datos que tendra cada combo box, y la segunda opcion, y eso lo malo que no tengo el URL de donde lo obtuve por eso de los virus en mi compu, consistente en manejar Iframe.
a continuacion te muestro lo que hice yo :rolleyes: solo que a diferencia tuya yo considere Departamento, Provincia y Localidad, por la geopolitica de mi pais
--- Código: Text ---<script language="javascript"><?php /**************simulacion***************/$query="select * FROM provincia ";$result =$db->execute($query)//mysql_query ($query, $link); ?>// FUNCION DE COMBO BOX COMBINADO function sublist(inform, selecteditem){inform.provincia.length = 0 <?php$count= 0;$y=0;while ($row=$result->fetchRow())//mysql_fetch_array($result)){?> x = <?=trim($y);?>; prov = new Array();provincia_desc = "<?=$row['NOMBRE_PROVINCIA']; ?>";provincia_cod_index = "<?=$row['DEPARTAMENTO_ID']; ?>";provincia_cod = "<?=$row['PROVINCIA_ID']; ?>";prov[x,0] = provincia_desc;prov[x,1] = provincia_cod_index;prov[x,2] = provincia_cod;if (prov[x,1] == selecteditem) {var option<?=trim($count); ?> = new Option(prov[x,0], prov[x,2]);inform.provincia.options[inform.provincia.length]=option<?=trim($count)?>;}<?php$count = $count + 1;$y = $y + 1;}?>}</SCRIPT> :blink: los combos en el html se llaman "DEPARTAMENTO, PROVINCIA y LOCALIDAD" en esa jerarquia
ENTONCES en el combo Departamento asegurate de obtener el ID del departamento (en este caso) y el nombre, es decir el <option value="ID_departamento">nombre departamento</option>
y para activar el contenido del combo PROVINCIA utiliza el evento onchange
en el select departamento llamando a la funcion hecha en java script
algo asi
--- Código: Text ---<select size="1" id="departamento" name="departamento" onChange = "javascript:sublist(this.form, departamento.value);"> <option>seleccione un Dpto</option><?php $query2="select * from departamento"; $result2=$db->Execute($query2); //mysql_query($query2, $link); while ($raw=$result2->fetchRow())//mysql_fetch_array($result2)){?><option value="<?=$raw['DEPARTAMENTO_ID'];?>"> <?=$raw['NOMBRE_DEPARTAMENTO']?></option> <?php} ?> </SELECT> y el combo de provincia quedaria algo asi
--- Código: Text --- <SELECT id="provincia" name="provincia" size="1" ><Option value="vacio"> provincia</option><option> </option> <option> </option> <option> </option> <option> </option></SELECT> para localidad haces lo mismo solo que contruyes la funcion con la misma carcteristica que para provincia y lo llamas desde el combo provincia que seria la segunda en la jerarquia
:unsure: esta es una muy buena opcion, pero el incoveniente que yo tenia es que mis localidades pasaban los 1000 registros por provincia, y no es que seamos un pais grande solo que aqui, todos manejan para su control, sus propios criterios de localidad, :blink: esto generaba una pagina de de aproximadamente 2 M, eso, impedia el dinamismo del javascript asi que alle otra opcion con iframes
:lol: lo malo de todo esto es que no tengo los link de los creadores de esta idea, la anterior solo es una adaptacion de de asp a php que ya lo realizaron
y lo del iframe solo tengo el comprimido y no su direccion del creador
en fin espero que te sirva
Slimer:
Hola:
Hecha un vistazo al foro de JavaScript porque por allí tambien tienes mas opciones de solucion a ese mismo problema.
Un saludo
Slimer
tuxie:
muchisimas gracias por sus sugerencias. ya resoví el problema espero alguna vez poder devolverles el favor. :hola: Bytes!
JuliusRisi:
despues de adaptar el código a mis tablas y a unos scripts que he añadido me surge un problema.
Escribo el código y me explico despues:
--- Código: Text ---<script language=JavaScript><!-- Beginoldvalue = "";function passText(passedvalue) { if (passedvalue != "") { var totalvalue = passedvalue+"\n"+oldvalue; document.form.zona.value = totalvalue; oldvalue = document.form.zona.value; }}function passText2(passedvalue) { if (passedvalue != "") { var totalvalue = passedvalue+"\n"+oldvalue; document.form.cimas.value = totalvalue; oldvalue = document.form.cimas.value; }}// End --></SCRIPT><script language="javascript"><?php$sql = "SELECT ZonaN, Cima, ZonaNombre FROM trackcatalogo "; $result = $db->sql_query($sql);?>// FUNCION DE COMBO BOX COMBINADOfunction sublist(form, selecteditem){form.cimas1.length = 0<?php$count= 0;$y=0;while ($row = $db->sql_fetchrow($result)){?>x = <?=trim($y);?>;prov = new Array();cimas_desc = "<?=$row['Cima']; ?>";cimas_cod_index = "<?=$row['ZonaN']; ?>";cimas_cod = "<?=$row['Cima']; ?>";prov[x,0] = cimas_desc;prov[x,1] = cimas_cod_index;prov[x,2] = cimas_cod;if (prov[x,1] == selecteditem) {var option<?=trim($count); ?> = new Option(prov[x,0], prov[x,2]);form.cimas1.options[form.cimas1.length]=option<?=trim($count)?>;}<?php$count = $count + 1;$y = $y + 1;}?> if (selecteditem == 'Otras') {newZona = ""; while (newZona == ""){newZona=prompt ("Por favor indica el nombre de la zona.", "");} if (newZona != null) {passText(newZona) }}}</SCRIPT><select class=campo size="1" id="zonas1" name="zonas1" onChange = "javascript:sublist(this.form, zonas1.value);"><option selected>Selecciona Zona</option><option value="Otras">OTRAS ZONAS</option><?php$query2="select ZonaN, ZonaNombre from trackzonas order by ZonaNombre ";$result2 = $db->sql_query($query2);while ($raw = $db->sql_fetchrow($result2)){?><option value="<?=$raw['ZonaN'] ?>"> <?=$raw['ZonaNombre']?></option><?php}?></SELECT><br><br><FONT face="Arial, Helvetica, Sans Serif" size=2>Zona a añadir:</FONT><BR><TEXTAREA class=text name=zona rows=5 cols=20></TEXTAREA> <br> <SELECT class=campo id="cimas1" name="cimas1" size="1" ><Option value="vacio">Cumbres de la Zona</option><option value="otras">OTRAS CIMAS</option></SELECT><br><INPUT class=boton onclick=passText2(this.form.cimas1.options[this.form.cimas1.selectedIndex].value); type=button value="Añadir a la lista"> <TEXTAREA class=text name=cimas rows=5 cols=20></TEXTAREA> <br>
Bueno, con este IF . . .
--- Citar ---if (selecteditem == 'Otras') {
newZona = "";
while (newZona == ""){
newZona=prompt ("Por favor indica el nombre de la zona.", "");
}
if (newZona != null) {
passText(newZona)
}
--- Fin de la cita ---
del primer combo me sale un casillero donde meter un nuevo dato en caso de que no esté en la lista que presento.
El problema radica en que si eligo de la lista una zona, en el 2º combo me sale el listado de la base de datos dependiendo que zona haya eligido, pero . . . . ¿como consigo meter un OPTION más con el VALOR 'otras'?
:whistling:
Gracias de antemano.
Navegación
[#] Página Siguiente
Ir a la versión completa