Skip to content

Instantly share code, notes, and snippets.

@daviddelikat
Created December 16, 2015 21:04
Show Gist options
  • Save daviddelikat/d68321079cf4ef9caa72 to your computer and use it in GitHub Desktop.
Save daviddelikat/d68321079cf4ef9caa72 to your computer and use it in GitHub Desktop.
diff --git a/lib/WebGUI/AssetLineage.pm b/lib/WebGUI/AssetLineage.pm
index edbc434..857d92e 100644
--- a/lib/WebGUI/AssetLineage.pm
+++ b/lib/WebGUI/AssetLineage.pm
@@ -505,16 +505,28 @@ it returns an iterator. Calling the iterator will return instantiated assets,
or undef when there are no more assets available. The iterator is just a sub
ref, call like $asset = $iterator->()
+=head3 special parameter
+
+=head4 pager
+
+pass in a WebGUI::Paginator object to generate paginated output
+
=cut
sub getLineageIterator {
my $self = shift;
my $relatives = shift;
my $rules = shift;
+ my $pager = delete $rules->{pager};
my $sql = $self->getLineageSql($relatives, $rules);
- my $sth = $self->session->db->read($sql);
+ my $sth;
+ if( $pager ) {
+ $sth = $pager->getSthForQuery($sql);
+ } else {
+ $sth = $self->session->db->read($sql);
+ }
my $sub = sub {
my $assetInfo = $sth->hashRef;
return
@@ -750,7 +762,7 @@ sub getLineageSql {
}
return $sql;
-
+
}
diff --git a/lib/WebGUI/Paginator.pm b/lib/WebGUI/Paginator.pm
index fd0d9d9..29b1532 100644
--- a/lib/WebGUI/Paginator.pm
+++ b/lib/WebGUI/Paginator.pm
@@ -416,6 +416,7 @@ Defaults to the page you're currently viewing. This is mostly here as an overrid
sub getPageData {
my $self = shift;
+ return [] if $self->{_noData};
my $pageNumber = shift || $self->getPageNumber;
my $allRows = $self->{_rowRef};
@@ -737,19 +738,69 @@ A value to match the dynamicPageNumberKey.
sub setDataByQuery {
my $self = shift;
- my ($sql, $dbh, $unconditional, $placeholders, $dynamicPageNumberKey, $dynamicPageNumberValue) = @_;
-
+ my ($sql, $dbh, $unconditional, $placeholders, $dynamicPageNumberKey, $dynamicPageNumberValue) = @_;
+
#Set paginator info
my $pageNumber = $self->getPageNumber;
my $rowsPerPage = $self->{_rpp};
- $dbh ||= $self->session->dbSlave;
-
+ $dbh ||= $self->session->dbSlave;
+
#Handle dynamicPageNumber requests or custom limits, or non-mysql the old way as it winds up being most efficient
if ($dbh->getDriver ne 'mysql' || (defined $dynamicPageNumberKey && $pageNumber == 1) || $sql =~ m/limit/i) {
return $self->_setDataByQuery(@_);
}
+ my $sth = $self->getSthForQuery($sql,$dbh,$unconditional,$placeholders);
+
+ my @row = ();
+ while (my $data = $sth->hashRef) {
+ push(@row,$data);
+ }
+
+ $self->{_rowRef} = \@row;
+ $self->{_setByQuery} = 1;
+ $self->{_setByArrayRef} = 0;
+ delete $self->{_noData};
+ return "";
+}
+
+#-------------------------------------------------------------------
+
+=head2 getSthForQuery ( query [, dbh, unconditional, placeholders ] )
+
+returns a statement handle for the given query for the requested page...
+
+B<NOTE:> This retrieves only the current page's data for efficiency.
+
+=head3 query
+
+An SQL query that will retrieve a data set.
+
+=head3 dbh
+
+A WebGUI::SQL database handler. Defaults to the WebGUI site handler.
+
+=head3 unconditional
+
+A boolean indicating that the query should be read unconditionally. Defaults to "0". If set to "1" and the unconditional read results in an error, the error will be returned by this method.
+
+=head3 placeholders
+
+An array reference containing a list of values to be used in the placeholders defined in the SQL statement.
+
+=cut
+
+sub getSthForQuery {
+ my $self = shift;
+ my ($sql, $dbh, $unconditional, $placeholders) = @_;
+
+ #Set paginator info
+ my $pageNumber = $self->getPageNumber;
+ my $rowsPerPage = $self->{_rpp};
+
+ $dbh ||= $self->session->dbSlave;
+
#Calculate where to start
my $start = ( ($pageNumber - 1) * $rowsPerPage );
@@ -763,7 +814,7 @@ sub setDataByQuery {
my $sth;
if ($unconditional) {
$sth = $dbh->unconditionalRead($sql,$placeholders);
- return $sth->errorMessage if (defined $sth->errorCode);
+ die $sth->errorMessage if (defined $sth->errorCode);
} else {
$sth = $dbh->read($sql,$placeholders);
}
@@ -772,18 +823,12 @@ sub setDataByQuery {
($self->{_totalRows}) = $dbh->quickArray("select found_rows()");
$self->{_columnNames} = [ $sth->getColumnNames ];
- my @row = ();
- while (my $data = $sth->hashRef) {
- push(@row,$data);
- }
-
- $self->{_rowRef} = \@row;
- $self->{_setByQuery} = 1;
+ $self->{_setByQuery} = 0;
$self->{_setByArrayRef} = 0;
- return "";
+ $self->{_noData} = 1;
+ return $sth;
}
-#-------------------------------------------------------------------
=head2 setAlphabeticalKey ( string, abInitialOnly )
diff --git a/local/lib/WebGUI/Asset/Wobject/Folder2.pm b/local/lib/WebGUI/Asset/Wobject/Folder2.pm
index d593d02..c6dbe4d 100644
--- a/local/lib/WebGUI/Asset/Wobject/Folder2.pm
+++ b/local/lib/WebGUI/Asset/Wobject/Folder2.pm
@@ -120,6 +120,7 @@ sub _getAppropriateChildren {
my $assetIterator = $self->getLineageIterator(['children'], {
# returnObjects => 1,
invertTree => $invertTree,
+ pager => $self->getPager,
});
my @children;
@@ -245,10 +246,19 @@ sub view {
$var->{viewUrl} = WebGUI::HTML::format($self->getUrl, 'text');
$var->{children} = $self->_getLoopL1;
$var->{viewMoreText} = $self->_getViewMoreText($self->get('numChildrenToDisplayL1'));
+ my $pager = $self->getPager;
+ $pager->appendTemplateVars($var);
+ $var->{simplePagerBar} = $pager->getBarSimple;
+ $var->{traditionalPagerBar} = $pager->getBarTraditional;
+ $var->{advancedPagerBar} = $pager->getBarAdvanced;
return $self->processTemplate($var, undef, $self->{_viewTemplate});
}
+sub getPager {
+ $_[0]->{_pager} ||= WebGUI::Paginator->new($_[0]->session,$_[0]->getUrl,900);
+}
+
sub getRssFeedItems {
my $self = shift;
my $site = $self->session->url->getSiteURL;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment