Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/01/2016, 15:56
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: div autocompletable y dependiente jquery UI

Vas a tener que hacer la carga de las fuentes de datos de forma dinámica, es decir, al momento de escribir y seleccionar las opciones y no antes.

Un ejemplo suponiendo que la tabla de la base de datos tiene dos campos "strNombre" y "strApellido":
Código HTML:
Ver original
  1. Nombre: <input type="text" id="nom" />
  2. Apellido: <input type="text" id="ape" />

Código Javascript:
Ver original
  1. function autoNom(valor){
  2.     $("#nom").autocomplete({
  3.         source: "tuArchivo.php?apellido=" + (valor || ""),
  4.         select: function(event, ui){ //Se ejecuta al selecciona una opción
  5.             autoApe(ui.item.value);
  6.         }
  7.     });
  8. }
  9.  
  10. function autoApe(valor){
  11.     $("#ape").autocomplete({
  12.         source: "tuArchivo.php?nombre=" + (valor || ""),
  13.         select: function(event, ui){ //Se ejecuta al selecciona una opción
  14.             autoNom(ui.item.value);
  15.         }
  16.     });
  17. }
  18.  
  19. $(document).ready(function(){
  20.     autoNom(); //Se ejecuta al cargar la página
  21.     autoApe(); //Se ejecuta al cargar la página
  22.     $("#nom").on("input", function(){ //Se ejecuta al cambiar el valor del campo
  23.         autoApe($(this).val());
  24.     });
  25.     $("#ape").on("input", function(){ //Se ejecuta al cambiar el valor del campo
  26.         autoNom($(this).val());
  27.     });
  28. });

Código PHP:
Ver original
  1. $conexion = new mysqli('servidor', 'usuario', 'contraseña', 'base de datos');
  2. if ($conexion->connect_errno) exit($conexion->connect_errno . ': ' . $conexion->connect_error);
  3. $term = $conexion->real_escape_string(strip_tags(trim($_GET['term'])));
  4. if (isset($_GET['apellido'])){ //Si se busca por nombre
  5.     $query = "SELECT strNombre FROM tabla WHERE strNombre LIKE '%$term%'";
  6.     if (strlen($_GET['apellido'])){ //Si se ha seleccionado un apellido
  7.         $apellido = $conexion->real_escape_string(strip_tags(trim($_GET['apellido'])));
  8.         $query .= " AND strApellido = '$apellido'";
  9.     }
  10. }
  11. if (isset($_GET['nombre'])){ //Si se busca por apellido
  12.     $query = "SELECT strApellido FROM tabla WHERE strApellido LIKE '%$term%'"; 
  13.     if (strlen($_GET['nombre'])){ //Si se ha selecciona un nombre
  14.         $nombre = $conexion->real_escape_string(strip_tags(trim($_GET['nombre'])));
  15.         $query .= " AND strNombre = '$nombre'";
  16.     }
  17. }
  18. $result = $conexion->query($query) or exit($conexion->error);
  19. if ($result->num_rows){
  20.     $respuesta = [];
  21.     while ($row = $result->fetch_row()){
  22.         $respuesta[] = ['value' => utf8_encode($row[0])]; //utf8_encode() para eñes y tildes
  23.     }
  24.     $result->free();   
  25.     $return = json_encode($respuesta);
  26. }
  27. else{
  28.     $return = json_encode(['No hay resultados']);  
  29. }
  30. echo $return;
  31. $conexion->close();

Cuando cargue la página, se modifique el valor de cualquiera de ambos campos de texto o se seleccione una de las opciones de la lista del autocompletado, se ejecutará una o ambas funciones, según sea el caso. Dichas funciones, "autoNom" y "autoApe", registran en los campos de texto al widget autocomplete, con la salvedad de que cada uno enviará un valor distinto para realizar la búsqueda. El widget utiliza la variable term de forma interna para realizar la búsqueda, por lo que cuando busquemos las coincidencias en la base de datos, hay que hacerlo utilizando dicho nombre. El evento select dispara una función que se ejecutará cuando se seleccione una de las opciones de la lista de autocompletado, mientras que el evento input ocurre cuando el valor de un campo de texto es cambiado.

Cuando la fuente de datos es externa, como en este caso, el widget acepta un objeto JSON en donde cada elemento debe estar asociado a un índice de nombre "value"; de esta manera, se podrán visualizar en la lista de autocompletado. Para elaborado el objeto JSON, solo tienes que crear un array que irás llenando con los valores encontrados en la base de datos y, finalmente, solo te quedará parsearlo a JSON e imprimirlo.

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 26/01/2016 a las 17:42 Razón: Mejoras