关于扩展sp的实验例子----spPager

#1 azwl

一直想试验一下sp的扩展(类的继承)问题。看到不少朋友也在问使用spPager的问题,我也提出类似的问题http://speedphp.com/bbs/thread-697-1-2.html

今天实验了一下,有的朋友也许会说我下面这样不符合PHP和HTML分离(MVC)的原则,但我想HTML也是数据啊,而且分页又比较特殊(功能单一)。

主要是类似的可以扩展sp。

欢迎大家讨论。

扩展的spPager:

 
class myPager extends spPager
{
    /**
     * 分页函数
     *
     * @control 控制器
     * @action 动作器
     * @pagehandle 显示的页
     * @class 分页外观CSS
     * @args 附加参数
     */
     function getPagerHtml($control, $action, $pagerhandle='p' , $class = null, $args = array()){
         if ($class==null) $class='meneame';
         $html = "
";
         $pageData = $this -> getPager();
         $curpage = $pageData['current_page'];
         $totalpage = $pageData['total_page'];
         if($curpage != $pageData['first_page']){
             $url = spUrl($control, $action, $args + array($pagerhandle => $pageData['first_page']));
             $html .= "首页";
             }
         if($curpage != $pageData['prev_page']){
             $url = spUrl($control, $action, $args + array($pagerhandle => $pageData['prev_page']));
             $html .= "前页";
             }
         $startpage = 1;
         $endpage = 9;
         if ($curpage > 4){
             $startpage = $curpage-4;
             $endpage = $curpage + 4;
             }
         if ($endpage > $totalpage){
             $startpage = $totalpage-8;
             $endpage = $totalpage;
             }
         if ($startpage < 1) $startpage = 1;
         for($p = $startpage;$p <= $endpage;$p++){
             if($p == $curpage){
                 $html .= "{$p}";
                 }else{
                 $url = spUrl($control, $action, $args + array($pagerhandle => $p));
                 $html .= "{$p}";
                 }
             }
        
         if($curpage != $pageData['next_page']){
             $url = spUrl($control, $action, $args + array($pagerhandle => $pageData['next_page']));
             $html .= "下页";
             }
         if($curpage != $pageData['last_page']){
             $url = spUrl($control, $action, $args + array($pagerhandle => $pageData['last_page']));
             $html .= "末页";
             }
         $html .= '
';
         return $html;
         }
     }
?>


使用方法:
首先在index.php的spConfig中增加一句:
 'auto_load_model' => array('myPager'),


其次php代码类似如下:

$this -> rows = spClass('Mnews') ->myPager($this -> spArgs('page', 1), 20) -> findAll(array('poster' => $userid), ' id desc ');
$this -> pager = spClass('Mnews') -> myPager() -> getPagerHtml('admin','newsmang','page');


再就是模板(smarty)中:

<{$pager}>

2010-07-06 23:21:37

#2 jake

类的继承,在speedphp框架中,主要集中在MVC的MC两个父类中,也就是spController/spModel。
像spPager这种是辅助类型的类,不建议继承使用。

如果希望通过继承来达到进一步应用spPager的效果,遵循框架架构规则的方式,是通过继承spModel类,重载类的方法函数,来形成更个性化的分页效果。

或者直接通过视图注册函数下手,基于传入到模型的业务数据,用HTML的方式重新编写显示的方式即可。

另外,HTML始终是VIEW层次的东西,不能说“什么都是数据”就把这个界限模糊了;MVC的定义是在逻辑上来定义区分的:
model提供的数据主要是指通过业务运算得到的业务数据
view提供的是专门用于显示的视图数据
所以,显示分页的方式,还是放到VIEW中来实现,会比较恰当。

2010-07-06 23:38:25

#3 jake

对了,28行中的$startpage 和 29行的$endpage变量的作用是?

这种数量的定义直接写到代码上好像不太好吧?

2010-07-06 23:45:14

#4 azwl

对了,28行中的$startpage 和 29行的$endpage变量的作用是?

这种数量的定义直接写到代码上好像不太好吧? ...
jake 发表于 2010-7-6 23:45
我主要是来向你(们)学习的。$stratpage和endpage是这样的。你提供的那个function.php是把所有页都列出来了,如果有100页的话会列100页的连接。我是将列出的页最多只有9页,当前页自动调整到中间,所以有前面两个变量来计算开始和结束位置。

2010-07-07 11:07:24

#5 azwl

说实在的啊,看到了speedPHP才算真的开始学习PHP

2010-07-07 11:10:10

#6 jake

更新了例子,直接下这个代码试试吧

http://speedphp.com/bbs/thread-679-1-1.html

2010-07-07 13:05:27