我们的 volist 很好用,但是缺点是数据是由程序员提供的,前端没有任何更改的机会。比如排序,比哪分页中每页显示的条数。
而通常前端会根据页面的美观程度确定分页中每页的条数。所以想弄个带分页的 volist ,暂时叫polist 吧。
polist应该接收以下参数
id,offset,length,key,mod -> 与 volist 相比少了 name(不需要了)
加入
model -> 指明模型
scope -> 指明模型的命名范围
order -> 指明排序
rows -> 指明每页的条数
要在模型中先定义好各种命名范围,比如一个用户模型(User)中。
protected $_scope = array (
'ListAll' => array('where'=>' 1=1 '), //列出所有用户
'ListMale' => array('where'=>array('male'=>1)),//列出所有男性
'ListFemale'=> array('where'=>array('male'=>0)),//列出所有女性
);然后在标签中,接收 Model,Scope,Order,Rows,至于当前页,可以通过 I('get.p') 得到(改过分页名这里也要改变)。然后,在前端页面中,可以通过
<polist model="User" scope="ListMale" order=" uid desc " rows="5" id="vo">
{$vo.username}--{$vo.male} <br/>
</polist>这样就可以让前端自由安排显示的条数和顺序了。前端只能传入带"逻辑"色彩的命名范围,他不需要知道什么SQL之类的,这个命名范围的列表是我们提供给前端的,所以不会对我们的数据造成任何影响,不会有什么SQL注入呀之类的。至于 order 是TP里的标准语法里的。也不会有事。我们传了 rows="5" ,但还没有分页是吧。好说。
在 _polist 的实现中,创建个分页,跟在控制里一样,分页,形成相应的分页代码,然后把这个分页代码 assign 给一个 $pages 。在前台显示出来就是了。因为 polist 里面的东西会循环出现,所以,这个要通过assign弄到 polist以外。
<polist model="User" scope="ListMale" order=" uid desc " rows="5" id="vo">
{$vo.username}--{$vo.male} <br/>
</polist>
<div class="pager">{$pages}</div>这样OK?PS:如果担心前端不会用 order ,不知道 order 怎么写,可以把 order 也写进命名范围,就OK了。只是,把 order 编码进命名范围,会使命名范围的量剧增。
再PS:如果多传一个 pagename ,能把一个页面中多个分页的情况也一并解决了。
最佳答案