【Yii框架】YII分页组件

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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值