Pues bien, estuve haciendo pruebas con selects dependientes en AJAX y PHP. Me salió esto.
Se ve bonito, ..., por fuera. Por dentro, puede mejorarse, sin duda.
Son 3 selects. Básicamente hago 3 condicionales que checan qué ha elegido el usuario. Es decir, si acaba de elgir continente, país o provincia. El script que se ejecuta al elegir país añade sólo unas líneas al script de continente. Y el script que se ejecuta al elegir provincia añade sólo unas líneas más al de país. La cosa es que hay código repetido, y no veo la forma de evitar repetirlo.
¿Es posible eliminar los 3 condicionales, de forma que sólo haya un bloque de líneas (que no se repitan ) que devuelvan tal o cual respuesta según la elección del usuario?
Porque, digamos, elijo el continente americano. La respuesta asíncrona me devuelve los países de este continente mediante un echo, y con este echo se termina la petición. Así, no tengo forma de hacer nada más, digamos otro bucle (o lo que sea) para llenar el select de provincias, si es que el usuario eligió un país en vez de un continente. No busco evitar que termine la petición al hacer echo (entiendo que eso no se puede), la idea es no repetir código. Pero el echo no me deja!
Código PHP:
if ( ($continente!="NULL") && ($pais=="NULL") ) {
foreach ($arrayPaises as $claveContinente=>$paises) {
if($claveContinente == $continente) {
foreach($paises as $clavePais=>$provincias) {
$htmlPais .= '<option id="'.$clavePais.'" value="'.$clavePais.'">'.$clavePais.'</option>';
}
$arrayRespuestas = array (
"htmlPais" => $htmlPais,
"statusAPP" => "Respuesta AJAX ok para paises"
);
break;
}
}
echo json_encode($arrayRespuestas);
}
else if ( ($continente!="NULL") && ($pais!="NULL") && ($provincia=="NULL") ) {
foreach ($arrayPaises as $claveContinente=>$paises) {
if($claveContinente == $continente) {
foreach($paises as $clavePais=>$provincias) {
$htmlPais .= '<option id="'.$clavePais.'" value="'.$clavePais.'">'.$clavePais.'</option>';
}
foreach($paises as $clavePais=>$provincias) {
if( $clavePais == $pais) {
foreach($provincias as $claveProvincia=>$city) {
$htmlProvincia .= '<option id="'.$city.'" value="'.$city.'">'.$city.'</option>';
}
$arrayRespuestas = array (
"paisElegido" => $pais,
"htmlPais" => $htmlPais,
"htmlProvincia" => $htmlProvincia,
"statusAPP" => "Respuesta AJAX ok para ciudades"
);
break;
}
}
break;
}
}
echo json_encode($arrayRespuestas);
}
else if ( ($continente!="NULL") && ($pais!="NULL") && ($provincia!="NULL") ) {
foreach ($arrayPaises as $claveContinente=>$paises) {
if($claveContinente == $continente) {
foreach($paises as $clavePais=>$provincias) {
$htmlPais .= '<option id="'.$clavePais.'" value="'.$clavePais.'">'.$clavePais.'</option>';
}
foreach($paises as $clavePais=>$provincias) {
if( $clavePais == $pais) {
foreach($provincias as $claveProvincia=>$city) {
$htmlProvincia .= '<option id="'.$city.'" value="'.$city.'">'.$city.'</option>';
if ($city == $provincia) {
$ciudadElegida = $city;
}
}
$arrayRespuestas = array (
"provinciaElegida" => $ciudadElegida,
"paisElegido" => $pais,
"htmlPais" => $htmlPais,
"htmlProvincia" => $htmlProvincia,
"statusAPP" => "Respuesta AJAX ok para ciudades"
);
break;
}
}
break;
}
}
echo json_encode($arrayRespuestas);
}