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

时间:2017-06-26
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方式下,是不是有影响,欢迎大家测试!!!

上一条:WordPress内外网访问问题,图片地址问题解决方法 下一条:dicuz搭建的论坛如何修改改后台地址?

相关文章

最新文章