Como usar AJAX Auto Suggest V2.0

Publicado en May 16, 2010 by Damian

AJAX Autosuggest v2

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:

<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:

<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:

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:

<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:

<?
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:

<results>
    <rs id="1" info="Cheshire">Foobar</rs>
    <rs id="2" info="">Foobarfly</rs>
    <rs id="3" info="">Foobarnacle</rs>
</results>


Formato JSON:

{ 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:

<?
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!

Comparte este artículo:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • BarraPunto
  • Bitacoras.com
  • email
  • Meneame
  • MySpace
  • Print
  • Technorati
  • Twitter

Links Sponsors

Tags: ,

Categoría: Recursos, Tutoriales

Comments (11)

 

  1. nacho says:

    XD Muchas gracias. eres el amo

  2. nacho says:

    sabes como podría meter otra variable??

    mira toy rellenando inputs automaticamente según lo elegido.. pongo el código por si alguien quiere hacerlo:

    function autosuggest(){

    var options = {

    script: "get_materiales.php?limit=6&",

    varname: "materiales",

    json:false,

    maxresults:10,

    timeout:9999999,

    noresults:'Ingresar nuevo material a la base de datos',

    callback: function (obj) {

    document.getElementById('precio1').value = obj.pvp;

    document.getElementById('iva').value = obj.iva;

    }

    };

    var options_xml = {

    script: function (input) { return "get_materiales.php?input="+input+"&precio1="+document.getElementById('precio1').value; },

    varname:"precio"

    };

    var as3 = new bsn.AutoSuggest('materiales1', options);

    var as_xml = new bsn.AutoSuggest('precio1', options_xml);

    var as_xml = new bsn.AutoSuggest('iva1', options_xml);

    }

    y estos serian los input del formulario:

    como consulta estoy usando la misma de tu código de arriba lo único que cambio es meter un poco de texto mas en el echo llamado pvp para saber el precio de ese articulo.

    echo "".$row['descripcion']."";

    total que me dice que no que indefinido el caso es que si en vez de pvp uso info si funciona.

  3. nacho says:

    por el tema de la variable de iva no le hagais ningún caso que esta a medio la que si esta supuestamente terminada es la de pvp

  4. nacho says:

    solucionado.

    en bsn.AutoSuggest_2.1.3.js en la linea 332 ( por que estoy usando xml ) añado la variable que quiero en este caso pvp obteniendo el dato de pvp

    this.aSug.push( { 'id':results[i].getAttribute('id'), 'value':results[i].childNodes[0].nodeValue, 'info':results[i].getAttribute('info'), 'pvp':results[i].getAttribute('pvp') } );

    es de una forma muy sucia a ver si a ti se te ocurre algo mas limpio o que no obligue a modificar ese archivo.

  5. nacho says:

    ahora si consigo hacer que calcule el total de la linea dinamicamente y luego el total de todas las lineas ya soy el rey

  6. nacho says:

    la demo del codigo funcionando esta aqui:

    http://www.factusyn.es/Scripts/Archivos/Demos/Factusyn5/...

    podeis buscar co o nex o sill un puñao de cosas

  7. nacho says:

    a ver si me puedes guiar donde poner +newID que para variar en la segunda linea del formulario dinamico ya no funciona

    ahora estoy en jquery.addfield.js

    //adding autosugges property

    var options = {

    script: "get_materiales.php?limit=6&",

    varname: "materiales",

    json:false,

    maxresults:10,

    timeout:9999999,

    noresults:'Ingresar nuevo material a la base de datos',

    callback: function (obj) {

    document.getElementById('precio'+newID).value = obj.pvp;

    document.getElementById('iva'+newID).value = obj.iva;

    }

    };

    var precio = {

    script: function (input) { return "get_materiales.php?input="+input+"&precio="+document.getElementById('precio'+newID).value; },

    varname:"precio"

    };

    var impuestos = {

    script: function (input) { return "get_materiales.php?input="+input+"&iva="+document.getElementById('iva'+newID).value; },

    varname:"iva"

    };

    var as3 = new bsn.AutoSuggest('materiales'+newID, options);

    var precio = new bsn.AutoSuggest('precio'+newID, precio);

    var impuestos = new bsn.AutoSuggest('iva'+newID, impuestos);

    }

  8. Damian says:

    Tu error es que repites los id´s.

    //Asigno nuevo id al primer campo input dentro del div y le borro cualquier valor que tenga asi no copia lo ultimo que hayas escrito.(igual que antes no es necesario tener un id)

    $newClone.children("input").eq(0).attr("id",'materiales'+newID).val('');

    Si estas usando esa función tendrias que hacer lo mismo para el campo iva y precio.

  9. nacho says:

    genial.

    ahora voy a pelearme con la suma

  10. nacho says:

    hay un fallo en el codigo que puse arriba. aparte que ahora lo tengo un poco mas limpio:

    var options = {

    script: "get_materiales.php?limit=6&",

    varname: "materiales",

    json:false,

    maxresults:10,

    timeout:9999999,

    noresults:'Ingresar nuevo material a la base de datos',

    callback: function (obj) {

    document.getElementById('precio1').value = obj.pvp;

    document.getElementById('iva1').value = obj.iva;

    document.getElementById('codigo1').value = obj.cod;

    }

    };

    var masop = {

    script: function (input) {

    return "get_materiales.php?input="+input+"&precio1="+document.getElementById('precio1').value;

    return "get_materiales.php?input="+input+"&codigo1="+document.getElementById('codigo1').value;

    return "get_materiales.php?input="+input+"&iva1="+document.getElementById('iva1').value;

    },

    varname:"masop"

    };

    var as3 = new bsn.AutoSuggest('materiales1', options);

    }

    si os fijais al final antes metia un autosuggest para impuestos, precio etc etc:

    var as3 = new bsn.AutoSuggest(‘materiales’+newID, options);

    var precio = new bsn.AutoSuggest(‘precio’+newID, precio);

    var impuestos = new bsn.AutoSuggest(‘iva’+newID, impuestos);

    si hacemos esto al escribir algo en ese campo nos saldrá el autosuggest. y yo por lo menos no es lo que quería. asi que esas 2 lineas fuera y solo dejo la de var as3……

    también están unidos los auto rellenados de inputs y definidos con otro nombre ( posiblemente esto se podria quedar mas limpio pero para ser el primero que hago ta monisimo ). así es como estaba:

    var precio = {

    script: function (input) { return “get_materiales.php?input=”+input+”&precio=”+document.getElementById(‘precio’+newID).value; },

    varname:”precio”

    };

    var impuestos = {

    script: function (input) { return “get_materiales.php?input=”+input+”&iva=”+document.getElementById(‘iva’+newID).value; },

    varname:”iva”

    };

    y asi como queda:

    var masop = {

    script: function (input) {

    return "get_materiales.php?input="+input+"&precio1="+document.getElementById('precio1').value;

    return "get_materiales.php?input="+input+"&codigo1="+document.getElementById('codigo1').value;

    return "get_materiales.php?input="+input+"&iva1="+document.getElementById('iva1').value;

    },

    varname:"masop"

    };

    ala espero que a alguien le sirva para algo

Leave a Reply