As I have commented before, sqlform.grid has a particular way of
searching. Its combination of search and 'queries' is very powerful.
However the search does not really work in the way a casual web user
might expect. If entered - Bob Dylan - in the search box and clicked
search, then one get 'invalid query'. I eventually worked out how to
change the search widget, so as I believe this is currently
undocumented I thought I would share it. The semantics I have chosen
for search are that it will return records where any of the specified
fields (fielda and fieldb in the example) contain all of the words in
the search field. i.e if the search term is -Bob Dylan- it will return
records that have both Bob and Dylan in the fieldA or both in fieldb.
Define a search function that creates the form and a function that
does the search
def search_form(self,url):
form = FORM('',
INPUT(_name='search_text',_value=request.get_vars.search_text,
_style='width:200px;',
_id='searchText'),
INPUT(_type='submit',_value=T('Search')),
INPUT(_type='submit',_value=T('Clear'),
_onclick="jQuery('#search_text').val('');"),
_method="GET",_action=url)
return form
def search_query(tableid,search_text,fields):
words= search_text.split(' ') if search_text else []
query=tableid<0#empty query
for field in fields:
new_query=tableid>0
for word in words:
new_query=new_query&field.contains(word)
query=query|new_query
return query
Then in the function that has the sqlform.grid call, before the call
add
search_text=request.get_vars.search_text
query=search_query(
db.tablea.id,search_text,
[db.tablea.fielda,db.tablea.fieldb])
...
# the query could now be combined with other queries.
table=SQLFORM.grid(query, search_widget=search_form........)
return dict(table=table)