Ver en ASP.Net
En esta ocasión voy a mostrarles como utilizar la función Autocompletar de jQuery utilizando PHP, MySQL y JSON.
Vale la pena comentar que me costó trabajo migrar este código desde Asp.Net, debido a unas, casi insignificantes, diferencias en la forma de tratar la función $.ajax de jQuery. Si se dan el tiempo de revisar el tutorial en ASP.Net se darán cuenta a lo que me refiero. Aún así, me he asegurado de hacer el ejercicio lo mas claro y fácil posible. Ya me he encargado de pulir el código, de tal manera que sea sencillo escalarlo segun la creatividad de cada quien. Ahora si,... ¡Manos a la obra!
En mi servidor MySQL tengo una base de datos (schema) llamada "ejemplos" con una tabla llamada "ubicaciones" con los siguientes datos:
Lo primero que hay que hacer es agregar una página PHP llamada "jquery-autocomplete.php", la cual tendría el siguiente código base:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
// put your code here
?>
</body>
</html>
Nota importante: Ten cuidado de seguir cada detalle de la manera mas exacta posible. Este código base va a cambiar mucho durante el proceso.A continuación, vamos a agregar varias referencias de estilos y javascript. Modificamos el head de nuestro documento para que quede así:
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" />
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
</head>
Ahora modificaremos la sección body, agregando dos cajas de texto (input), una llamada "txtBuscar" y otra "txtValor":
<body>
<form id="form1">
<div class="container-fluid">
<h1>Autocompletar jQuery con PHP</h1>
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<input id="txtBuscar" placeholder="Texto a buscar..." type="text" class="form-control" />
</div>
</div>
</div>
<div class="row">
<div class="col-sm-3">
<div class="form-group">
<label>Valor Seleccionado:</label>
<input id="txtValor" placeholder="0" type="text" class="form-control" />
</div>
</div>
</div>
</div>
</form>
</body>
Nota importante: Debido a que estamos utilizando "bootstrap" el código está un poco extenso.Justo debajo del código anterior, agregaremos un script:
<body>
<form id="form1">
...
</form>
<script type="text/javascript">
$("#txtBuscar").autocomplete({
source: function (request, response) {
/*Aquí se configura el origen de datos*/
$.ajax({
type: 'POST',
url: "autocomplete.php?functionToCall=BuscarLugar",
data: {textoBuscar: String(request.term)},
dataType: "json",
async: false,
success: function (result) {
response(result);
}
});
},
search: function () {
/*Este evento sucede mientras se escribe algo en el objeto txtBuscar*/
// Condicionar a menos 3
// caracteres en la búsqueda
var term = this.value;
if (term.length < 3) {
return false;
}
},
focus: function () {
/*Este evento sucede cuando el objeto txtBuscar obtiene el foco*/
// Evitar que el valor se inserte cuando
// el TextBox obtenga el foco
return false;
},
select: function (event, ui) {
/*Este evento sucede cuando se selecciona uno de los resultados*/
// Asignar el valor al objeto txtBuscar
this.value = ui.item.value;
// Mostrar el ID en el objeto txtValor
$("#txtValor").val(ui.item.id);
return false;
}
});
</script>
</body>
Ahora, por favor, agrega un archivo PHP llamado "autocomplete.php". Este será el encargado de generar la información que va a mostrarse por el plugin.Lo primero que haremos será agregar unas instrucciones que nos ayudarán en caso de que cometamos algún error. Agregamos las siguientes líneas:
error_reporting(E_ALL & ~E_DEPRECATED);
ini_set("display_errors", "1");
Muy bien. En todos mis tutoriales, trato de utilizar clases; este ejercicio no es la excepción. La función "autocomplete" de jQuery requiere que existan dos datos en el resultado JSON. Estos datos deben estar identificados con una propiedad id y value. Con la finalidad de crear un JSON bien estructurado, agregamos una clase llamada "JsonResult", la cual tendrá las dos propiedades necesarias. El código de la clase es el siguiente:
class JsonResult {
public $id;
public $value;
}
Seguido de esto, agregamos una función llamada "BuscarLugar", la cual hará la consulta a la base de datos y generará un JSON con el resultado de la búsqueda, escribimos el siguiente código:
function BuscarLugar($textoBuscar) {
$result = array();
$cnn = new mysqli("127.0.0.1", "root", "P@ssword", "ejemplos");
/* verificar la conexión */
if (mysqli_connect_errno()) {
printf("Conexión fallida: %s\n", mysqli_connect_error());
exit();
}
$query = $cnn->stmt_init();
$query = $cnn->prepare("select id_ubicacion, nombre from ubicaciones where nombre like concat('%', ?,'%')");
$query->bind_param("s", $textoBuscar);
$query->execute();
$id_ubicacion = 0;
$nombre = "";
$query->bind_result($id_ubicacion, $nombre);
while ($query->fetch()) {
$json_item = new JsonResult();
$json_item->id = $id_ubicacion;
$json_item->value = $nombre;
array_push($result, $json_item);
}
/* cerrar la conexión */
$query->close();
$cnn->close();
//Generar Json
echo json_encode($result);
}
Para finalizar, necesitamos agregar un código que nos ayude a procesar las peticiones a este documento PHP, agregamos las siguientes líneas:
if (isset($_GET["functionToCall"]) && !empty($_GET["functionToCall"])) {
switch ($_GET["functionToCall"]) {
case "BuscarLugar":
if ($_POST) {
BuscarLugar($_POST["textoBuscar"]);
}
break;
}
}
¡Ahora vamos a hacer unas pruebas!Si escribimos al menos tres caracteres, se nos mostrarán los resultados encontrados:
Si seleccionamos uno de los resultados su value se establece en el objeto "txtBuscar" y su id en "txtValor":
No hay comentarios:
Publicar un comentario