YUI Autocomplete AJAX Select Drowdown with ID
+++++++++++++++++++++++++++++++++++++++++++++++++
:Posted: 2007-10-19 10:42
:Tags: Pylons, Mako, JavaScript
The YUI toolkit comes with a very flexible autocomplete control but a common
requirement is for an autocomplete control that submits the ID associated with
a text value rather than the text value itself, much like a select field
submits the option value, not the contents the user selects from a drop down
list.
Luckily this is fairly easy to achieve using a ``forceSelection`` option, a
hidden field, and a custom ``itemSelectEvent`` handler.
First setup the imports as described on the `YUI AutoComplete
`_ page::
Now let's set up the data structure in a Pylons controller action which the YUI
component will access to populate the find as you type select dropdown. You
could write similar code for Rails or PHP, it doesn't have to be Pylons. Notice
that the ``@jsonify`` decorator converts the Python data structure we return to
valid JSON::
@jsonify
def get_data(self):
return {
"ResultSet": {
"totalResultsAvailable":"100",
"totalResultsReturned":2,
"firstResultPosition":1,
"Result": [
{
"ID": "897",
"Title":"foo",
"Summary":"... When foo' is used in connection with bar' it has generally traced...",
"Url":"http:\/\/www.catb.org\/~esr\/jargon\/html\/F\/foo.html",
"ModificationDate":1072684800,
"MimeType":"text\/html"
},
{
"ID": "492",
"Title":"Foo Fighters",
"Summary":"Official site with news, tour dates, discography, store, community, and more.",
"Url":"http:\/\/www.foofighters.com\/",
"ModificationDate":1138521600,
"MimeType":"text\/html"
}
]
}
}
Now we need to write the code to generate the autocomplete control. YUI uses an
existing text field as the autocomplete field and this will contain whatever
text is looked up. Our application requires the corresponding ID so we need a
hidden field to hold that value. The hidden field should have the name you want
the ID to be submitted as, the text field can have any name because it doesn't
contain the data the application needs. YUI also needs a container ``
``
which it populates with the results. Ours is called ``myContainer``.
Here's some HTML to achive this::
Now let's add some JavaScript. This can go after the HTML above::
The first line sets up a schema, the first item of which specifies where the
actual results are in the data structrue returned (in this case they are in the
``Result`` list of the ``ResultSet`` dictionary), the subsequent entries specify
values within each result which might be displayed in the control.
Test this example by entering ``foo`` into the field. It works as expected
returning two options and allowing you to select one but the hidden
``myInput_id`` field doesn't get populated.
.. image :: ../2007/10/yui_autocomplete.png
:alt: YUI autocomplete FAYT
To populate the hidden field we need to create a callback function and
subscribe it to the autocomplete control's ``itemSelectEvent``. Add the
following code at the end of the JavaScript above, just before the
```` tag::
function fnCallback(e, args) {
YAHOO.util.Dom.get("myInput_id").value = args[2][1];
}
myAutoComp.itemSelectEvent.subscribe(fnCallback);
Now, when an item is selected from the autocomplete control, ``fnCallback``
gets called with two arguments. The first is an event object ``e`` and the
second is a list of arguments `described here
`_.
These are:
``oSelf``
The AutoComplete instance.
``elItem``
The selected