Ok - no replies so I went about this myself and am trying to come up with a solution.

First off, the reasons why the default search doesn't work for me.
-As in the example below, sometimes I want to provide a custom drop-down for users to select from to limit the records displayed
-Date values are not handled by the default search
-Sometimes want an auto-complete field available in my search criteria

So, to make this work I looked at the code in SQLFORM.grid related to the searching. What I want to do is remove the default searching altogether, including the query-building wizard (which I believe in other environments is very powerful).

In looking at this code it occurred to me that I should be able to replace the default search_widget with my own form definition and then look at the values returned to my controller and build the necessary query to pass to SQLFORM.smartgrid. What I found was that this work very easily. The only problem is that I want the default search to not appear while my custom search form does appear. The problem is that when I pass searchable=False to my grid that neither my custom search nor the default search mechanism appear. When I pass searchable=True, both of them appear. I'd like an option where I can pass my own search form via search_widget but not display the default search fields.

I believe this could be done relatively easily by adding the following to SQLFORM.grid:

            form = FORM(
search_widget and search_widget([f for f in table if f.readable]) or '',
                _method="GET",_action=url())
            console.append(form)

Starting after line 1649 in the latest (updated this morning) sqlhtml.py. Right after the line that reads: subquery = None

Using the following SQLFORM.smartgrid call:

    grid = SQLFORM.smartgrid(db.assetType, constraints=constraints,
                             columns=columns,
                             details=False, orderby=orderby,
                             csv=False, search_widget=searchForm,
                             searchable=None,
                             paginate=15, maxtextlength=45)

searchForm is defined in the same controller as:

def searchForm(self):
    form = FORM('',
        LABEL('Name:', _for='asset_name'),
        INPUT(_name='asset_name',_value=request.get_vars.asset_name,
              _id='web2py_asset_name'),
        INPUT(_type='submit',_value=T('Search')),
        INPUT(_type='submit',_value=T('Clear'),
              _onclick="jQuery('#web2py_asset_name').val('');"),
        _method="GET",_action='',
        _id='assetSearchForm')

    return form

Now I can provide my own custom search widget providing I handle the query building myself. Thoughts? Warning - my code works for my situation but is not very pretty.

I would like this to be considered for a patch. Any further input would be greatly appreciated.

    -Jim


On 11/1/2011 8:38 AM, Jim Steil wrote:
Hi

I'm using the SQLFORM.grid extensively in a rewrite of my old TurboGears application. A common thing that I provided in my previous version of the application was to present to the user different filtering options for lists. Here is a screen shot of it:



For my needs, the new SQLFORM.grid search_widget doesn't quite fit. I'd like to provide my own search widget. In looking through sqlhtml.py at the search_widget code it would appear that I could provide my own widget. I'm just wondering if anyone else has done this yet and has any code or advice they'd like to share.

Thanks for any input!

    -Jim



<<image/png>>

Reply via email to