phpcms筛选功能(经典无错)---汇总网上各种版本!

2017-06-26cms教程
436

phpcms的筛选功能,网上有各种版本,但是多多少少都会有点问题,不是很完美,下面我总结网上各种版本,加上自己的研究,得出一个算是比较全的一个资料,既可以分页,也可以分栏目!

第一步:后台添加字段


添加字段:
后台-->内容-->内容相关设置-->模型管理-->文章模型-->字段管理-->添加字段-->如下图示例:



第二步:增加扩展函数:


将以下代码添加到 phpcms/libs/functions/extention.func.php 文件

懒人包下载地址
(注:makeurlrule函数对分页是否能传递相关参数很重要!)


第三步:前台模板调用


{php $sql = structure_filters_sql($modelid);}  
{php $urlrule = makeurlrule()} 
{pc:content action="lists" catid="$catid" where="$sql"  modelid="$modelid" num="10" page="$page" moreinfo="1"  urlrule="$urlrule" return="data" } 
{loop $data $r} 
........
{/loop} 
{/pc} 

一般网上都是到这一步就没有了,没有了......
但是你会发现,还有很多问题,下面就来解决
 
第一个问题:list条件下加入where后其他条件失效的问题
 
之前的一篇文章:解决lists标签中,加上where后其他条件失效的问题,其他条件失效了,如catid,thumb等等,也就是无法获取当前栏目的信息,而是把整个栏目下的所有文章都调用出来了!
打开/phpcms/modules/content/classes/目录下的content_tag.class.php这个文件,把下面的代码(大概第63行)
if(isset($data['where'])) {   
$sql = $data['where'];   
} else {   
$thumb = intval($data['thumb']) ? " AND thumb != ''" : '';   
if($this->category[$catid]['child']) {   
$catids_str = $this->category[$catid]['arrchildid'];   
$pos = strpos($catids_str,',')+1;   
$catids_str = substr($catids_str, $pos);   
$sql = "status=99 AND catid IN ($catids_str)".$thumb;   
} else {   
$sql = "status=99 AND catid='$catid'".$thumb;   
}   
}   
 
替换为下面的代码即可。
 
if(isset($data['where'])) {   
$where = (isset($data['where'])&&(!empty($data['where'])))?' AND '.$data['where']:'';   
$thumb = intval($data['thumb']) ? " AND thumb != ''" : '';   
if($this->category[$catid]['child']) {   
$catids_str = $this->category[$catid]['arrchildid'];   
$pos = strpos($catids_str,',')+1;   
$catids_str = substr($catids_str, $pos);   
$sql = "status=99".$where." AND catid IN ($catids_str)".$thumb;   
} else {   
$sql = "status=99".$where." AND catid='$catid'".$thumb;   
}   
} else {   
$thumb = intval($data['thumb']) ? " AND thumb != ''" : '';   
if($this->category[$catid]['child']) {   
$catids_str = $this->category[$catid]['arrchildid'];   
$pos = strpos($catids_str,',')+1;   
$catids_str = substr($catids_str, $pos);   
$sql = "status=99 AND catid IN ($catids_str)".$thumb;   
} else {   
$sql = "status=99 AND catid='$catid'".$thumb;   
}   
}   
 
其实主要的修改思路是$where参数中并不包含当前栏目的id值,所以在$sql增加获取相关id的参数
 
第二个问题:分页数量不对
 
通过研究缓存得知,调用分页总数的函数是:
 
$content_total = $content_tag->count(array('catid'=>$catid,'where'=>$sql,'modelid'=>$modelid,'moreinfo'=>'1','limit'=>$offset.",".$pagesize,'action'=>'lists',)); 
通过这个,找到phpcms\modules\content\classes\content_tag.class.php大致36-56行,count函数如下:
 
public function count($data) { 
        if($data['action'] == 'lists') { 
            $catid = intval($data['catid']); 
            if(!$this->set_modelid($catid)) return false; 
            if(isset($data['where'])) { 
                $sql = $data['where']; 
            } else { 
                if($this->category[$catid]['child']) { 
                    $catids_str = $this->category[$catid]['arrchildid']; 
                    $pos = strpos($catids_str,',')+1; 
                    $catids_str = substr($catids_str, $pos); 
                    $sql = "status=99 AND catid IN ($catids_str)"; 
                } else { 
                    $sql = "status=99 AND catid='$catid'"; 
                } 
            } 
            return $this->db->count($sql); 
        } 
    } 
 
改为:
public function count($data) { 
        if($data['action'] == 'lists') { 
            $catid = intval($data['catid']); 
            $catids_str = $this->category[$catid]['arrchildid']; 
            if(!$this->set_modelid($catid)) return false; 
            if(isset($data['where'])) { 
                 $sql = $data['where']; 
                if($this->category[$catid]['child']) {   
                $catids_str = $this->category[$catid]['arrchildid'];   
                $pos = strpos($catids_str,',')+1;   
                $catids_str = substr($catids_str, $pos);   
                $sql = $sql." AND catid IN ($catids_str)"; 
                } else {   
                $sql = $sql." AND catid='$catid'"; 
                }   
            } else { 
                if($this->category[$catid]['child']) { 
                    $catids_str = $this->category[$catid]['arrchildid']; 
                    $pos = strpos($catids_str,',')+1; 
                    $catids_str = substr($catids_str, $pos); 
                    $sql = "status=99 AND catid IN ($catids_str)"; 
                } else { 
                    $sql = "status=99 AND catid='$catid'"; 
                } 
            } 
            return $this->db->count($sql); 
        } 
    } 
 
 
你会发现,分页统计的修改原理仍然是$where条件下,没有传入当前栏目id这个参数!
 
 
大功告成,这样既然正常分页传参,也能正常获取当前栏目信息,获取的信息总数也正确了
 
但是,我并没有测试在get方式下,是不是有影响,欢迎大家测试!!!

The End

相关推荐

WordPress上一篇、下一篇文章链接添加title属性的方法
上一篇、下一篇文章代码: ?php previous_post_link(%link,) ??php next_post_link(%link,) ? 该代码解析出来的代码大概如下: a href= rel=external nofollow rel=external nofollow /aa href= rel=external nofollow rel=external nofollow /a 通过 get_pr...
2017-08-03 cms教程
358

phpcms筛选功能(经典无错)---汇总网上各种版本!
phpcms的筛选功能,网上有各种版本,但是多多少少都会有点问题,不是很完美,下面我总结网上各种版本,加上自己的研究,得出一个算是比较全的一个资料,既可以分页,也可以分栏目! 第一步:后台添加字段 添加字段: 后台--内容--内容相关设置--模型管理--文...
2017-06-26 cms教程
436

phpcms移动站修改、百度MIP改造以及模版分享
明:模版做的时候贪图方便有个地方没有用动态调用,请各位下载后自行修改,不喜勿喷 我个人mip站是独立一套,即时 mip一个,m 是一个。 以下教程是将 m站 改造成 mip站,有需要两个独立站的可以将 phpcms/modules/wap 目录复制一份再修改即可,这里就不在说...
2017-04-01 cms教程
217

phpcms v9访问单网页一级栏目自动跳转到其下的第一个子栏目
在单网页模板头部head/head中间加入以下代码: ? PHP if($child){ $child_arrary=explode(,,$arrchildid); $to_url=$CATEGORYS[$child_arrary[1]][url]; echo scriptwindow.location.href=.$to_url./script; } ?...
2016-12-30 cms教程
388

ecshop商店显示当前会员登陆价格
ecshop 最高管理员登陆后台设置一个商品对应每个会员的价格,比如 普通vip 会员为 100元,黄金VIP为 80 元,没有登陆的普通会员则为 110元等,当每个等级会员登陆之后会显示自己所对应的价格,这样的修改对于用户体验很好,也是电商中不可缺少的一个功能,下...
2016-08-29 cms教程
46

ecshop教程:商品比较页面样式修改
ecshop有一个商品的比较功能,在你点击商品旁边的比较链接就可以把商品加入到比较的框架中,很多时候,我们都需要对比较页面的样式进行修改,一是我们的页面更美观。 关于修改比较页面样式的方法: 比较页面的样式没有在在css中,而是在compare.js这个更目录...
2016-08-29 cms教程
72