I had a quick look at the slice, am I right to conclude that contrary
to the pengoworks autocomplete this one is more generic. When I use
the Pengoworks autocomplete in my model I have to define:
db.address.city.widget=lambda
self,value:INPUT(_type='text',_id='city',_class='ac_input',_name='city',requires=self.requires)
... in web2py_ajax.html:
jQuery('#city').autocomplete('/init/handlers/cityAC',{maxItemsToShow:
12});
... in a controller called handlers:
def cityAC():
q=''
if request.vars:
q=request.vars.q
if not q:
return q
rows=db(db.city.name.like('%s%
%'%q.capitalize())).select(db.city.name,orderby=db.city.name)
r=''
for row in rows:
r='%s%s\n'%(r,row.name)
return r
... and I have to repeat this for every field I need autocomplete
functionality for.
When I use the one described in the slice, I would put this in db.py:
def autocomplete_widget(f,v):
import uuid
d_id = "autocomplete-" + str(uuid.uuid4())[:8]
wrapper = DIV(_id=d_id)
inp = SQLFORM.widgets.string.widget(f,v)
rows = f._db(f._table['id']>0).select(f,distinct=True)
itms = [str(t[f.name]) for t in rows]
scr = SCRIPT('var data= "%s".split("|");jQuery("#%s
input").autocomplete(data);' % \
("|".join(itms),d_id))
wrapper.append(inp)
wrapper.append(scr)
return wrapper
... which would work both on my laptop and on the webfaction servers!?
... put this in the handlers controller:
def get_items():
itms = []
if request.vars.q and \
request.vars.table and \
request.vars.field:
q = request.vars.q
f = request.vars.field
t = request.vars.table
fld = db[t][f]
rows = db(fld.upper().like(q.upper()
+"%")).select(fld,distinct=True)
itms = [str(t[f]) for t in rows]
return '\n'.join(itms)
... and put this in the table definition:
db.address.city.widget=autocomplete_widget
Is that right?
Kind regards,
Annet.