Re: [Catalyst] Paging thru a complex POSTed search -- HOWTO?
i forgot form method=POST 2010/6/3 Oleg Pronin syber@gmail.com: form id=myform input type=hidden name=... value=.../ ... any number of params input type=hidden name=page value=[%page%]/ ... a href=# onclick=$('#myform input[name=page]').val(2); $('#myform').submit() Page 2 /a /form 2010/6/2 w...@serensoft.com w...@serensoft.com: Short version: Using [% c.req.uri_with({ page = pager.next_page }) %] is fine for a simple single-field search (where the form uses GET instead of POST)... but how do we PAGE through (and/or cache) a multi-field form search that uses POST? Long version: This is probably already a posted recipe somewhere, but I haven't had much luck finding answers via googling combinations of 'perl catalyst post cache pager' ... so pointers are welcome: # Form has lots of fields, we'll just nab a sample handful from the POST: my @terms = map{s/\s+//; $_} split /,/, $form-field('keywords'); # I know, but it's just an example, this isn't a robust search-field parser :) my %search = ( asof = { # date field asof must be within date range '=' = $form-field('start_date'), '=' = $form-field('end_date'), }, terms = [ # field terms can contain any of the keywords map { +{ -like = '%' . $_ . '%' } } @terms ], ); my $page = $c-req-param('page'); $page = 1 if ! defined( $page ) || ! $page || $page =~ /\D/; my $result = $c-model('Package')-search( \%search, {page=$page} ); $c-stash-{results} = $result; $c-stash-{pager} = $result-pager; Then, in the template: a href=[% c.req.uri_with({page = pager.prev_page}) %]Prev/a a href=[% c.req.uri_with({page = pager.next_page}) %]Next/a That works well for simple GET forms where the ?field=val syntax is used in the URI. What's the approach for paging the (cached?) query results from a complex-field POSTed search form? I'm imagining a two-table DB solution where we cache the found row-id's in table `cached_search_row` and link that to `cached_search`, then have the cached_search.id mentioned in the URI. I'm hoping there's a better way someone has already conjured up that doesn't have all the drawbacks of this approach that we haven't even thought of... Thanks in advance! -- will trillich It's only by saying 'no' that you can concentrate on the things that are really important. -- Steve Jobs -- will trillich It's only by saying 'no' that you can concentrate on the things that are really important. -- Steve Jobs ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/ ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/
Re: [Catalyst] Paging thru a complex POSTed search -- HOWTO?
form id=myform input type=hidden name=... value=.../ ... any number of params input type=hidden name=page value=[%page%]/ ... a href=# onclick=$('#myform input[name=page]').val(2); $('#myform').submit() Page 2 /a /form 2010/6/2 w...@serensoft.com w...@serensoft.com: Short version: Using [% c.req.uri_with({ page = pager.next_page }) %] is fine for a simple single-field search (where the form uses GET instead of POST)... but how do we PAGE through (and/or cache) a multi-field form search that uses POST? Long version: This is probably already a posted recipe somewhere, but I haven't had much luck finding answers via googling combinations of 'perl catalyst post cache pager' ... so pointers are welcome: # Form has lots of fields, we'll just nab a sample handful from the POST: my @terms = map{s/\s+//; $_} split /,/, $form-field('keywords'); # I know, but it's just an example, this isn't a robust search-field parser :) my %search = ( asof = { # date field asof must be within date range '=' = $form-field('start_date'), '=' = $form-field('end_date'), }, terms = [ # field terms can contain any of the keywords map { +{ -like = '%' . $_ . '%' } } @terms ], ); my $page = $c-req-param('page'); $page = 1 if ! defined( $page ) || ! $page || $page =~ /\D/; my $result = $c-model('Package')-search( \%search, {page=$page} ); $c-stash-{results} = $result; $c-stash-{pager} = $result-pager; Then, in the template: a href=[% c.req.uri_with({page = pager.prev_page}) %]Prev/a a href=[% c.req.uri_with({page = pager.next_page}) %]Next/a That works well for simple GET forms where the ?field=val syntax is used in the URI. What's the approach for paging the (cached?) query results from a complex-field POSTed search form? I'm imagining a two-table DB solution where we cache the found row-id's in table `cached_search_row` and link that to `cached_search`, then have the cached_search.id mentioned in the URI. I'm hoping there's a better way someone has already conjured up that doesn't have all the drawbacks of this approach that we haven't even thought of... Thanks in advance! -- will trillich It's only by saying 'no' that you can concentrate on the things that are really important. -- Steve Jobs -- will trillich It's only by saying 'no' that you can concentrate on the things that are really important. -- Steve Jobs ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/ ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/