A Qcodo based CMS/ecommerce framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

227 lines
6.9 KiB

<?php
class QPaginator extends QPaginatorBase {
// APPEARANCE
protected $intIndexCount = 10;
protected $strLabelForPrevious;
protected $strLabelForNext;
protected $strCssClass = 'paginator';
//////////
// Methods
//////////
public function __construct($objParentObject, $strControlId = null) {
parent::__construct($objParentObject, $strControlId);
$this->strLabelForPrevious = QApplication::Translate('Previous');
$this->strLabelForNext = QApplication::Translate('Next');
}
public function GetControlHtml() {
$this->objPaginatedControl->DataBind();
$strStyle = $this->GetStyleAttributes();
if ($strStyle)
$strStyle = sprintf(' style="%s"', $strStyle);
$strToReturn = sprintf('<span id="%s" %s%s>', $this->strControlId, $strStyle, $this->GetAttributes(true, false));
if ($this->intPageNumber <= 1)
$strToReturn .= sprintf('<span class="arrow">%s</span>', $this->strLabelForPrevious);
else {
$this->strActionParameter = $this->intPageNumber - 1;
$strToReturn .= sprintf('<span class="arrow"><a href="" %s>%s</a></span>',
$this->GetActionAttributes(), $this->strLabelForPrevious);
}
$strToReturn .= '<span class="break">|</span>';
if ($this->PageCount <= $this->intIndexCount) {
// We have less pages than total indexcount -- so let's go ahead
// and just display all page indexes
for ($intIndex = 1; $intIndex <= $this->PageCount; $intIndex++) {
if ($this->intPageNumber == $intIndex) {
$strToReturn .= sprintf('<span class="selected">%s</span>', $intIndex);
} else {
$this->strActionParameter = $intIndex;
$strToReturn .= sprintf('<span class="page"><a href="" %s>%s</a></span>',
$this->GetActionAttributes(), $intIndex);
}
}
} else {
// Figure Out Constants
/**
* "Bunch" is defined as the collection of numbers that lies in between the pair of Ellipsis ("...")
*
* LAYOUT
*
* For IndexCount of 10
* 2 213 2 (two items to the left of the bunch, and then 2 indexes, selected index, 3 indexes, and then two items to the right of the bunch)
* e.g. 1 ... 5 6 *7* 8 9 10 ... 100
*
* For IndexCount of 11
* 2 313 2
*
* For IndexCount of 12
* 2 314 2
*
* For IndexCount of 13
* 2 414 2
*
* For IndexCount of 14
* 2 415 2
*
*
*
* START/END PAGE NUMBERS FOR THE BUNCH
*
* For IndexCount of 10
* 1 2 3 4 5 6 7 8 .. 100
* 1 .. 4 5 *6* 7 8 9 .. 100
* 1 .. 92 93 *94* 95 96 97 .. 100
* 1 .. 93 94 95 96 97 98 99 100
*
* For IndexCount of 11
* 1 2 3 4 5 6 7 8 9 .. 100
* 1 .. 4 5 6 *7* 8 9 10 .. 100
* 1 .. 91 92 93 *94* 95 96 97 .. 100
* 1 .. 92 93 94 95 96 97 98 99 100
*
* For IndexCount of 12
* 1 2 3 4 5 6 7 8 9 10 .. 100
* 1 .. 4 5 6 *7* 8 9 10 11 .. 100
* 1 .. 90 91 92 *93* 94 95 96 97 .. 100
* 1 .. 91 92 93 94 95 96 97 98 99 100
*
* For IndexCount of 13
* 1 2 3 4 5 6 7 8 9 11 .. 100
* 1 .. 4 5 6 7 *8* 9 10 11 12 .. 100
* 1 .. 89 90 91 92 *93* 94 95 96 97 .. 100
* 1 .. 90 91 92 93 94 95 96 97 98 99 100
*/
$intMinimumEndOfBunch = $this->intIndexCount - 2;
$intMaximumStartOfBunch = $this->PageCount - $this->intIndexCount + 3;
$intLeftOfBunchCount = floor(($this->intIndexCount - 5) / 2);
$intRightOfBunchCount = round(($this->intIndexCount - 5.0) / 2.0);
$intLeftBunchTrigger = 4 + $intLeftOfBunchCount;
$intRightBunchTrigger = $intMaximumStartOfBunch + round(($this->intIndexCount - 8.0) / 2.0);
if ($this->intPageNumber < $intLeftBunchTrigger) {
$intPageStart = 1;
$strStartEllipsis = "";
} else {
$intPageStart = min($intMaximumStartOfBunch, $this->intPageNumber - $intLeftOfBunchCount);
$this->strActionParameter = 1;
$strStartEllipsis = sprintf('<span class="page"><a href="" %s>%s</a></span>',
$this->GetActionAttributes(), 1);
$strStartEllipsis .= '<span class="ellipsis">...</span>';
}
if ($this->intPageNumber > $intRightBunchTrigger) {
$intPageEnd = $this->PageCount;
$strEndEllipsis = "";
} else {
$intPageEnd = max($intMinimumEndOfBunch, $this->intPageNumber + $intRightOfBunchCount);
$strEndEllipsis = '<span class="ellipsis">...</span>';
$this->strActionParameter = $this->PageCount;
$strEndEllipsis .= sprintf('<span class="page"><a href="" %s>%s</a></span>',
$this->GetActionAttributes(), $this->PageCount);
}
$strToReturn .= $strStartEllipsis;
for ($intIndex = $intPageStart; $intIndex <= $intPageEnd; $intIndex++) {
if ($this->intPageNumber == $intIndex) {
$strToReturn .= sprintf('<span class="selected">%s</span>', $intIndex);
} else {
$this->strActionParameter = $intIndex;
$strToReturn .= sprintf('<span class="page"><a href="" %s>%s</a></span>',
$this->GetActionAttributes(), $intIndex);
}
}
$strToReturn .= $strEndEllipsis;
}
$strToReturn .= '<span class="break">|</span>';
if ($this->intPageNumber >= $this->PageCount)
$strToReturn .= sprintf('<span class="arrow">%s</span>', $this->strLabelForNext);
else {
$this->strActionParameter = $this->intPageNumber + 1;
$strToReturn .= sprintf('<span class="arrow"><a href="" %s>%s</a></span>',
$this->GetActionAttributes(), $this->strLabelForNext);
}
$strToReturn .= '</span>';
return $strToReturn;
}
/////////////////////////
// Public Properties: GET
/////////////////////////
public function __get($strName) {
switch ($strName) {
case 'IndexCount':
return $this->intIndexCount;
case 'LabelForNext':
return $this->strLabelForNext;
case 'LabelForPrevious':
return $this->strLabelForPrevious;
default:
try {
return parent::__get($strName);
} catch (QCallerException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
}
}
/////////////////////////
// Public Properties: SET
/////////////////////////
public function __set($strName, $mixValue) {
switch ($strName) {
case 'IndexCount':
$this->intIndexCount = QType::Cast($mixValue, QType::Integer);
if ($this->intIndexCount < 7)
throw new QCallerException('Paginator must have an IndexCount >= 7');
return $this->intIndexCount;
case 'LabelForNext':
try {
return ($this->strLabelForNext = QType::Cast($mixValue, QType::String));
} catch (QCallerException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
case 'LabelForPrevious':
try {
return ($this->strLabelForPrevious = QType::Cast($mixValue, QType::String));
} catch (QCallerException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
default:
try {
return (parent::__set($strName, $mixValue));
} catch (QCallerException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
break;
}
}
}
?>