Categories: Recursos, Tutoriales - Tags: ajax, autosuggest
Yo personalmente las pocas veces que he implementado un Auto Suggest o caja de sugerencias en mis proyectos he utilizado AJAX Auto Suggest V2.0. No es que haya probado muchos , pero en su día este fue el que más me convencio por su facilidad de uso y de personalización.
Para utilizarlo primero debemos incluir sus archivos:
1
2
3
| <link type="text/css" rel="stylesheet" href="autosuggest_inquisitor.css">
<script src="bsn.AutoSuggest_2.1.3.js" type="text/javascript"></script> |
<link type="text/css" rel="stylesheet" href="autosuggest_inquisitor.css">
<script src="bsn.AutoSuggest_2.1.3.js" type="text/javascript"></script>
Crear un campo de texto y asignarle un Id:
1
2
|
<input type="text" style="width: 200px; color: rgb(204, 204, 204);" id="materiales_input" name="materiales" autocomplete="off"> |
<input type="text" style="width: 200px; color: rgb(204, 204, 204);" id="materiales_input" name="materiales" autocomplete="off">
Luego definimos algunas opciones y creamos el objeto autosuggest:
1
2
3
4
5
6
7
8
9
10
11
| function autosuggest(){
var options = {
script: "get_materiales.php?limit=6&",//página la cual recibirá la llamada AJAX
varname: "materiales",// nombre de la variable que contendra el valor escrito
json:false,//Podemos elegir JSON o XML
maxresults:10,//Un máximo de resulados para mostrar
timeout:9999,//numero en milisegundos antes de que se cierre la lista de valores sugeridos
noresults:'Ingresar nuevo material a la base de datos' //valor que muestra en caso de no encontrar resultados
};
var as = new bsn.AutoSuggest('materiales_input', options); //creamos el objeto AutoSuggest
} |
function autosuggest(){
var options = {
script: "get_materiales.php?limit=6&",//página la cual recibirá la llamada AJAX
varname: "materiales",// nombre de la variable que contendra el valor escrito
json:false,//Podemos elegir JSON o XML
maxresults:10,//Un máximo de resulados para mostrar
timeout:9999,//numero en milisegundos antes de que se cierre la lista de valores sugeridos
noresults:'Ingresar nuevo material a la base de datos' //valor que muestra en caso de no encontrar resultados
};
var as = new bsn.AutoSuggest('materiales_input', options); //creamos el objeto AutoSuggest
}
Para más opciones consultar la página del autor.
Llamamos a la función cuando cargue la página:
1
| <body onload="autosuggest();"> |
<body onload="autosuggest();">
Por último creamos un archivo PHP que devuelva los resultados de búsqueda(en este caso XML) para que se muestren en las sugerencias.
get_materiales.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| <?
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Fecha del pasado
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // siempre modificado
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache"); // HTTP/1.0
include_once('config/db.php');
$conn=get_db_conn();
$input=utf8_decode(cleanQuery($_GET['materiales']));
$query='SELECT * FROM categoria_materiales WHERE nombreMaterial LIKE \'%'.$input.'%\'';
$materiales=mysql_query($query,$conn);
if (isset($_REQUEST['json']))
{
header("Content-Type: application/json" );
echo "{\"results\": [";
$arr = array();
while ($row=mysql_fetch_assoc($materiales))
{
$arr[] = "{\"id\": \"".$row['idCatMaterial']."\", \"value\": \"".$row['nombreMaterial']."\", \"info\": \"\"}";
}
echo implode(", ", $arr);
echo "]}";
}
else
{
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?><results>";
while ($row=mysql_fetch_assoc($materiales))
{
echo "<rs id=\"".$row['idCatMaterial']."\" info=\"\">".$row['nombreMaterial']."</rs>";
}
echo "</results>";
}
?> |
<?
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Fecha del pasado
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // siempre modificado
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache"); // HTTP/1.0
include_once('config/db.php');
$conn=get_db_conn();
$input=utf8_decode(cleanQuery($_GET['materiales']));
$query='SELECT * FROM categoria_materiales WHERE nombreMaterial LIKE \'%'.$input.'%\'';
$materiales=mysql_query($query,$conn);
if (isset($_REQUEST['json']))
{
header("Content-Type: application/json" );
echo "{\"results\": [";
$arr = array();
while ($row=mysql_fetch_assoc($materiales))
{
$arr[] = "{\"id\": \"".$row['idCatMaterial']."\", \"value\": \"".$row['nombreMaterial']."\", \"info\": \"\"}";
}
echo implode(", ", $arr);
echo "]}";
}
else
{
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?><results>";
while ($row=mysql_fetch_assoc($materiales))
{
echo "<rs id=\"".$row['idCatMaterial']."\" info=\"\">".$row['nombreMaterial']."</rs>";
}
echo "</results>";
}
?>
Explicando get_materiales.php:
Formato XML:
1
2
3
4
5
| <results>
<rs id="1" info="Cheshire">Foobar</rs>
<rs id="2" info="">Foobarfly</rs>
<rs id="3" info="">Foobarnacle</rs>
</results> |
<results>
<rs id="1" info="Cheshire">Foobar</rs>
<rs id="2" info="">Foobarfly</rs>
<rs id="3" info="">Foobarnacle</rs>
</results>
Formato JSON:
1
2
3
4
5
| { results: [
{ id: "1", value: "Foobar", info: "Cheshire" },
{ id: "2", value: "Foobarfly", info: "" },
{ id: "3", value: "Foobarnacle", info: "Essex" }
] } |
{ results: [
{ id: "1", value: "Foobar", info: "Cheshire" },
{ id: "2", value: "Foobarfly", info: "" },
{ id: "3", value: "Foobarnacle", info: "Essex" }
] }
Como anotacíon en mi caso al enviar el formulario compruebo si el material ingresado existe en la base de datos y sino existe lo agrego. Por ese motivo en noresults muestro el mensaje de “Añadir a la base de datos”.Para ello hago lo siguiente:
1
2
3
4
5
6
7
8
9
10
| <?
include_once('db.php');
$conn=get_db_conn();
if($_POST['materiales']!=''){
$material=cleanQuery($_POST['materiales']);
$existe=mysql_query("SELECT * FROM materiales WHERE nombreMaterial ='$material'",$conn);
if (mysql_num_rows($existe) == 0) mysql_query("INSERT INTO materiales (nombreMaterial) VALUES ('$material')",$conn);
}
?> |
<?
include_once('db.php');
$conn=get_db_conn();
if($_POST['materiales']!=''){
$material=cleanQuery($_POST['materiales']);
$existe=mysql_query("SELECT * FROM materiales WHERE nombreMaterial ='$material'",$conn);
if (mysql_num_rows($existe) == 0) mysql_query("INSERT INTO materiales (nombreMaterial) VALUES ('$material')",$conn);
}
?>
Con todo esto tendriamos el autosuggest o caja de sugerencias funcionando a la perfección.
Pueden ver un EJEMPLO FUNCIONANDO
O tambien DESCARGARSE EL CÓDIGO
Un saludo a todos, espero sus comentarios!
Últimos Comentarios