• phpcms联动筛选


    联动筛选的问题

    参考地址0 https://blog.csdn.net/wydd7522/article/details/51851567 (这个最符合我单选的需求)
    参考地址1 https://blog.51cto.com/maifang158/1920124 (我复制的是这个,但这个有点坑,函数少一些符号,但是函数比较全)
    参考地址2 http://www.boxcms.cn/show-15-111-1.html (这个参考地址比较靠谱,但函数不全)
    参考地址3 http://www.bin012.com/?p=591 这个最全
    参考两者的东西,最终形成了最完善的版本。点击下载

    扩展函数的来源

    其实这些函数,都是从phpcms的分类信息模块的函数复制过来的。所有的分类信息函数如下:
    下载地址。当然,这个是最老的分类信息模块了,最新版的已经找不到了,但是很多人,都在使用这里的函数,来做筛选。

    复制内容如下

    phpcms v9实现数据内容筛选功能,很多人都想要这个功能,今天我就讲一下我是怎么实现phpcms v9数据内容筛选功能的

    注意:此教程目前只适用于动态页面,并且可能有些不完善的地方,因为数据是直接读取SQL的,所以会把同模型的其他栏目数据调用出来。所以建议单独新建一个模型。

    第一步: 添加字段:

    后台 --> 内容 --> 内容相关设置 --> 模型管理 --> 文章模型 --> 字段管理 --> 添加字段

    如下示例

    第二步:添加自定义函数:(他这个函数代码,是错了,但是我还是粘贴出来了)

    建议下载 这个包。有具体的函数,以及使用方法。点击下载
    将以下代码添加到 phpcms/libs/functions/extention.func.php 文件

    复制了代码以后,网站就500了,应该是代码内部的语法出了问题。
    这是因为,我可能以前在某处,加载过这个文件,重复的加载了这些函数,所以会报500错误,再说一次,千万不要搞phpcms,这些报错,真的很恶心,你要排查半天。最终发现,我在auoload文件里,加载了 phpcms的 分类信息函数,那些函数,跟新增的函数重名了。
    

    (注:makeurlrule函数对分页是否能传递相关参数很重要!)

    第三步:前台模板调用

    //选项调用
    {loop filters('chengshi',1) $r}
    			{$r[menu]}
    			{/loop}
    //信息调用
    {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;   
    }   
    }
    

    第五步:解决分页数量不对的问题

    通过研究缓存得知,调用分页总数的函数是:

    $content_total = $content_tag->count(array('catid'=>$catid,'where'=>$sql,'modelid'=>$modelid,'moreinfo'=>'1','limit'=>$offset.",".$pagesize,'action'=>'lists',));
    

    通过这个,找到phpcmsmodulescontentclassescontent_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这个参数!
    大功告成,这样既然正常分页传参,也能正常获取当前栏目信息,获取的信息总数也正确了

    -------------------------------------

    他是这样说,具体对不对,我不知道!测试一下吧。

    问题1.文章说,必须修改原来的url为动态url模式才行。我的解决办法

    首先,网站已经使用了自定义的url规则,下图标红的是我使用的。

    确实,在生成选项的时候,是会出现访问权限不存在的问题,因为url中没有传入catid参数。
    我的解决办法是

    <!--获取当前请求的url,检测是否存在catid的值,后续,判断,如果存在,就直接返回筛选的url,如果不存在,就添加上-->
    {php $urlstr=$_SERVER['REQUEST_URI']}
    {php $flag=preg_match('/catid=d*/',$urlstr)}	 
    
    <div class="info_tit">
    	   <h2>{$catname}</h2>
    	   <div class="xifen">
    	  
    	  <!--根据url是否存在catid进行操作-->
    		{if $flag==true}
    			{loop filters('chengshi',1) $r}
    			{$r[menu]}
    			{/loop}
    		
    		{else}
    			{loop filters('chengshi',1) $r}
    			{php $jiaru="catid="}
    			{php $jiaru=$jiaru.$catid}
    			{str_replace('catid=',$jiaru,$r[menu])}
    			{/loop}
    		{/if}
    
    	   
    	   </div>
    </div>
    
  • 相关阅读:
    BZOJ 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)
    BZOJ 2141 排队 (三维偏序CDQ+树状数组)
    BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
    BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)
    BZOJ 4012 [HNOI2015]开店 (树分治+二分)
    CF1090H Linearization
    BZOJ 4141 [Thu Summer Camp 2013]魔塔
    luogu P4654 [CEOI2017]Mousetrap
    luogu P4548 [CTSC2006]歌唱王国
    [总结] min-25筛
  • 原文地址:https://www.cnblogs.com/cn-oldboy/p/12885602.html
Copyright © 2020-2023  润新知