So you're really not even using the grid search then.  You're controlling 
the entire search form and placing it on the page in your view, right?

-Jim

On Saturday, September 29, 2012 9:52:25 PM UTC-5, alex wrote:
>
> I found the way to bypass the problem.
>
> I have changed the call to SQLFORM.grid from:
>
> table=SQLFORM.grid(query, search_widget=search_form, fields=fields)
>
> to:
>
> table=SQLFORM.grid(qry, fields=fields, field_id=db.t.id,searchable=False) 
>
> and I have added a normal form for performing searches
>
>     ...
>  form = SQLFORM.factory(Field('search'))
>     if form.process().accepted:
>         qry=search_query(form.vars.search) 
>     ...
>
>
> So, all together:
>
> default.py
> def search_query(search_text): 
>     words= search_text.split(' ') if search_text else [] 
>     query = db.t.id<0
>     queries=[]
>     queries.append(db.t.id>0)
>     for word in words: 
>         key,value=word.split(':') if ':' in word else ['',word]
>         if key=='a': 
>             queries.append(db.t.a.contains(value))
>         elif key=='b':
>             queries.append(db.t.b.contains(value))
>         else:
>             queries.append(db.t.a.contains(value)|db.t.b.contains(value))
>
>     if len(queries) > 0:
>         query = (reduce(lambda a,b:(a&b),queries))
>     return query
>
>
> def index():
>     qry=db.t.id<0
>     form = SQLFORM.factory(Field('search'))
>     if form.process().accepted:
>         qry=search_query(form.vars.search) 
>     fields=[db.t.a, db.t.b]
>     table=SQLFORM.grid(qry, fields=fields, field_id=db.t.id,searchable=
> False) 
>     return locals()
>
>
> index.html
> {{extend 'layout.html'}}
> {{=form}}
> {{=table}}
>
>
>
>
>
> On Friday, September 28, 2012 2:15:31 PM UTC+9, alex wrote:
>>
>> I have this table
>>
>> db.define_table('t',
>>     Field('a', type='string'),
>>     Field('b', type='string'),
>>     )
>>
>> db.t.insert(a='US', b='Washington')
>> db.t.insert(a='US', b='Rochester')
>> db.t.insert(a='US', b='Los Angeles')
>> db.t.insert(a='US', b='Minneapolis')
>>
>> Now I want to search the items in a grid with a custom search box. I 
>> would like to input in the search box the name of the fields and the value 
>> I am searching for in this way:
>>
>> a:s b:och b:er
>>
>> Meaning: find all the record where field a contains "s" and field b 
>> contains 'och' and field b contains 'er'
>>
>> Copying from previous posts of this group, I have now this:
>>
>> default.py
>> def search_form(self,url): 
>>     form = FORM('', 
>>       INPUT(_name='keywords', _value=request.get_vars.keywords, 
>>         _style='width:200px;', 
>>         _id='keywords'), 
>>         INPUT(_type='submit',_value=T('Search')), 
>>         INPUT(_type='submit',_value=T('Clear'), 
>>         _onclick="jQuery('#keywords').val('');"), 
>>         _method="GET",_action=url) 
>>     return form 
>>
>> def search_query(search_text): 
>>     words= search_text.split(' ') if search_text else [] 
>>     query = db.t.id<0
>>     queries=[]
>>     queries.append(db.t.id>0)
>>     for word in words: 
>>         key,value=word.split(':') if ':' in word else ['',word]
>>         if key=='a': 
>>             queries.append(db.t.a.contains(value))
>>         elif key=='b':
>>             queries.append(db.t.b.contains(value))
>>         else:
>>             queries.append(db.t.a.contains(value)|db.t.b.contains(value))
>>     if len(queries) > 0:
>>         query = reduce(lambda a,b:(a&b),queries)
>>     return query
>>
>> def index():
>>     search_text=request.get_vars.keywords 
>>     query=search_query(search_text) 
>>     fields=[db.t.a, db.t.b]
>>     table=SQLFORM.grid(query, search_widget=search_form, fields=fields) 
>>     return locals()
>>
>> index.html
>> {{extend 'layout.html'}}
>> {{=table}}
>>
>> Now, if in the search box I type 
>>
>> a:s
>> The grid is empty and the answer is: *No records found*
>> the query shown is : ((t.id > 0) AND (t.a LIKE '%s%'))
>>
>> a:s a:s
>> The grid returns all the record of US correctly but it writes* **Invalid 
>> query* above the grid
>> the query shown is : (((t.id > 0) AND (t.a LIKE '%s%')) AND (t.a LIKE 
>> '%s%'))
>>
>> a:s b:e
>> same as above, the grid returns all the record correctly but it writes 
>> *Invalid 
>> query* above the grid
>> the query shown is : (((t.id > 0) AND (t.a LIKE '%s%')) AND (t.b LIKE 
>> '%e%'))
>>
>> What am I doing wrong?
>>
>>

-- 



Reply via email to