列表显示问题
发布于:2022-01-17 09:50:54
#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