<div dir="ltr">Please check the gist, there's errors in my reply.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 15, 2014 at 5:25 PM, Jacques Lareau <span dir="ltr"><<a href="mailto:jack.lareau@gmail.com" target="_blank">jack.lareau@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Here is how I do it. Check the gist for better formatting.<br><br><a href="https://gist.github.com/jacqueslareau/1e9dcc04d416e1216161" target="_blank">https://gist.github.com/jacqueslareau/1e9dcc04d416e1216161</a><br><br></div>status_ok is because it's an API. You can use the value returned in a template instead.<br><br>------------------------<br><br>get '/' => sub {<br><br>    my $rows             = params->{rows} // 10;<br>    my $page             = params->{page} // 1;<br>    my $keyword         = params->{keyword};<br>    my $sort_direction     = 'desc';<br>    my $sort_by         = 'id';<br>    <br>    # make sure to validate parameters<br>    <br>    # build your where from your parameters<br>    my %where;<br>    $where{description} = { -like => "%$keyword%" } if defined $keyword;<br><br>    my $things = rset('Project')->search(\%where, { <br>        page     => $page, <br>        rows     => $rows, <br>        order_by => { '-desc' . $sort_direction => $sort_by },<br>    });<br>    <br>    my @results;<br>    while ( my $thing = $things->next ) {<br>        push @results, {<br>            id             => $thing->id,<br>            description => $thing->description<br>        };<br>    }<br>    <br>    status_ok({ <br>        results => \@results,<br>        pagination => { <br>            total    => $projects->pager->total_entries, <br>            rows     => $rows,<br>            page     => $page <br>        }<br>    });<br><br>}<br><br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 15, 2014 at 5:14 PM, breno <span dir="ltr"><<a href="mailto:garu@cpan.org" target="_blank">garu@cpan.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div><div><div>Hey John!<br><br></div>First of all, if you're doing a website search, I would recommend against "like" on a database - it gets really slow really fast. Instead you should try something made for full text search like Elasticsearch.<br><br>Going back to your question: in terms of paging with Dancer and Dancer::Plugin::DBIC, this is what you could do:<br><br>----------------8<-----------------<br></div>get '/search' => sub {<br></div><div>     # what the user is searching: (e.g.: /search?q=whatever)<br></div>    my $query = param('q');<br><br></div><div>    # which page to render (e.g.: /search?q=whatever&page=2)<br></div>    my $page  = param('page');<br><br></div><div>    # make sure it's a valid page:<br></div><div>    $page = 1 unless $page && $page =~ /^\d+$/;<br></div><div><br></div><div>    # create your search parameters (I'm gonna handwave this one)<br></div><div>    my %search_params = ( ... );<br></div><div><br></div><div>    # fetch the proper page on the database<br></div>    my @results = rset('MyRS')->search(<br>           \%search_params,<br>           {<br></div>                rows => 10,   # <=== how many items per page<br>           }<br></div>     )->page( $page )->all;<br><br></div>     template 'mytemplatename', { search_results => \@results };<br>};<br>---------------->8-----------------<br><br></div><div><div>Does this help you at all? I would also read through <a href="https://metacpan.org/pod/distribution/DBIx-Class/lib/DBIx/Class/Manual/QuickStart.pod" target="_blank">https://metacpan.org/pod/distribution/DBIx-Class/lib/DBIx/Class/Manual/QuickStart.pod</a> and <a href="https://metacpan.org/pod/distribution/DBIx-Class/lib/DBIx/Class/Manual/Intro.pod" target="_blank">https://metacpan.org/pod/distribution/DBIx-Class/lib/DBIx/Class/Manual/Intro.pod</a>.<br><br></div><div>And of course, if you have any other questions, feel free to ask :)<br><br></div><div>Cheers!<br><br></div><div>garu<br></div><div><br><br></div></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 15, 2014 at 5:29 PM, John Stoffel <span dir="ltr"><<a href="mailto:john@stoffel.org" target="_blank">john@stoffel.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Hi all,<br>
<br>
My google-fu is weak and I haven't been able to find a good example of<br>
how to do pagination with Dancer, DBIC and ideally some basic<br>
Javascript to make it look good.<br>
<br>
Here's my basic code that I'm working with right now, which I know is<br>
semi busted, but I just keep hitting roadblocks.  The goal here is to<br>
let me spin up quick, but nice search forms for read only mysql DBs<br>
for a library I work with in my spare time.  Ideally a CRUD interface<br>
down the line to allow end users to add/edit records.  DBIC looks to<br>
be the way to go with this down the line, since it can do proper<br>
records and transactions.  At least I think it can.<br>
<br>
Any way, my code:<br>
<br>
  package TestDBIC;<br>
  use Dancer ':syntax';<br>
  use Dancer::Plugin::DBIC qw(schema resultset rset);<br>
<br>
  # cd TestDBIC;<br>
  # TestDBIC::Schema 'dbi:mysql:dbname=emina;host=quad' emina<br>
<br>
  our $VERSION = '0.1';<br>
<br>
  get '/' => sub {<br>
      template 'search';<br>
  };<br>
<br>
  post '/results' => sub {<br>
    my $name = param 'Name';<br>
    my $sex = param 'Sex';<br>
    my $city = param 'City';<br>
    my $state = param 'State';<br>
    my $id = param 'MummyID';<br>
<br>
    my @rows;<br>
    my $query;<br>
    my $q = {};<br>
<br>
    my $limit = 10;<br>
    my $opts = {};<br>
    $opts->{order_by} = { -desc => 'id' };<br>
    $opts->{rows} = $limit if defined $limit;<br>
    # We need to join in several tables from the schema<br>
    $opts->{page} = 1;<br>
    $opts->{limit} = 15;<br>
    $opts->{order_by} = { 'desc' => 'name'};<br>
<br>
    my $rs = schema->resultset('MummyInNorthAmerica');<br>
<br>
    if ($name) {<br>
      if ($query) { $query .= " AND "; }<br>
      $query .= "Name LIKE $name";<br>
      $q->{name} = { like => "%$name%" } ;<br>
    }<br>
<br>
    if ($sex) {<br>
      if ($query) { $query .= " AND "; }<br>
      $query .= "Sex = $sex";<br>
      $q->{sex} = $sex;<br>
    }<br>
<br>
    @rows = $rs->search($q,$opts)->pager;<br>
<br>
    template 'results',<br>
      { query => $query,<br>
        mummies => \@rows,<br>
        rows => 1000<br>
      };<br>
  };<br>
<br>
  true;<br>
_______________________________________________<br>
dancer-users mailing list<br>
<a href="mailto:dancer-users@dancer.pm" target="_blank">dancer-users@dancer.pm</a><br>
<a href="http://lists.preshweb.co.uk/mailman/listinfo/dancer-users" target="_blank">http://lists.preshweb.co.uk/mailman/listinfo/dancer-users</a><br>
</blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
dancer-users mailing list<br>
<a href="mailto:dancer-users@dancer.pm" target="_blank">dancer-users@dancer.pm</a><br>
<a href="http://lists.preshweb.co.uk/mailman/listinfo/dancer-users" target="_blank">http://lists.preshweb.co.uk/mailman/listinfo/dancer-users</a><br>
<br></blockquote></div><br></div>
</div></div></blockquote></div><br></div>