I found an hole in typeahead updater... typeahead updater seems to be bit it by a trigger event only when there is something that have been selected... But if for instance someone select something the hidden field that get submitted is updated with the id if the record, but the hidden field is not updated if the field is empty (for some reason : USERS) after been filled once... So the id of the previous selected record stay there and the form submit correctly if there is no other validators that trigger up!!
I googled a lot about this hole and typeahead, maybe I don't have the right keywords or the issue have not been identified since bootstrap typeahead as only recently get the updated to support key/value field. Richard On Mon, Mar 18, 2013 at 9:02 PM, Richard <[email protected]>wrote: > Hello, > > Wrote this and it may be handy for others in the meantime there is a > better integration of autocomplete bootstrap typeahead : > > # Widget function > def autocomplete_typeahead_widget(f, v, **kwargs): > table_name = f._tablename > field_name = f.name > field_requires = f.requires > field_value = v > options = {'_data-provide':'typeahead', '_autocomplete': 'off'} > options.update(kwargs) > return CAT( > INPUT(_type="text", _class="string", _id="%s_%s_ac" % (table_name, > field_name), **options), > INPUT(_type="hidden", _id="%s_%s" % (table_name, field_name), > _name=field_name, _value=field_value, requires=field_requires), > SCRIPT("""$(function() { > $('#%(table_name)s_%(field_name)s_ac').typeahead( > { source: function (query, process) { > $.get('%(url)s.json', > { q: query }, > function (data) { > labels = [] > mapped = {} > $.each(data.options, function (i, item) { > mapped[item.option] = item.id > labels.push(item.option) > }) > > process(labels) > } > ) > }, > updater:function(item){ > $('#%(table_name)s_%(field_name)s').val(mapped[item]); return item} > }) > });""" % {'url':URL(c='test', > f='autocomplete_typeahead_widget_json_feed'), 'table_name':table_name, > 'field_name':field_name}) > ) > > # Generating JSON function > def autocomplete_typeahead_widget_json_feed(): > rows=db(db.table.field>0).select() > options = [] > for i,row in enumerate(rows): > options.append({'option': row.field, 'id': row.id}) > from gluon.contrib import simplejson > return simplejson.dumps({'options': options }) > > # Init of the widget > db.other_table.select_field.widget = autocomplete_typeahead_widget > > or > > db.other_table.select_field.widget = lambda field, value: > autocomplete_typeahead_widget(field, value, MORE_ARGS) > > Enjoy! > > Richard > > -- > > --- > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.

