Files
EasySoft-ZenTaoPMS/lib/pager/pager.class.php
2015-01-21 10:42:24 +08:00

506 lines
13 KiB
PHP
Executable File

<?php
/**
* The pager class file of ZenTaoPHP framework.
*
* The author disclaims copyright to this source code. In place of
* a legal notice, here is a blessing:
*
* May you do good and not evil.
* May you find forgiveness for yourself and forgive others.
* May you share freely, never taking more than you give.
*/
/**
* Pager class.
*
* @package framework
*/
class pager
{
/**
* The default counts of per page.
*
* @public int
*/
const DEFAULT_REC_PRE_PAGE = 20;
/**
* The total counts.
*
* @var int
* @access public
*/
public $recTotal;
/**
* Record count per page.
*
* @var int
* @access public
*/
public $recPerPage;
/**
* The cookie name of recPerPage.
*
* @var string
* @access public
*/
public $pageCookie;
/**
* Page count.
*
* @var string
* @access public
*/
public $pageTotal;
/**
* Current page id.
*
* @var string
* @access public
*/
public $pageID;
/**
* The global $app.
*
* @var object
* @access private
*/
private $app;
/**
* The global $lang.
*
* @var object
* @access private
*/
private $lang;
/**
* Current module name.
*
* @var string
* @access private
*/
private $moduleName;
/**
* Current method.
*
* @var string
* @access private
*/
private $methodName;
/**
* The params.
*
* @private array
*/
private $params;
/**
* The construct function.
*
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function __construct($recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->setApp();
$this->setLang();
$this->setModuleName();
$this->setMethodName();
$this->setRecTotal($recTotal);
$this->setRecPerPage($recPerPage);
$this->setPageTotal();
$this->setPageID($pageID);
}
/**
* The factory function.
*
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return object
*/
public static function init($recTotal = 0, $recPerPage = 20, $pageID = 1)
{
return new pager($recTotal, $recPerPage, $pageID);
}
/**
* Set the recTotal property.
*
* @param int $recTotal
* @access public
* @return void
*/
public function setRecTotal($recTotal = 0)
{
$this->recTotal = (int)$recTotal;
}
/**
* Set the recTotal property.
*
* @param int $recPerPage
* @access public
* @return void
*/
public function setRecPerPage($recPerPage)
{
/* Set the cookie name. */
$this->pageCookie = 'pager' . ucfirst($this->app->getModuleName()) . ucfirst($this->app->getMethodName());
if(isset($_COOKIE[$this->pageCookie])) $recPerPage = $_COOKIE[$this->pageCookie];
$this->recPerPage = ($recPerPage > 0) ? $recPerPage : PAGER::DEFAULT_REC_PRE_PAGE;
}
/**
* Set the pageTotal property.
*
* @access public
* @return void
*/
public function setPageTotal()
{
$this->pageTotal = ceil($this->recTotal / $this->recPerPage);
}
/**
* Set the page id.
*
* @param int $pageID
* @access public
* @return void
*/
public function setPageID($pageID)
{
if($pageID > 0 and $pageID <= $this->pageTotal)
{
$this->pageID = $pageID;
}
else
{
$this->pageID = 1;
}
}
/**
* Set the $app property;
*
* @access private
* @return void
*/
private function setApp()
{
global $app;
$this->app = $app;
}
/**
* Set the $lang property.
*
* @access private
* @return void
*/
private function setLang()
{
global $lang;
$this->lang = $lang;
}
/**
* Set the $moduleName property.
*
* @access private
* @return void
*/
private function setModuleName()
{
$this->moduleName = $this->app->getModuleName();
}
/**
* Set the $methodName property.
*
* @access private
* @return void
*/
private function setMethodName()
{
$this->methodName = $this->app->getMethodName();
}
/**
* Get recTotal, recPerpage, pageID from the request params, and add them to params.
*
* @access private
* @return void
*/
private function setParams()
{
$this->params = $this->app->getParams();
foreach($this->params as $key => $value)
{
if(strtolower($key) == 'rectotal') $this->params[$key] = $this->recTotal;
if(strtolower($key) == 'recperpage') $this->params[$key] = $this->recPerPage;
if(strtolower($key) == 'pageid') $this->params[$key] = $this->pageID;
}
}
/**
* Create the limit string.
*
* @access public
* @return string
*/
public function limit()
{
$limit = '';
if($this->pageTotal > 1) $limit = ' limit ' . ($this->pageID - 1) * $this->recPerPage . ", $this->recPerPage";
return $limit;
}
/**
* Print the pager's html.
*
* @param string $align
* @param string $type
* @access public
* @return void
*/
public function show($align = 'right', $type = 'full')
{
echo $this->get($align, $type);
}
/**
* Get the pager html string.
*
* @param string $align
* @param string $type the pager type, full|short|shortest
* @access public
* @return string
*/
public function get($align = 'right', $type = 'full')
{
/* If the RecTotal is zero, return with no record. */
if($this->recTotal == 0) { return $type == 'mobile' ? '' : "<div style='float:$align; clear:none;' class='pager'>{$this->lang->pager->noRecord}</div>"; }
/* Set the params. */
$this->setParams();
/* Create the prePage and nextpage, all types have them. */
$pager = $this->createPrePage($type);
$pager .= $this->createNextPage($type);
/* The short and full type. */
if($type !== 'shortest' and $type !== 'mobile')
{
$pager = $this->createFirstPage() . $pager;
$pager .= $this->createLastPage();
}
if($type == 'mobile')
{
$position = $this->pageTotal == 1 ? '' : $this->pageID . '/' . $this->pageTotal;
$pager = $pager . ' ' . $position;
}
else if($type != 'full')
{
$pager = $this->pageID . '/' . $this->pageTotal . ' ' . $pager;
}
/* Only the full type . */
if($type == 'full')
{
$pager = $this->createDigest() . $pager;
$pager .= $this->createGoTo();
$pager .= $this->createRecPerPageJS();
}
return "<div style='float:$align; clear:none;' class='pager'>$pager</div>";
}
/**
* Create the digest code.
*
* @access private
* @return string
*/
private function createDigest()
{
return sprintf($this->lang->pager->digest, $this->recTotal, $this->createRecPerPageList(), $this->pageID, $this->pageTotal);
}
/**
* Create the first page.
*
* @access private
* @return string
*/
private function createFirstPage()
{
if($this->pageID == 1) return $this->lang->pager->first . ' ';
$this->params['pageID'] = 1;
return html::a(helper::createLink($this->moduleName, $this->methodName, $this->params), $this->lang->pager->first);
}
/**
* Create the pre page html.
*
* @access private
* @return string
*/
private function createPrePage($type = 'full')
{
if($type == 'mobile')
{
if($this->pageID == 1) return '';
$this->params['pageID'] = $this->pageID - 1;
return html::a(helper::createLink($this->moduleName, $this->methodName, $this->params), $this->lang->pager->pre, '', 'data-role="button" data-icon="arrow-l" data-iconpos="left" data-inline="true"');
}
else
{
if($this->pageID == 1) return $this->lang->pager->pre . ' ';
$this->params['pageID'] = $this->pageID - 1;
return html::a(helper::createLink($this->moduleName, $this->methodName, $this->params), $this->lang->pager->pre);
}
}
/**
* Create the next page html.
*
* @access private
* @return string
*/
private function createNextPage($type = 'full')
{
if($type == 'mobile')
{
if($this->pageID == $this->pageTotal) return '';
$this->params['pageID'] = $this->pageID + 1;
return html::a(helper::createLink($this->moduleName, $this->methodName, $this->params), $this->lang->pager->next, '', 'data-role="button" data-icon="arrow-r" data-iconpos="right" data-inline="true"');
}
else
{
if($this->pageID == $this->pageTotal) return $this->lang->pager->next . ' ';
$this->params['pageID'] = $this->pageID + 1;
return html::a(helper::createLink($this->moduleName, $this->methodName, $this->params), $this->lang->pager->next);
}
}
/**
* Create the last page
*
* @access private
* @return string
*/
private function createLastPage()
{
if($this->pageID == $this->pageTotal) return $this->lang->pager->last . ' ';
$this->params['pageID'] = $this->pageTotal;
return html::a(helper::createLink($this->moduleName, $this->methodName, $this->params), $this->lang->pager->last);
}
/**
* Create the select object of record perpage.
*
* @access private
* @return string
*/
private function createRecPerPageJS()
{
/* Replace the recTotal, recPerPage, pageID to special string, and then replace them with values by JS. */
$params = $this->params;
foreach($params as $key => $value)
{
if(strtolower($key) == 'rectotal') $params[$key] = '_recTotal_';
if(strtolower($key) == 'recperpage') $params[$key] = '_recPerPage_';
if(strtolower($key) == 'pageid') $params[$key] = '_pageID_';
}
$vars = '';
foreach($params as $key => $value) $vars .= "$key=$value&";
$vars = rtrim($vars, '&');
$js = <<<EOT
<script>
vars = '$vars';
pageCookie = '$this->pageCookie';
function submitPage(mode, perPage)
{
pageTotal = parseInt(document.getElementById('_pageTotal').value);
pageID = document.getElementById('_pageID').value;
recPerPage = document.getElementById('_recPerPage').getAttribute('data-value');
recTotal = document.getElementById('_recTotal').value;
if(mode == 'changePageID')
{
if(pageID > pageTotal) pageID = pageTotal;
if(pageID < 1) pageID = 1;
}
else if(mode == 'changeRecPerPage')
{
recPerPage = perPage;
pageID = 1;
}
$.cookie(pageCookie, recPerPage, {expires:config.cookieLife, path:config.webRoot});
vars = vars.replace('_recTotal_', recTotal)
vars = vars.replace('_recPerPage_', recPerPage)
vars = vars.replace('_pageID_', pageID);
location.href=createLink('$this->moduleName', '$this->methodName', vars);
}
</script>
EOT;
return $js;
}
/**
* Create the select list of RecPerPage.
*
* @access private
* @return string
*/
private function createRecPerPageList()
{
for($i = 5; $i <= 50; $i += 5) $range[$i] = $i;
$range[100] = 100;
$range[200] = 200;
$range[500] = 500;
$range[1000] = 1000;
$html = "<div class='dropdown dropup'><a href='javascript:;' data-toggle='dropdown' id='_recPerPage' data-value='{$this->recPerPage}'>" . (sprintf($this->lang->pager->recPerPage, $this->recPerPage)) . "<span class='caret'></span></a><ul class='dropdown-menu'>";
foreach ($range as $key => $value)
{
$html .= '<li' . ($this->recPerPage == $value ? " class='active'" : '') .'>' . "<a href='javascript:submitPage(\"changeRecPerPage\", $value)'>{$value}</a>" . '</li>';
}
$html .= '</ul></div>';
return $html;
}
/**
* Create the goto part html.
*
* @access private
* @return string
*/
private function createGoTo()
{
$goToHtml = "<input type='hidden' id='_recTotal' value='$this->recTotal' />\n";
$goToHtml .= "<input type='hidden' id='_pageTotal' value='$this->pageTotal' />\n";
$goToHtml .= "<input type='text' id='_pageID' value='$this->pageID' style='text-align:center;width:30px;' class='form-control' /> \n";
$goToHtml .= "<input type='button' id='goto' value='{$this->lang->pager->locate}' onclick='submitPage(\"changePageID\");' class='btn'/>";
return $goToHtml;
}
}