Necesito hacer un combo anidado, pero este tiene la particularidad de en vez al seleccionar uno, aparezca un combo, sino que necesito que se me desplieguen los datos en 3 selectores multiples distintos, me explico mejor con una imagen.
O sea, en el combo elijo que tipo de reloj es y en los selectores multiples de abajo me tienen que aparecer cada tarea perteneciente a cada área según el tipo de mecanismo elegido, algunas tareas son comunes y otras no, por eso esta forma.
El tema lo tengo parcialmente avanzado, ya que conozco como pasar de un combo a otro y entiendo algo el proceso que hace. Este es el código que tengo (claramente no es mio en la parte JS):
Tengo un html que dice lo siguiente (No está completo, pero tiene lo que se necesita):
Código HTML:
Ver original
Luego el JS en cuestión base_xml.js":
Código Javascript:
Ver original
var xmlHttp; function traerBases(str) { if (str == '0' ) { document.getElementById('datosBase').options.length = 0; return false; } xmlHttp = GetXmlHttpObject(); if (xmlHttp == null) { alert("Your browser does not support AJAX!"); return; } var url = "relqtz_xml.php"; url = url + "?q=" + str; url = url + "&sid=" + Math.random(); xmlHttp.onreadystatechange = stateChanged; xmlHttp.open("GET", url, true); xmlHttp.send(null); document.getElementById('ajax_indicator').style.visibility = 'visible'; } function stateChanged() { if (xmlHttp.readyState == 4) { document.getElementById('ajax_indicator').style.visibility = 'hidden'; if (xmlHttp.status != 200) { alert('Ocurrio un error! Server: ' + xmlHttp.statusText); return false; } // limpiar combo-box document.getElementById('datosBase').options.length = 0; // obtener objeto con estructura del XML var xmlDoc = xmlHttp.responseXML.documentElement; // obtener cantidad total de elementos con etiqueta <comuna> var totalElementos = xmlDoc.getElementsByTagName("rquarzo").length; for (var i = 0; i < totalElementos; i++) { // obtener elemento comuna posicion i var rquarzo = xmlDoc.getElementsByTagName("rquarzo")[i]; // obtener valores del atributo "id" y del texto var idElemento = rquarzo.attributes.getNamedItem("id").value; var textoElemento = rquarzo.firstChild.nodeValue // agregar nueva opcion al combo-box document.getElementById('datosBase').options.add(new Option(textoElemento, idElemento)); } } } function GetXmlHttpObject() { var xmlHttp = null; try { // Firefox, Opera 8.0+, Safari xmlHttp = new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } } return xmlHttp; }
Y finalmente el PHP donde hago la consulta a la base de datos donde se encuentra.
Código PHP:
Ver original
<?php // sleep(1); $q = $_GET["q"]; include('includes/conexion.php'); $sql = ("SELECT id_tareas, tarea FROM tareas_esp INNER JOIN tareas_area_trabajo ON tareas_esp.id_tareas = tareas_area_trabajo.tareas_id_tareas INNER JOIN area_trabajo ON tareas_area_trabajo.area_trabajo_id_area_trabajo = area_trabajo.id_area_trabajo INNER JOIN tipo_maquina_area ON area_trabajo.id_area_trabajo = tipo_maquina_area.id_area INNER JOIN tipos_maquinas ON tipo_maquina_area.id_tipo_maquina = tipos_maquinas.id_tipos_maquinas WHERE id_tipo_maquina = $q AND id_area = 1 "); // Esto es clave, siempre será $q, pero no siempre será id_area=1, ya que cambia dependiendo del area a la cual pertenece el grupo de tareas. echo '<?xml version="1.0" encoding="ISO-8859-1"?><rquarzos>'; echo '<rquarzo id="' . $row[0] . '">' . $row[1] . '</rquarzo>'; } echo "</rquarzos>"; } ?>
Entonces lo que hace el código que en onchange="traerBases(this.value)" llama a la función traerBases que lo que hace es pasar el $q que es el id respectivo del combo y luego ejecuta el query que se le asigna. Y se agregan los items con XML.
Entonces tengo que tener 4 archivos php y 4 archivos js distintos, pero que se llame a la misma función desde el onchange
Sino juntar todas las funciones en una sola y que haga las 4 consultas en una (¿Es lo más logico?)
En el fondo, ¿Cómo puedo juntar las 4 consultas correspondientes para que actuen en conjunto, algún IF o algo asi?
Espero que se me haya comprendido, si hace falta algún dato con respecto a la base de datos, me dicen (Que no creo ya que el query ya está hecho).
Saludos y gracias de antemano.
PD: este tema lo había hecho con anterioridad, pero ahora lo hago denuevo con mas claridad y base.