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

phpcms的筛选功能,网上有各种版本,但是多多少少都会有点问题,不是很完美,下面我总结网上各种版本,加上自己的研究,得出一个算是比较全的一个资料,既可以分页,也可以分栏目! 第一步:后台添加字段 添加字段: 后台--内容--内容相关设置--模型管理--文
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方式下,是不是有影响,欢迎大家测试!!!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

明:模版做的时候贪图方便有个地方没有用动态调用,请各位下载后自行修改,不喜勿喷 我个人mip站是独立一套,即时 mip一个,m 是一个。 以下教程是将 m站 改造成 mip站,有需要两个独立站的可以将 phpcms/modules/wap 目录复制一份再修改即可,这里就不在说
在单网页模板头部head/head中间加入以下代码: ? PHP if($child){ $child_arrary=explode(,,$arrchildid); $to_url=$CATEGORYS[$child_arrary[1]][url]; echo scriptwindow.location.href=.$to_url./script; } ?
dwt文件中加入下面代码: link media=screen href={$ecs_css_path} rel=stylesheet type=text/css title={$ecs_css_path} / link media=screen href=/themes/kf518/style.css rel=alternate stylesheet type=text/css title=style / link media=screen href=
一个ecshop程序做的网站,因优化需要,需要增加自定义导航栏的nofollow功能控制,以及在前台自由控制导航栏的nofollow属性。 使用方法,简单介绍一下: 1、数据库ecs_nav增加nofollow项 tinyint 2、后台语言文件 增加$_LANG[item_ifnofollow] = 是否nofollow
ecshop系统中本店价格是可以在列表里调整的,市场价是按1.2比例自动加的,但是有的时候改本店价市场价出现不是整数的情况,所以需要市场价也可以在列表页直接编辑。 1、打开 /admin/templates/goods_list.htm 文件 a href=javascript:listTable.sort(goods_
ECSHOP的缓存存放在temp /文章夹下,时间长了这个文件夹就会非常庞大,拖慢网站速度。还有很多情况我们不需要他的缓存。本文介绍禁用ECSHOP缓存的方法。 ECSHOP的缓存有两部分,一部分是SMARTY的页面缓存;另一部分是SQL查询结果的缓存。这两部分都是保存在t