列表显示问题

#1 zhgzzy

spAddViewFunction('articlelist','articlelist');
/*文字列表显示*/
function articlelist($params){
    $sid = $params['a']; //小类
    $lmt = $params['b']; //获取记录数
    $lng = $params['c']; //字符长度
    $bid = $params['d']; //大类
    if($sid){
    $rs = spClass('lib_article')->findAll(array('sid'=>$sid),'id DESC','id,title',$lmt);
    }elseif($bid){
    $rs = spClass('lib_article')->findAll(array('bid'=>$bid),'id DESC','id,title',$lmt);
    }else{
    $rs = spClass('lib_article')->findAll(null,'id DESC','id,title',$lmt);
    }
    foreach($rs as $smu) {
        $article .= "
  • ".strcut($smu['title'],$lng)."
  • ";
          }
               return $article;
    }
    显面调用:   <{articlelist a=1204 b=6 c=30}>

    如果一个页面有几十个这样的调用,执行效率如何??  还有没有更好的方法??

    2012-04-20 12:26:10

    #2 jake

    <{articlelist a=1204 b=6 c=30}> 每次的参数都不同吗? 那还能有什么办法。

    不过这样其实效率也没问题的,因为smarty最终会编译成php,当做php函数调用而已。

    如果每次参数都一样,那么可以在controller里面赋值再模板里面显示。

    2012-04-20 12:40:56

    #3 zhgzzy

    每次的参数肯定是都不同的了

    2012-04-20 12:49:12

    #4 jake

    仔细看了一下,怎么会在模板的函数里面findAll呢?

    这和MVC是背道而驰了,建议视图层只做视图逻辑的事情。

    PS:

    从某种角度来说,优化也是和MVC有关的。

    比如说M层的优化(就是楼主放在V层的数据处理逻辑,它们应该放M层),M层优化主要是通过“缓存”来进行的。所以其实楼上的代码,如果按MVC的方式放正确了,那么它的优化方式应该是进行“缓存”。(缓存在speedphp里面非常容易做,看手册)。

    如果是V层的优化,V层只负责视图逻辑的显示,所以V层的优化主要以编译为主,这是通过smarty的编译。其他方面一般不会直接对V层进行优化(会在C层里面统一优化了)。因为那已经够了,显示逻辑最优就是“显示得更快些”。(当然,楼上的代码放错位置了,所以不属于V层优化)

    C层优化,C层一般是整个页面进行优化,也就是根据URL直接把整个页面的全部东西缓存下来 ,或者根据URL直接生成静态HTML 。

    总结:

    M层:优化粒度是数据记录,优化手段是缓存。
    V层:优化粒度是页面块(模板函数或子模板等),优化手段是预编译(smarty提供)。
    C层:优化粒度是返回的整个页面,优化手段是页面级缓存或生成静态HTML。




    2012-04-20 13:39:21

    #5 zhgzzy

    不用findAll那怎么做   find  只能返回一组吧

    2012-04-20 14:44:45

    #6 jake

    zhgzzy 发表于 2012-4-20 14:44
    不用findAll那怎么做   find  只能返回一组吧
    {:soso_e127:}

    谁说这个啊。我的意思是,在模板的函数里面,不应该有查数据库的代码。查数据库应该在M或者C层做的。V层的模板只是负责显示。

    2012-04-20 15:54:09

    #7 zhgzzy

    jake  怎么弄,教教我吧

    2012-04-20 17:32:00

    #8 jake

    zhgzzy 发表于 2012-4-20 17:32
    jake  怎么弄,教教我吧
    http://www.speedphp.com/speedphp-mvc.html

    2012-04-20 17:44:45

    #9 zhgzzy

    model文件夹下的  lib_article.php
    class lib_article extends spModel
    {
      var $pk = "id"; // 每个留言唯一的标志,可以称为主键
      var $table = "article"; // 数据表的名称
      
      function articlelist($params){
        $sid = $params['a']; //小类
        $lmt = $params['b']; //获取记录数
        $lng = $params['c']; //字符长度
        $bid = $params['d']; //大类
        if($sid){
        $rs = $this->findAll(array('sid'=>$sid),'id DESC','id,title',$lmt);
        }elseif($bid){
        $rs = $this->findAll(array('bid'=>$bid),'id DESC','id,title',$lmt);
        }else{
        $rs = $this->findAll(null,'id DESC','id,title',$lmt);
        }
        foreach($rs as $smu) {
            $article .= "
  • ".strcut($smu['title'],$lng)."
  • ";
          }
               return $article;
    }
    }
    加载函数文件:hanshu.php
    spAddViewFunction('articlelist','articlelist');
    /*文字列表显示*/
    function articlelist($params){
        $rs = spClass('lib_article')->articlelist($params);
        return $rs;
    }
    模板调用:<{articlelist a=1204 b=6 c=30}>   这样可以吗???


    2012-04-20 17:54:23

    #10 jake

    zhgzzy 发表于 2012-4-20 17:54
    model文件夹下的  lib_article.php加载函数文件:hanshu.php模板调用:   这样可以吗???
    其实已经做到这步了,就差不多了。这里存在两个问题:

    1. 模板V不能直接调用M层的类,通过C层来调用,也就是在控制器里面调用再传到模板里面。
    2. M层存在HTML代码是非常不好的(
  • ),即使C层存在HTML代码也不太好。HTML最应该存在是模板和模板函数里面。

    改造方法:

    在你的函数里面调用的
    spClass('lib_article')->articlelist($params);
    放到controller里面去,通过
    $this->rs = spClass('lib_article')->articlelist(参数参数参数);
    传到模板里面。

    然后模板用

    function articlelist($params){
    $rs = $params['rs'];
    foreach($rs as $smu) {
    $article .= "
  • ".strcut($smu['title'],$lng)."
  • ";
         }
    return $article ;
    }

    这样就是真正的MVC。



    2012-04-20 23:29:28

    #11 zhgzzy

    谢谢jake

    2012-04-21 10:54:12

    #12 zhgzzy

    模板调用是不是太复杂了点

    2012-04-21 10:56:11

    #13 coolcool1265

    这个算是 一个经典问答了

    2012-04-26 08:35:49