如何对列表进行分页
概述
ob娱乐下载Symfony提供了一个寻呼机组件:sfPropelPager
对象。它可以将结果列表与criteria对象(的值)分离标准
类)转换为一组页面以供显示,并提供对页面和结果对象的访问方法。
的sfPropelPager
对象
的sfPropelPager
类使用Propel抽象层,如中所述模型一章。
本章将说明如何使用sfPropelPager
方法中有一个简单的例子:按10个顺序显示文章列表。假设文章
对象有个短篇()
,getTitle ()
,getOverview ()
而且getContent ()
访问器方法。
如果你想要一个标准请求的非分页结果只显示已发表的文章,你需要:
类articleActions扩展sfActions{公共函数executeList(){...$ c=新标准();$ c->添加(ArticlePeer::发表,真正的);美元的文章= ArticlePeer::doSelect($ c);这个美元->文章=美元的文章;...}}
的美元的文章
变量,可从模板访问,将包含一个数组的所有文章
与请求匹配的对象。
要获得分页列表,您需要一种稍微不同的方法;结果必须写进sfPropelPager
对象,而不是数组:
类articleActions扩展sfActions{公共函数executeList(){...$ c=新标准();$ c->添加(ArticlePeer::发表,真正的);美元寻呼机=新sfPropelPager(“文章”,10);美元寻呼机->setCriteria($ c);美元寻呼机->setPage(这个美元->getRequestParameter(“页面”,1));美元寻呼机->初始化();这个美元->寻呼机=美元寻呼机;...}}
区别开始于标准定义之后,因为这个动作:
- 创建要分页的新分页器
文章
10乘10的物体 - 影响到寻呼机的条件
- 将当前页设置为所请求的页或第一个页
- 初始化寻呼机(即执行与条件相关的请求)
- 方法将寻呼机传递给模板
美元寻呼机
变量
模板listSuccess.php
现在可以访问sfPropelPager
对象。该对象知道当前页面和所有页面的列表。它具有访问页和页中的对象的方法。让我们看看如何操作它。
要显示结果的总数,请使用getNbResults ()
方法:
<?php回声美元寻呼机->getNbResults()? >结果发现。
Displaying results<?php回声美元寻呼机->getFirstIndice()? >来<?php回声美元寻呼机->getLastIndice()? >.
要显示所请求页面的文章,请使用getResults ()
方法寻呼机
对象来检索页面中的对象:
<?phpforeach(美元寻呼机->getResults()作为美元的文章):? ><?php回声link_to(美元的文章->getTitle(),“文章/读?id = '.美元的文章->getId())? ><?php回声美元的文章->getOverview()? ><?phpendforeach? >
跨页面导航
分页器对象知道结果的数量是否超过了一个页面中可以显示的最大数量(在本例中为10)haveToPaginate ()
方法。
要在列表(«< >»)底部添加页面导航链接,请使用导航方法getFirstPage ()
,getPreviousPage ()
,getNextPage ()
而且getLastPage ()
.当前页面由getPage ()
.所有这些方法都返回一个整数:所请求页面的排名。
方法所获得的链接集合进行循环,以指向特定的页面getLinks ()
方法:
<?php如果(美元寻呼机->haveToPaginate()):? ><?php回声link_to(“«”,的文章/列表吗?页面= '.美元寻呼机->getFirstPage())? ><?php回声link_to(“& lt;”,的文章/列表吗?页面= '.美元寻呼机->getPreviousPage())? ><?php美元的链接=美元寻呼机->getLinks();foreach(美元的链接作为美元的页面):? ><?php回声(美元的页面= =美元寻呼机->getPage())?美元的页面: link_to(美元的页面,的文章/列表吗?页面= '.美元的页面)? ><?php如果(美元的页面! =美元寻呼机->getCurrentMaxLink()):? >-<?phpendif? ><?phpendforeach? ><?php回声link_to(“在”,的文章/列表吗?页面= '.美元寻呼机->getNextPage())? ><?php回声link_to(“»”,的文章/列表吗?页面= '.美元寻呼机->getLastPage())? ><?phpendif? >
这应该呈现如下内容:
一旦显示了文章,为了允许直接导航到上一篇文章或下一篇文章而不返回到分页列表,您将需要一个游标。
跨对象导航
在列表中逐页导航很容易,但是用户可能不希望返回到列表来逐个对象地导航。的光标
属性。sfPropelPager
对象可以保存当前对象的偏移量。
这将允许逐条导航在readSuccess.php
模板。的部分代码listSuccess.php
模板:
<?php美元的光标=美元寻呼机->getFirstIndice();foreach(美元寻呼机->getResults()作为美元的文章):? ><?php回声link_to(美元的文章->getTitle(),“文章/读?光标= '.美元的光标)? ><?php回声美元的文章->getOverview()? ><?php++美元的光标;endforeach? >
的读
动作需要知道如何处理光标
参数:
类articleActions扩展sfActions{公共函数executeRead(){...如果(这个美元->getRequestParameter(“光标”)){美元的文章=美元寻呼机->getObjectByCursor(这个美元->getRequestParameter(“光标”));}其他的如果(这个美元->getRequestParameter(“id”)){美元的文章= ArticlePeer::retrieveByPK(这个美元->getRequestParameter(“id”));}/ /错误这个美元->forward404Unless(美元的文章);}}
的getObjectByCursor光标($)
方法将游标设置在指定位置,并返回该位置的对象。
属性可以设置光标,而不需要获得结果对象setCursor光标($)
方法。一旦设置了光标,就可以在这个位置抓取当前对象(getCurrent ()
)和前一个(getPrevious ()
)和下一个(getNext ()
).
这意味着读
Action可以通过一些修改将逐条导航的必要信息传递给模板:
类articleActions扩展sfActions{公共函数executeRead(){...如果(这个美元->getRequestParameter(“光标”)){美元寻呼机->setCursor(这个美元->getRequestParameter(“光标”));previous_article美元=美元寻呼机->getPrevious();美元的文章=美元寻呼机->getCurrent();next_article美元=美元寻呼机->getNext();}其他的如果(这个美元->getRequestParameter(“id”)){美元的文章= ArticlePeer::retrieveByPK(这个美元->getRequestParameter(“id”));}/ /错误这个美元->forward404Unless(美元的文章);}}
请注意
的getPrevious ()
而且getNext ()
方法返回零
如果没有上一个或下一个对象。
的readSuccess.php
模板可以是这样的:
<标题> < ?php回声美元的文章->getTitle()h1 ? > < / > < p类=“概述”> < ?php回声美元的文章->getOverview()? > < / p > < div类=“内容”><?php回声美元的文章->getContent()? >< / div > & lt;<?php回声link_to_if(previous_article美元,previous_article美元->getTitle(),“文章/读?id = '.previous_article美元->getId())? >——比;<?php回声link_to_if(next_article美元,next_article美元->getTitle(),“文章/读?id = '.next_article美元->getId())? >
改变排序顺序
随着sfPropelPager
对象依赖于标准
对象时,更改分页器的顺序只需在将其分配给分页器对象之前向条件添加排序即可。
例如,你可以在列表导航界面中添加排序列的选择:
类articleActions扩展sfActions{公共函数executeList(){...$ c=新标准();$ c->添加(ArticlePeer::发表,真正的);如果(这个美元->getRequestParameter(“排序”)){$ c->addAscendingOrderByColumn(ArticlePeer::translateFieldName(这个美元->getRequestParameter(“排序”), BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME));}其他的{//默认按日期排序$ c->addAscendingOrderByColumn(ArticlePeer::UPDATED_AT);}美元寻呼机=新sfPropelPager(“文章”,10);美元寻呼机->setCriteria($ c);美元寻呼机->初始化();这个美元->寻呼机=美元寻呼机;...}}
将以下内容添加到listSuccess.php
模板:
排序由:<?php回声link_to(“标题”,的文章/列表吗?类型=标题')? >-<?php回声link_to(“Id”,的文章/列表吗?类型= Id ')? >
改变每页结果的数量
的setMaxPerPage (max美元)
方法更改每页显示的结果数量,而不需要重新处理寻页器(不需要调用init ()
再一次)。如果传递该值0
对于参数,寻呼机将在一个页面中显示所有结果。
类articleActions扩展sfActions{公共函数executeList(){...$ c=新标准();$ c->添加(ArticlePeer::发表,真正的);美元寻呼机=新sfPropelPager(“文章”,10);美元寻呼机->setCriteria($ c);如果(这个美元->getRequestParameter(“maxperpage”)){美元寻呼机->setMaxPerPage(这个美元->getRequestParameter(“maxperpage”));}美元寻呼机->初始化();这个美元->寻呼机=美元寻呼机;...}}
因此,可以将以下内容添加到listSuccess.php
模板:
显示:<?php回声link_to(“十”,的文章/列表吗?maxperpage = 10 ')? >-<?php回声link_to(“20”,的文章/列表吗?maxperpage = 20 ')? >每页结果
更改选择方法
方法来优化操作的性能sfPropelPager
时,您可能希望强制寻呼机使用doSelectJoinXXX ()
而不是简单的doSelect ()
.这是很容易实现的setPeerMethod ()
方法sfPropelPager
对象:
美元寻呼机->setPeerMethod(“doSelectJoinUser”);
注意,寻呼机实际上处理doSelect ()
在显示页面时查询。第一个查询(由寻呼机- > init ()
)只做doCount
,你也可以通过调用:
美元寻呼机->setPeerCountMethod(“doCountJoinUser”);
在寻呼机中存储附加信息
有时可能需要在分页器对象中保留某个上下文。这就是为什么sfPropelPager
类可以处理参数以通常的方式:
美元寻呼机->setParameter(“foo”,“酒吧”);如果(美元寻呼机->hasParameter(“foo”)){美元寻呼机->getParameter(“foo”);美元寻呼机->getParameterHolder()->removeParameter(“foo”);}美元寻呼机->getParameterHolder()->clearParameters();
这些参数永远不会被寻呼机直接使用。
要了解有关自定义参数的更多信息,请参阅第二章.
本作品采用创作共用署名-非商业性-禁止派生作品3.0未移植许可协议授权。