Ver Mensaje Individual
  #6 (permalink)  
Antiguo 15/10/2010, 12:11
Avatar de silvanha
silvanha
 
Fecha de Ingreso: marzo-2006
Ubicación: En mi mundo de sueños
Mensajes: 653
Antigüedad: 18 años, 9 meses
Puntos: 65
Respuesta: Llenar un select a partir de la opcion elegida en otro select

Es completamente necesario que sea con JavaScript?????, porque digo hay muchas maneras una de ellas es con AJAX y te facilita la vida de manera impresionante.. porque no te metes en líos con la comunicación entre JavaScript y PHP, porque por ende AJAX ya tiene esa parte..

te traigo un ejemplo, lo he hecho con miles de cosas, este en especifico lo hace con estados y municipios:

Cargo el estado:
Código PHP:
Ver original
  1. <select disabled="disabled" name="cboestado" id="cboestado" onchange="cargaMunicipios(this.id);">
  2.                   <option value="0">Seleccione Estado</option>
  3.                 <?php $consulta = $db->listadatos(($db->consulta("*","catalogo_estados")));
  4.                 foreach($consulta as $datos){  
  5.                  echo "<option value='".$datos->Id_Estado."'>".htmlentities($datos->Nombre_Estado)."</option>";
  6.                 } ?>
  7.                 </select>

Y aparte dentro del código, pongo un select vacio, que será el que se carge con respecto al estado seleccionado..
Código HTML:
Ver original
  1. <select disabled="disabled" name="cbomunicipio" id="cbomunicipio">
  2.                     <option value='0'>Seleccione Estado</option>
  3.                 </select>

En el primer select uso unos metodos de conexión a la BD, y tanta cosa, pero es lo mismo que tu has hecho con las publicaciones, el caso de los municipios sería el de las ediciones, en fin, el evento que uso para cargar los municipios si ves, es en un OnChange, al que llamo cargamunicipios , y este es un metodo de AJAX.

Aqui tengo el Objeto AJAX, que se crea y después la función de AJAX que hace el trabajo de cargar los datos:

Código Javascript:
Ver original
  1. function nuevoAjax(){
  2.     /* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por
  3.     lo que se puede copiar tal como esta aqui */
  4.     var xmlhttp=false;
  5.     try{
  6.         // Creacion del objeto AJAX para navegadores no IE
  7.         xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
  8.     }
  9.     catch(e){
  10.         try{
  11.             // Creacion del objet AJAX para IE
  12.             xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  13.         }
  14.         catch(E){
  15.             if (!xmlhttp && typeof XMLHttpRequest!='undefined') xmlhttp=new XMLHttpRequest();
  16.         }
  17.     }
  18.     return xmlhttp;
  19. }
  20.  
  21. function cargaMunicipios(idSelectOrigen){
  22.     // Obtengo el select que el usuario modifico
  23.     var selectOrigen=document.getElementById(idSelectOrigen);
  24.     // Obtengo la opcion que el usuario selecciono
  25.     var opcionSeleccionada=selectOrigen.options[selectOrigen.selectedIndex].value;
  26.     // Si el usuario eligio la opcion "Elige", no voy al servidor y pongo los selects siguientes en estado "Selecciona estado..."
  27.     if(opcionSeleccionada==0)
  28.     {
  29.         var selectActual=null;
  30.         if(idSelectOrigen == "cboestado")
  31.             selectActual=document.getElementById("cbomunicipio");
  32.         selectActual.length=0;
  33.         var nuevaOpcion=document.createElement("option");
  34.         nuevaOpcion.value=0;
  35.         nuevaOpcion.innerHTML="Seleccione Estado";
  36.         selectActual.appendChild(nuevaOpcion); 
  37.         selectActual.disabled=true;
  38.     }
  39.     // Compruebo que el select modificado no sea el ultimo de la cadena
  40.     else{
  41.         if(idSelectOrigen == "cboestado")
  42.             var selectDestino=document.getElementById("cbomunicipio");
  43.         // Creo el nuevo objeto AJAX y envio al servidor la opcion seleccionada del select origen
  44.         var ajax=nuevoAjax();
  45.         ajax.open("GET", "../llena_municipios.php?opcion="+opcionSeleccionada+"&select="+idSelectOrigen, true);
  46.         ajax.onreadystatechange=function()
  47.         {
  48.             if (ajax.readyState==1)
  49.             {
  50.                 // Mientras carga elimino la opcion "Selecciona Opcion..." y pongo una que dice "Cargando..."
  51.                 selectDestino.length=0;
  52.                 var nuevaOpcion=document.createElement("option");
  53.                 nuevaOpcion.value=0;
  54.                 nuevaOpcion.innerHTML="Cargando...";
  55.                 selectDestino.appendChild(nuevaOpcion);
  56.                 selectDestino.disabled=true;   
  57.             }
  58.             if (ajax.readyState==4)
  59.             {
  60.                 selectDestino.parentNode.innerHTML=ajax.responseText;
  61.             }
  62.         }
  63.         ajax.send(null);
  64.     }
  65. }

Si te das cuenta la funcion cargaMunicipios, es la que llama a otro archivo ahora si en PHP, que será en donde hagas la consulta,
Código PHP:
Ver original
  1. llena_municipios.php?opcion="+opcionSeleccionada+"&select="+idSelectOrigen
nota que le envió el select en el que debe cargar y el estado seleccionado.. y en este último archivo genero la consulta:

Código PHP:
Ver original
  1. if($selectOrigen == "cboestado")
  2.     echo "<select name='cbomunicipio' id='cbomunicipio'>";
  3. echo '<option value="0">Seleccione Municipio</option>';
  4.     $consulta = $db->listadatos(($db->consulta("*","catalogo_municipio","Id_Estado=".$opcionSeleccionada)));
  5.     foreach($consulta as $datos){  
  6.          echo "<option value='".$datos->Id_Municipio."'>".htmlentities($datos->Nombre_Municipio)."</option>";
  7.     }
  8. echo "</select>";

Verifico que sea el combo de Estados el seleccionado y mando a imprimir XD (inclusive lo puedes hacer con el número de combos que necesites.. ) y ya.. solito funciona.. son varios archivos pero nada del otro mundo =)

suerte!, si tienes dudas ahí ando!! =)

PD: Me agarraste con tiempo para pegarte todo jajajajaja saludos! ;)
__________________
●•· No hay nada imposible..
●•· Vico-X.. ;)