您的位置:首页 > 编程语言 > PHP开发

【Yii框架】YII分页组件

2014-07-03 08:19 302 查看

No. 1

效果:



代码:

class LinkPage extends CLinkPager
{
public function run()
{
$pageLinks = $this->createPagePreAndNext();
$topPage = CHtml::tag('div', array('class'=>'topPage'), $pageLinks);
$form = $this->createForm();
$toPage = CHtml::tag('div', array('class'=>'toPage'), $form);
echo CHtml::tag('div', array('class'=>'page'), $topPage.$toPage);
}
/**
* @desc 创建向前和向后的链接
* @return string a标签和span标签的html代码
*/
private function createPagePreAndNext()
{
$links = '';
if ($this->pages->getCurrentPage()>=1) {
$links .= CHtml::link($this->prevPageLabel, $this->createPageUrl($this->pages->getCurrentPage()-1), array('class'=>'prePage'));
} elseif (0 == $this->pages->getCurrentPage()) {
$links .= CHtml::tag('span', array('class'=>'prePage'), $this->prevPageLabel);
}
$links .= CHtml::tag('span', array('class'=>'pageNum'), $this->pages->getCurrentPage()+1 . '/' . ($this->pages->getPageCount()?$this->pages->getPageCount():1));
if ($this->pages->getCurrentPage()+1 < $this->pages->getPageCount()) {
$links .= CHtml::link($this->nextPageLabel, $this->createPageUrl($this->pages->getCurrentPage()+1), array('class'=>'pgNxt'));
} elseif($this->pages->getCurrentPage()+1 >= $this->pages->getPageCount()) {
$links .= CHtml::tag('span', array('class'=>'pgNxt'), $this->nextPageLabel);
}
return $links;
}
/**
* @desc 创建跳转表单
* @return string form的html代码
*/
private function createForm()
{
$form = '';
$url = $this->createPageUrl(0);
$form .= CHtml::beginForm($url, 'get');
$form .= CHtml::tag('span', array(), '跳转到');
$form .= CHtml::textField('page', '', array('class'=>'pageIn'));
$form .= CHtml::tag('span', array(), '页');
$form .= CHtml::tag('input', array('type'=>'submit', 'class'=>'pageSubBtn', 'value'=>'确定'));
$form .= CHtml::endForm();
return $form;
}
/**
* @desc 创建分页url链接
* @param int $page  链接指向的页数
* @return string   url链接
*/
public function createPageUrl($page)
{
if (is_null($this->pages->params)) {
$this->pages->params = $_GET;
foreach($this->pages->params as $key=>$value){
if (stripos($key, '/') || stripos($key, '\\')) {//去掉键中包含有 / 或者 \ 的param
unset($this->pages->params[$key]);
}
}
}
return $this->pages->createPageUrl($this->getController(), $page);
}
}


No. 2

效果:



注:这里总数不一定是八页,可以指定显示的连接页数,这里指定的是八页。

代码:

class ListLinkPage extends CLinkPager
{
public $listNum = 8;
public $pageArr = array();
public $startPage;
public $endPage;
public function run()
{
$this->listArr();
$code  = $this->makeListHtml();
$code .= $this->makePrevAndNext();
echo $code;
}
public function getListNum()
{
return $this->listNum;
}
public function setListNum($num)
{
is_numeric($num) && $this->listNum = intval($num);
}
/**
* 计算链接的起始和结束位置
*/
private function listArr()
{
//计算数字下标,当前页标之前需要显示多少个下标 和  当前页标之后需要显示多少个下标
$back    = ceil(($this->listNum - 1)/2);
$pageNow = $this->pages->getCurrentPage() + 1;
$count   = $this->pages->getPageCount();
$this->endPage   = ($pageNow+$back>$count)?$count:$pageNow+$back;
$this->startPage = ($pageNow+$back>$count)?(($count-$this->listNum)<1?1:($count-$this->listNum+1)):(($pageNow-$back+(($this->listNum%2)^1))<1?1:($pageNow-$back+(($this->listNum%2)^1)));
($this->endPage-$this->startPage < $this->listNum - 1) && $this->endPage = $this->listNum - $this->startPage + 1;
}
/**
* 生成上一页和下一页的html代码
*/
private function makePrevAndNext()
{
$htmlcode = '';
(($this->pages->getCurrentPage()<=0) && ($htmlcode .= CHtml::tag('span', array(), $this->prevPageLabel))) || ($htmlcode .= CHtml::link($this->prevPageLabel, '', array()));
(($this->pages->getCurrentPage()+1 < $this->pages->getPageCount()) && ($htmlcode .= CHtml::link($this->nextPageLabel, '', array()))) || ($htmlcode .= CHtml::tag('span', array(), $this->nextPageLabel));
return $htmlcode;
}
/**
* 生成列表链接的html代码
* @return string
*/
private function makeListHtml()
{
$htmlCode = '';
for($step=$this->startPage;$step<=$this->endPage;$step++){
(($step == $this->pages->getCurrentPage()+1) && ($htmlCode .= CHtml::tag('strong', array(), $step))) || ($htmlCode .= CHtml::link($step, '', array()));
}
return $htmlCode;
}
}


注:这两个里面的 $this->pages 都是Yii 中 CPagination类的实例。

No. 3

效果:



代码:

class pageList extends CLinkPager
{
private $signEmBefore= false;
private $signEmAfter = false;
private $pageStart;
private $pageEnd;
private $pageNow;
private $pageCount;
private $pageShowCount=7;
private $pagePosition=3;

public function run()
{
$this->pageNow = $this->pages->getCurrentPage()+1;
$this->pageCount = $this->pages->getPageCount();
0==$this->pagePosition && $this->pagePosition = 1;
if ($this->pagePosition >= $this->pageShowCount) {
echo '参数设置不合理';
return ;
}
$this->makeSign();
echo $this->makeHtml();
}
/**
* 计算标记位置
*/
public function makeSign()
{
if ($this->pageCount>$this->pageShowCount) {
$this->pageStart = $this->pageNow-$this->pagePosition+1;
($this->pageStart < 2 && $this->pageStart = 2) || $this->signEmBefore = true;
$this->pageEnd   = $this->pageShowCount+$this->pageStart-3;
($this->pageEnd >= $this->pageCount-1 && $this->pageEnd = $this->pageCount-1) || $this->signEmAfter = true;
($this->pageEnd-$this->pageShowCount+3 >= 2) && $this->pageStart = $this->pageEnd-$this->pageShowCount+3;
} else {
$this->pageEnd = $this->pageCount-1;
$this->pageStart = 2;
}
}
/**
* 生成分页代码
* @return [type] [description]
*/
private function makeHtml()
{
$html = '';
$html .= CHtml::tag('div', array('class'=>'page'), false);
$html .= CHtml::tag('div', array('class'=>'topPage'), false);
$html .= $this->makeLinkHtml();
$html .= CHtml::closeTag('div');
$html .= CHtml::tag('div', array('class'=>'toPage'), false);
$html .= $this->createForm();
$html .= CHtml::closeTag('div');
$html .= CHtml::closeTag('div');
return $html;
}
/**
* 生成html代码
* @return string 分页代码
*/
public function makeLinkHtml()
{
$htmlCode = '';
if (1==$this->pageNow) {
$htmlCode .= CHtml::tag('span', array('class'=>'prePage'), $this->prevPageLabel);
$htmlCode .= CHtml::tag('div', array('class'=>'pagaNumBox'), false);
$htmlCode .= CHtml::tag('strong', array(), 1);
} else {
$htmlCode .= CHtml::link($this->prevPageLabel, $this->createPageUrl($this->pageNow-1), array('class'=>'prePage'));
$htmlCode .= CHtml::tag('div', array('class'=>'pagaNumBox'), false);
$htmlCode .= CHtml::link(1, $this->createPageUrl(1), array());
}
if ($this->signEmBefore) {
$htmlCode .= CHtml::tag('em', array(), '...');
}
for($step=$this->pageStart;$step<=$this->pageEnd;$step++){
if ($step==$this->pageNow) {
$htmlCode .= CHtml::tag('strong', array(), $step);
} else {
$htmlCode .= CHtml::link($step, $this->createPageUrl($step), array());
}
}
if ($this->signEmAfter) {
$htmlCode .= CHtml::tag('em', array(), '...');
}
if ($this->pageCount==$this->pageNow) {
$this->pageEnd>0 && $htmlCode .= CHtml::tag('strong', array(), $this->pageCount);
$htmlCode .= CHtml::closeTag('div');
$htmlCode .= CHtml::tag('span', array('class'=>'pgNxt'), $this->nextPageLabel);
} else {
$this->pageEnd>0 && $htmlCode .= CHtml::link($this->pageCount, $this->createPageUrl($this->pageCount), array());
$htmlCode .= CHtml::closeTag('div');
$htmlCode .= CHtml::link($this->nextPageLabel, $this->createPageUrl($this->pageNow+1), array('class'=>'pgNxt'));
}
return $htmlCode;
}
/**
* @desc 创建跳转表单
* @return string form的html代码
*/
private function createForm()
{
$form = '';
$url = $this->createPageUrl(0);
$form .= CHtml::beginForm($url, 'get');
$form .= CHtml::tag('span', array(), '跳转到');
$form .= CHtml::textField('page', '', array('class'=>'pageIn'));
$form .= CHtml::tag('span', array(), '页');
$form .= CHtml::tag('input', array('type'=>'submit', 'class'=>'pageSubBtn', 'value'=>'确定'));
$form .= CHtml::endForm();
return $form;
}
/**
* @desc 创建分页url链接
* @param int $page  链接指向的页数
* @return string   url链接
*/
protected function createPageUrl($page)
{
if (is_null($this->pages->params)) {
$this->pages->params = $_GET;
foreach($this->pages->params as $key=>$value){
if (stripos($key, '/') || stripos($key, '\\')) {//去掉键中包含有 / 或者 \ 的param
unset($this->pages->params[$key]);
}
}
}
return $this->pages->createPageUrl($this->getController(), --$page);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: