Merge branch 'master' of git@github.com:plainblack/webgui

This commit is contained in:
daviddelikat 2009-10-14 10:51:56 -05:00
commit ae257f4e37
153 changed files with 246 additions and 13731 deletions

View file

@ -31,6 +31,7 @@ use WebGUI::Utility;
use WebGUI::Group;
use WebGUI::AssetCollateral::DataForm::Entry;
use WebGUI::Form::SelectRichEditor;
use WebGUI::Paginator;
use JSON ();
our @ISA = qw(WebGUI::Asset::Wobject);
@ -697,9 +698,10 @@ A hash reference. New template variables will be appended to it.
=cut
sub getListTemplateVars {
my $self = shift;
my $var = shift;
my $i18n = WebGUI::International->new($self->session,"Asset_DataForm");
my $self = shift;
my $session = $self->session;
my $var = shift;
my $i18n = WebGUI::International->new($session,"Asset_DataForm");
$var->{"back.url"} = $self->getFormUrl;
$var->{"back.label"} = $i18n->get('go to form');
my $fieldConfig = $self->getFieldConfig;
@ -713,7 +715,9 @@ sub getListTemplateVars {
} @{ $self->getFieldOrder };
$var->{field_loop} = \@fieldLoop;
my @recordLoop;
my $entryIter = $self->entryClass->iterateAll($self);
my $p = WebGUI::Paginator->new($session);
$p->setDataByCallback(sub { return $self->entryClass->iterateAll($self, { offset => $_[0], limit => $_[1], }); });
my $entryIter = $p->getPageIterator();
while ( my $entry = $entryIter->() ) {
my $entryData = $entry->fields;
my @dataLoop;
@ -734,9 +738,9 @@ sub getListTemplateVars {
%dataVars,
"record.ipAddress" => $entry->ipAddress,
"record.edit.url" => $self->getFormUrl("func=view;entryId=".$entry->getId),
"record.edit.icon" => $self->session->icon->edit("func=view;entryId=".$entry->getId, $self->get('url')),
"record.edit.icon" => $session->icon->edit("func=view;entryId=".$entry->getId, $self->get('url')),
"record.delete.url" => $self->getUrl("func=deleteEntry;entryId=".$entry->getId),
"record.delete.icon" => $self->session->icon->delete("func=deleteEntry;entryId=".$entry->getId, $self->get('url'), $i18n->get('Delete entry confirmation')),
"record.delete.icon" => $session->icon->delete("func=deleteEntry;entryId=".$entry->getId, $self->get('url'), $i18n->get('Delete entry confirmation')),
"record.username" => $entry->username,
"record.userId" => $entry->userId,
"record.submissionDate.epoch" => $entry->submissionDate->epoch,
@ -746,6 +750,7 @@ sub getListTemplateVars {
};
}
$var->{record_loop} = \@recordLoop;
$p->appendTemplateVars($var);
return $var;
}

View file

@ -207,7 +207,7 @@ sub getId {
#-------------------------------------------------------------------
=head2 iterateAll ( $asset )
=head2 iterateAll ( $asset, [ $options ] )
This class method returns an iterator set to iterate over all entries for a Dataform.
@ -215,13 +215,33 @@ This class method returns an iterator set to iterate over all entries for a Data
A reference to a Dataform object.
=head3 $options
A hashreference of options.
=head4 offset
The record number to start the iterator at. Defaults to 0 if not set.
=head4 limit
The number of records for the iterator to return. Defaults to a very large number if not set.
=cut
sub iterateAll {
my $class = shift;
my $asset = shift;
my $sth = $asset->session->dbSlave->read("SELECT `DataForm_entryId`, `userId`, `username`, `ipAddress`, `submissionDate`, `entryData` FROM `DataForm_entry` WHERE `assetId` = ? ORDER BY `submissionDate` DESC", [$asset->getId]);
my $sub = sub {
my $class = shift;
my $asset = shift;
my $options = shift;
my $sql = "SELECT SQL_CALC_FOUND_ROWS `DataForm_entryId`, `userId`, `username`, `ipAddress`, `submissionDate`, `entryData` FROM `DataForm_entry` WHERE `assetId` = ? ORDER BY `submissionDate` DESC LIMIT ?,?";
my $placeHolders = [ $asset->getId ];
push @{ $placeHolders }, exists $options->{offset} ? $options->{offset} : 0;
push @{ $placeHolders }, exists $options->{limit} ? $options->{limit} : 1234567890;
my $slave = $asset->session->dbSlave; ##Use the same slave to calculate the number of rows
my $sth = $slave->read($sql, $placeHolders);
my $allRows = $slave->quickScalar('SELECT FOUND_ROWS()');
my $sub = sub {
return $allRows if $_[0] eq 'rowCount';
if (defined wantarray) {
my $properties = $sth->hashRef;
if ($properties) {

View file

@ -141,6 +141,9 @@ our $HELP = {
{ namespace => "Asset_Template",
tag => "template variables"
},
{ namespace => "WebGUI",
tag => "pagination template variables"
},
],
fields => [],
variables => [

View file

@ -63,7 +63,7 @@ Private method which retrieves a data set from a database and replaces whatever
This method should only ever be called by the public setDataByQuery method and is only called in the case that dynamicPageNumberKey is set.
The public setDataByQuery method is not capable of efficiently handling requests that dyncmically set the page number by value
The public setDataByQuery method is not capable of efficiently handling requests that dynamically set the page number by value
due to the fact that only one page of results is ever returned. In this method, all the results are returned making this possible.
=head3 query
@ -405,7 +405,7 @@ sub getPage {
=head2 getPageData ( [ pageNumber ] )
Returns the data from the page specified as an array reference.
Returns the data from the specified page as an array reference.
=head3 pageNumber
@ -414,40 +414,41 @@ Defaults to the page you're currently viewing. This is mostly here as an overrid
=cut
sub getPageData {
my $self = shift;
my $pageNumber = shift || $self->getPageNumber;
my $allRows = $self->{_rowRef};
my $pageCount = $self->getNumberOfPages;
return [] if ($pageNumber > $pageCount);
my $self = shift;
my $pageNumber = shift || $self->getPageNumber;
my $allRows = $self->{_rowRef};
my $pageCount = $self->getNumberOfPages;
return [] if ($pageNumber > $pageCount);
if($self->{_setByQuery}) {
#Return the cached page
return $allRows if($pageNumber == $self->getPageNumber);
return [];
}
}
#Handle setByArrayRef or the old setDataByQuery method
my @pageRows = ();
#Handle setByArrayRef or the old setDataByQuery method
my @pageRows = ();
my $rowsPerPage = $self->{_rpp};
my $pageStartRow = ($pageNumber*$rowsPerPage)-$rowsPerPage;
my $pageEndRow = $pageNumber*$rowsPerPage;
for (my $i=$pageStartRow; $i<$pageEndRow; $i++) {
$pageRows[$i-$pageStartRow] = $allRows->[$i] if ($i <= $#{$self->{_rowRef}});
}
return \@pageRows;
$pageRows[$i-$pageStartRow] = $allRows->[$i] if ($i <= $#{$self->{_rowRef}});
}
return \@pageRows;
}
#-------------------------------------------------------------------
=head2 getPageNumber ( )
=head2 getPageIterator ( )
Returns the current page number. If no page number can be found then it returns 1.
Returns the iterator that was created by setDataByCallback
=cut
sub getPageNumber {
return $_[0]->{_pn};
sub getPageIterator {
my $self = shift;
return $self->{_iteratorObj};
}
#-------------------------------------------------------------------
@ -458,7 +459,7 @@ Returns links to all pages in this paginator.
=head3 limit
An integer representing the maximum number of page links to return. Defaultly all page links will be returned.
An integer representing the maximum number of page links to return. By default, all page links will be returned.
=cut
@ -523,6 +524,18 @@ sub getPageLinks {
}
#-------------------------------------------------------------------
=head2 getPageNumber ( )
Returns the current page number. If no page number can be found then it returns 1.
=cut
sub getPageNumber {
return $_[0]->{_pn};
}
#-------------------------------------------------------------------
=head2 getPreviousPageLink ( )
@ -589,13 +602,13 @@ By default the page number will be determined by looking at $self->session->form
=cut
sub new {
my $class = shift;
my $session = shift;
my $currentURL = shift;
my $rowsPerPage = shift || 25;
my $formVar = shift || "pn";
my $pn = shift || $session->form->process($formVar) || 1;
bless {_session=>$session, _url => $currentURL, _rpp => $rowsPerPage, _formVar => $formVar, _pn => $pn}, $class;
my $class = shift;
my $session = shift;
my $currentURL = shift;
my $rowsPerPage = shift || 25;
my $formVar = shift || "pn";
my $pn = shift || $session->form->process($formVar) || 1;
bless {_session=>$session, _url => $currentURL, _rpp => $rowsPerPage, _formVar => $formVar, _pn => $pn}, $class;
}
#-------------------------------------------------------------------
@ -651,6 +664,42 @@ sub setDataByArrayRef {
}
#-------------------------------------------------------------------
=head2 setDataByCallback ( callback )
Provide the paginator with data by giving it a callback. This interface does not support
having alphabetical keys ala C<setAlphabeticalKey> because the data is never stored in
the Paginator object.
=head3 callback
A callback to invoke that returns an iterator. The callback method should
accept two optional parameters, an offset to start, and the rows per page
to return. The iterator should return the total number of rows in
the query, without limits, when the first argument it is passed is 'rowCount'.
=cut
sub setDataByCallback {
my $self = shift;
my $callback = shift;
my $pageNumber = $self->getPageNumber;
my $rowsPerPage = $self->{_rpp};
my $start = ( ($pageNumber - 1) * $rowsPerPage );
my $obj = $callback->($start, $rowsPerPage);
$self->{_totalRows} = $obj->('rowCount');
$self->{_iteratorObj} = $obj;
$self->{_setByQuery} = 0;
$self->{_setByArrayRef} = 0;
$self->{_setByCallback} = 1;
return '';
}
#-------------------------------------------------------------------
=head2 setDataByQuery ( query [, dbh, unconditional, placeholders, dynamicPageNumberKey, dynamicPageNumberValue ] )