public function toString($Type = 'more')
{
if ($this->_PropertiesDefined === false) {
trigger_error(ErrorMessage('You must configure the pager with $Pager->configure() before retrieving the pager.', 'MorePager', 'GetSimple'), E_USER_ERROR);
}
// Urls with url-encoded characters will break sprintf, so we need to convert them for backwards compatibility.
$this->Url = str_replace(array('%1$s', '%2$s', '%s'), '{Page}', $this->Url);
if ($this->TotalRecords === false) {
return $this->ToStringPrevNext($Type);
}
$this->CssClass = ConcatSep(' ', $this->CssClass, 'NumberedPager');
// Get total page count, allowing override
$PageCount = ceil($this->TotalRecords / $this->Limit);
$this->EventArguments['PageCount'] =& $PageCount;
$this->fireEvent('BeforePagerSetsCount');
$this->_PageCount = $PageCount;
$CurrentPage = PageNumber($this->Offset, $this->Limit);
// Show $Range pages on either side of current
$Range = c('Garden.Modules.PagerRange', 3);
// String to represent skipped pages
$Separator = c('Garden.Modules.PagerSeparator', '…');
// Show current page plus $Range pages on either side
$PagesToDisplay = $Range * 2 + 1;
if ($PagesToDisplay + 2 >= $PageCount) {
// Don't display an ellipses if the page count is only a little bigger that the number of pages.
$PagesToDisplay = $PageCount;
}
$Pager = '';
$PreviousText = t($this->LessCode);
$NextText = t($this->MoreCode);
// Previous
if ($CurrentPage == 1) {
$Pager = '<span class="Previous">' . $PreviousText . '</span>';
} else {
$Pager .= anchor($PreviousText, $this->PageUrl($CurrentPage - 1), 'Previous', array('rel' => 'prev'));
}
// Build Pager based on number of pages (Examples assume $Range = 3)
if ($PageCount <= 1) {
// Don't build anything
} elseif ($PageCount <= $PagesToDisplay) {
// We don't need elipsis (ie. 1 2 3 4 5 6 7)
for ($i = 1; $i <= $PageCount; $i++) {
$Pager .= anchor($i, $this->PageUrl($i), $this->_GetCssClass($i, $CurrentPage), array('rel' => self::Rel($i, $CurrentPage)));
}
} elseif ($CurrentPage + $Range <= $PagesToDisplay + 1) {
// +1 prevents 1 ... 2
// We're on a page that is before the first elipsis (ex: 1 2 3 4 5 6 7 ... 81)
for ($i = 1; $i <= $PagesToDisplay; $i++) {
$PageParam = 'p' . $i;
$Pager .= anchor($i, $this->PageUrl($i), $this->_GetCssClass($i, $CurrentPage), array('rel' => self::Rel($i, $CurrentPage)));
}
$Pager .= '<span class="Ellipsis">' . $Separator . '</span>';
$Pager .= anchor($PageCount, $this->PageUrl($PageCount), $this->_GetCssClass($PageCount, $CurrentPage));
} elseif ($CurrentPage + $Range >= $PageCount - 1) {
// -1 prevents 80 ... 81
// We're on a page that is after the last elipsis (ex: 1 ... 75 76 77 78 79 80 81)
$Pager .= anchor(1, $this->PageUrl(1), $this->_GetCssClass(1, $CurrentPage));
$Pager .= '<span class="Ellipsis">' . $Separator . '</span>';
for ($i = $PageCount - ($PagesToDisplay - 1); $i <= $PageCount; $i++) {
$PageParam = 'p' . $i;
$Pager .= anchor($i, $this->PageUrl($i), $this->_GetCssClass($i, $CurrentPage), array('rel' => self::Rel($i, $CurrentPage)));
}
} else {
// We're between the two elipsises (ex: 1 ... 4 5 6 7 8 9 10 ... 81)
$Pager .= anchor(1, $this->PageUrl(1), $this->_GetCssClass(1, $CurrentPage));
$Pager .= '<span class="Ellipsis">' . $Separator . '</span>';
for ($i = $CurrentPage - $Range; $i <= $CurrentPage + $Range; $i++) {
$PageParam = 'p' . $i;
$Pager .= anchor($i, $this->PageUrl($i), $this->_GetCssClass($i, $CurrentPage), array('rel' => self::Rel($i, $CurrentPage)));
}
$Pager .= '<span class="Ellipsis">' . $Separator . '</span>';
$Pager .= anchor($PageCount, $this->PageUrl($PageCount), $this->_GetCssClass($PageCount, $CurrentPage));
}
// Next
if ($CurrentPage == $PageCount) {
$Pager .= '<span class="Next">' . $NextText . '</span>';
} else {
$PageParam = 'p' . ($CurrentPage + 1);
$Pager .= anchor($NextText, $this->PageUrl($CurrentPage + 1), 'Next', array('rel' => 'next'));
// extra sprintf parameter in case old url style is set
}
if ($PageCount <= 1) {
$Pager = '';
}
$ClientID = $this->ClientID;
$ClientID = $Type == 'more' ? $ClientID . 'After' : $ClientID . 'Before';
if ($Pager) {
if (isset($this->HtmlBefore)) {
$Pager = $this->HtmlBefore . $Pager;
}
if (isset($this->HtmlAfter)) {
$Pager = ' ' . $Pager . $this->HtmlAfter;
}
}
return $Pager == '' ? '' : sprintf($this->Wrapper, Attribute(array('id' => $ClientID, 'class' => $this->CssClass)), $Pager);
}