
2008-5-16 10:13
c61811
zend分页程序,与大家分享
1、分页类Pagination.php,最好是把这个类放在Zend目录下
<?
class XY_Pagination
{
private $_navigationItemCount = 10; //导航栏显示导航总页数
private $_pageSize = null; //每页项目数
private $_align = "right"; //导航栏显示位置
private $_itemCount = null; //总项目数
private $_pageCount = null; //总页数
private $_currentPage = null; //当前页
private $_front = null; //前端控制器
private $_PageParaName = "page"; //页面参数名称
private $_firstPageString = "|<<"; //导航栏中第一页显示的字符
private $_nextPageString = ">>"; //导航栏中前一页显示的字符
private $_previousPageString = "<<"; //导航栏中后一页显示的字符
private $_lastPageString = ">>|"; //导航栏中最后一页显示的字符
private $_splitString = " | ";
//页数字间的间隔符 /
public function __construct($itemCount, $pageSize)
{
if(!is_numeric($itemCount) || (!is_numeric($pageSize)))
throw new Exception("Pagination Error:not Number");
$this->_itemCount = $itemCount;
$this->_pageSize = $pageSize;
$this->_front = Zend_Controller_Front::getInstance();
$this->_pageCount = ceil($itemCount/$pageSize); //总页数
$page = $this->_front->getRequest()->getParam($this->_PageParaName);
if(empty($page) || (!is_numeric($page))) //为空或不是数字,设置当前页为1
{
$this->_currentPage = 1;
}
else
{
if($page < 1)
$page = 1;
if($page > $this->_pageCount)
$page = $this->_pageCount;
$this->_currentPage = $page;
}
}
/**
* 返回当前页
* @param int 当前页
*/
public function getCurrentPage()
{
return $this->_currentPage;
}
/**
* 返回导航栏目
* @return string 导航html class="PageNavigation"
*/
public function getNavigation()
{
$navigation = '<div style="text-align:'.$this->_align.'">';
$pageCote = ceil($this->_currentPage / ($this->_navigationItemCount - 1)) - 1; //当前页处于第几栏分页
$pageCoteCount = ceil($this->_pageCount / ($this->_navigationItemCount - 1)); //总分页栏
$pageStart = $pageCote * ($this->_navigationItemCount -1) + 1; //分页栏中起始页
$pageEnd = $pageStart + $this->_navigationItemCount - 1; //分页栏中终止页
if($this->_pageCount < $pageEnd)
{
$pageEnd = $this->_pageCount;
}
$navigation .= "总共:{$this->_itemCount}条 {$this->_pageCount}页\n";
if($pageCote > 0) //首页导航
{
$navigation .= '<a href="'.$this->createHref(1)."\">$this->_firstPageString</a> ";
}
if($this->_currentPage != 1) //上一页导航
{
$navigation .= '<a href="'.$this->createHref($this->_currentPage-1);
$navigation .= "\">$this->_previousPageString</a> ";
}
while ($pageStart <= $pageEnd) //构造数字导航区
{
if($pageStart == $this->_currentPage)
{
$navigation .= "<strong>$pageStart</strong>".$this->_splitString;
}
else
{
$navigation .= '<a href="'.$this->createHref($pageStart)."\">$pageStart</a>".$this->_splitString;
}
$pageStart++;
}
if($this->_currentPage != $this->_pageCount) //下一页导航
{
$navigation .= ' <a href="'.$this->createHref($this->_currentPage+1)."\">$this->_nextPageString</a> ";
}
if($pageCote < $pageCoteCount-1) //未页导航
{
$navigation .= '<a href="'.$this->createHref($this->_pageCount)."\">$this->_lastPageString</a> ";
}
//添加直接导航框
//$navigation .= '<input type="text" size="3" onkeydown="if(event.keyCode==13){window.location=\' ';
//$navigation .= $this->createHref().'\'+this.value;return false;}" />';
//2008年8月27号补充输入非正确页码后出现的错误——begin
$navigation .= ' <select onchange="window.location=\' '.$this->createHref().'\'+this.options[this.selectedIndex].value;">';
for ($i=1;$i<=$this->_pageCount;$i++){
if ($this->getCurrentPage()==$i){
$selected = "selected";
}
else {
$selected = "";
}
$navigation .= '<option value='.$i.' '.$selected.'>'.$i.'</option>';
}
$navigation .= '</select>';
//2008年8月27号补充输入非正确页码后出现的错误——end
$navigation .= "</div>";
return $navigation;
}
/**
* 取得导航栏显示导航总页数
*
* @return int 导航栏显示导航总页数
*/
public function getNavigationItemCount()
{
return $this->_navigationItemCount;
}
/**
* 设置导航栏显示导航总页数
*
* @param int $navigationCount:导航栏显示导航总页数
*/
public function setNavigationItemCoun($navigationCount)
{
if(is_numeric($navigationCount))
{
$this->_navigationItemCount = $navigationCount;
}
}
/**
* 设置首页显示字符
* @param string $firstPageString 首页显示字符
*/
public function setFirstPageString($firstPageString)
{
$this->_firstPageString = $firstPageString;
}
/**
* 设置上一页导航显示字符
* @param string $previousPageString:上一页显示字符
*/
public function setPreviousPageString($previousPageString)
{
$this->_previousPageString = $previousPageString;
}
/**
* 设置下一页导航显示字符
* @param string $nextPageString:下一页显示字符
*/
public function setNextPageString($nextPageString)
{
$this->_nextPageString = $nextPageString;
}
/**
* 设置未页导航显示字符
* @param string $nextPageString:未页显示字符
*/
public function setLastPageString($lastPageString)
{
$this->_lastPageString = $lastPageString;
}
/**
* 设置导航字符显示位置
* @param string $align:导航位置
*/
public function setAlign($align)
{
$align = strtolower($align);
if($align == "center")
{
$this->_align = "center";
}elseif($align == "right")
{
$this->_align = "right";
}else
{
$this->_align = "left";
}
}
/**
* 设置页面参数名称
* @param string $pageParamName:页面参数名称
*/
public function setPageParamName($pageParamName)
{
$this->_PageParaName = $pageParamName;
}
/**
* 获取页面参数名称
* @return string 页面参数名称
*/
public function getPageParamName()
{
return $this->_PageParaName;
}
/**
* 生成导航链接地址
* @param int $targetPage:导航页
* @return string 链接目标地址
*/
private function createHref($targetPage = null)
{
$params = $this->_front->getRequest()->getParams();
$module = $params["module"];
$controller = $params["controller"];
$action = $params["action"];
$targetUrl = $this->_front->getBaseUrl()."/$module/$controller/$action";
foreach ($params as $key => $value)
{
if($key != "controller" && $key != "module" && $key != "action" && $key != $this->_PageParaName)
{
$targetUrl .= "/$key/$value";
}
}
if(isset($targetPage)) //指定目标页
$targetUrl .= "/$this->_PageParaName/$targetPage";
else
$targetUrl .= "/$this->_PageParaName/";
return $targetUrl;
}
}
?>
2、在indexController.php中的indexController Function里面调用:
require_once 'Zend/Pagination.php';
$Users = new Users();
//$rows = $Users->getAdapter()->fetchOne("select count(*) from users where `role`!='admin'"); //recorde count
$rows = $Users->fetchAll("`role`!='admin'")->count(); //查询记录总数
$rowsPerPage = 5; //perPage recordes
$curPage = 1;
if($this->_request->getParam('page'))
{
$curPage = $this->_request->getParam('page');
}
//search data and display
$this->view->users = $Users->fetchAll("`role`!='admin'",'id desc',$rowsPerPage,($curPage-1)*$rowsPerPage)->toArray();
$Pager = new XY_Pagination($rows,$rowsPerPage);
$this->view->pagebar = $Pager->getNavigation();
3、在view中调用分页更简单了。
<?=$this->pagebar?>
或者在smarty模板情况下<{$pagebar}>
不过在此也要感谢以前的老前辈门,我是在他们的基础上修改了一部分的。如有疑问,QQ:258067823,另外如有更好的分页类请大家共享出来。
[[i] 本帖最后由 c61811 于 2008-8-27 11:19 编辑 [/i]]
2008-6-5 09:44
c61811
这么好的分页类竟然没有人回复啊。。。
2008-6-17 15:43
qqsheji
我下了 正在调试呢
2008-6-17 15:53
qqsheji
测试通过 很强大
[[i] 本帖最后由 qqsheji 于 2008-6-17 16:17 编辑 [/i]]
2008-6-17 16:00
c61811
为了更加美观,把最后一页数字后边的分隔符去掉了,将如下代码:
while ($pageStart <= $pageEnd) //构造数字导航区
{
if($pageStart == $this->_currentPage)
{
$navigation .= "<strong>$pageStart</strong>".$this->_splitString;
}
else
{
$navigation .= '<a href="'.$this->createHref($pageStart)."\">$pageStart</a>".$this->_splitString;
}
$pageStart++;
}
改成
while ($pageStart <= $pageEnd) //构造数字导航区
{
if($pageStart==$this->_pageCount){ //去掉最后一页数字后边的分隔符
$this->_splitString = " ";
}
if($pageStart == $this->_currentPage)
{
$navigation .= "<strong>$pageStart</strong>".$this->_splitString;
}
else
{
$navigation .= '<a href="'.$this->createHref($pageStart)."\">$pageStart</a>".$this->_splitString;
}
$pageStart++;
}
2008-6-20 15:22
djw5215066
很好很强大,但是我自己照着写了个,写了好久都没分出页来!
打开数据表是以下代码:高手帮忙看下!
$user_id = "27";
$select = $this->db->select();
$select->from('user_4scar AS a','*')
->join('tb_cartype_list AS b','a.BAS_CARTYPELIST_ID = b.F_id','F_jutitype')
->join('tb_cartype_allcar AS c','b.F_allcar_id = c.F_id','F_character')
->join('tb_group_carchara AS d','c.F_carchara_id = d.F_id','f_classname')
->where('a.BAS_USER_ID = ?',$user_id)
->where('a.BAS_IFDEL = ?','F')
->order('BAS_DATE desc');
$sql = $select->__toString();
$row = $this->db->fetchAll($sql);
$this->views->assign('date',$row);
$this->views->display("userproduct/carlist.htm");
unset($select,$sql,$result);
2008-6-20 19:50
c61811
回复 #6 djw5215066 的帖子
这个兄弟,你首先要弄清楚
require_once 'Zend/Pagination.php';
$Users = new Users();
//$rows = $Users->getAdapter()->fetchOne("select count(*) from users where `role`!='admin'"); //recorde count
$rows = $Users->fetchAll("`role`!='admin'")->count(); //查询记录总数
$rowsPerPage = 5; //perPage recordes
$curPage = 1;
if($this->_request->getParam('page'))
{
$curPage = $this->_request->getParam('page');
}
//search data and display
$this->view->users = $Users->fetchAll("`role`!='admin'",'id desc',$rowsPerPage,($curPage-1)*$rowsPerPage)->toArray();
$Pager = new XY_Pagination($rows,$rowsPerPage);
$this->view->pagebar = $Pager->getNavigation();
这个分类代码的意思,你才能根据你自己的想法来写你自己的分页,你的这个代码只是取出来了记录,但是没有限制一次取出多少条,也就是where条件里面的limit限制
2008-7-8 17:06
c61811
好东东一定要顶下去!
2008-7-10 10:11
liduanshi
有一个地方写发错了啊,老大!
$targetUrl = $this->_front->getBaseUrl()."/$module/$controller/$action";
应该是
$targetUrl = $this->_front->getRequest()->getBaseUrl()."/$module/$controller/$action"
2008-7-10 14:15
c61811
回复 #9 liduanshi 的帖子
你的理解有些错误,你再好好想想,这样是没有错误的
2008-7-10 15:36
liduanshi
回复 #10 c61811 的帖子
我的控制器是这样子的
$controller = Zend_Controller_Front::getInstance()
->addModuleDirectory('../app/modules')
我的modules下面又有两个文件夹 相当于组吧
你$targetUrl = $this->_front->getBaseUrl()得到的是其中的一个组,不是基本路径,
$targetUrl = $this->_front->getRequest()->getBaseUrl()得到的才是完全基本路径。楼主可以试试。
2008-7-30 17:49
knuthao
谢谢阿
2008-8-12 16:42
johndying
正用此功能 谢谢楼主
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.