当前位置:首页 > 网站技术 > 后端技术 > 正文内容

phpcms筛选功能的实现(新手看完就会)

binadmin2020-06-05后端技术183


首先,我是在网上找了很多资料,基本上都是一样的代码,都是复制一段php代码然后调用模板,我也在坑里呆了好久。他们的链接我放在下面,以免误坑。

http://m.genban.org/teach/teach-18352.html 

https://www.cnblogs.com/doophp/p/3670539.html 

https://www.eqifei.net/post-259.html 

https://blog.51cto.com/maifang158/1920124 

https://blog.csdn.net/wydd7522/article/details/51851567# 

https://blog.csdn.net/qq_26697171/article/details/47337383 

https://www.cnblogs.com/yuan9580/p/10592804.html 

https://blog.csdn.net/qq_39376608/article/details/80267956 

https://blog.csdn.net/qq_26697171/article/details/47337383 

最后我在这个文章看到,说phpcms自带的视频有筛选功能,突然我就看见出坑之时了。经过我半上午的研究,最后是弄成功了的,附上我弄好的筛选功能。当然本文部分代码也摘自以上道友的代码

QQ浏览器截图20200604011037.png


1、当然是给网站做好伪静态规则,这里我就不多说了,请移步phpcmsapache服务器的伪静态


我的初始页面如下图所示:

QQ浏览器截图20200603235310.png


2、添加筛选字段

去后台的内容->模型管理->视频模型->字段管理->添加字段(你也可以看看phpcms默认的画质字段,这样通过比对,你就知道该如何添加属于自己的筛选字段)

下图是我自己添加的一个影片类型字段,红色框的都是要注意的,最好是按照我的选择选,毕竟是我实验过的。

QQ浏览器截图20200603235825.png


字段类型选择选项;主表字段选择是(以防出现调不到该字段);

选项列表像我这样,“选项名字|选项值”。这个值最好要有规律,而且要和其他的筛选字段有区分。避免冲突

选项类型可以根据自己需求,这个是填写内容时筛选字段的展示形式

是否作为筛选字段,一定要选是,


3、修改前端模板


文件目录=>/phpcms/templates/default/content/list_video.html 

添加完成后再去video模板里面删掉一些东西,如果你们业务需要就留着,不需要就删掉即可。

我就会删掉不必要的只留下筛选的代码和循环的代码

筛选代码:

QQ浏览器截图20200604001444.png

筛选时分页代码:

QQ浏览器截图20200604001555.png


这是当时我没做出来,花钱请人写的伪静态分页规则,后面凡是用到分页的我都复制了一份,效果还是很好的。源码在这:


<ul class="tpli">
  <li class="clr"><span>按画质:</span> 
    {loop video_filters('exam_style',$modelid,$vision_rang) $r}
    {$r[menu]}
    {/loop}
  </li>
  <li class="clr"><span>按类型:</span> 
    {loop video_filters('exam_area',$modelid,$vision_rang) $r}
    {$r[menu]}
    {/loop}
  </li>
  <li class="clr"><span>按类型2:</span> 
    {loop video_filters('exam_layout',$modelid,$vision_rang) $r}
    {$r[menu]}
    {/loop}
  </li>
</ul>
<div class="bct">
  <ul class="clr col4 col5"> 
    <?php 
    //$urlrule = video_makeurlrule();
    ini_set("display_errors",on);
    //$urlrule = '/case/栏目ID-筛选条件1-筛选条件2-筛选条件3-页数/';
    $where  = array();
    $where['catid'] = $catid;
    $exam_style = $_GET['exam_style'] ? $_GET['exam_style'] : '';
    if($exam_style){
    $where['exam_style'] = $exam_style;
    }
    $exam_area = $_GET['exam_area'] ? $_GET['exam_area'] : '';
    if($exam_area){
    $where['exam_area'] = $exam_area;
    }
    $exam_layout = $_GET['exam_layout'] ? $_GET['exam_layout'] : '';
    if($exam_layout){
    $where['exam_layout'] = $exam_layout;
    }
    ini_set("display_errors",on);
    $urlrule = '/case-'.$catid."-".$exam_area."-".$exam_layout."-".$exam_style."-".page_string().'.html';
    $content_model = pc_base::load_model("content_model");
    $content_model->set_model($modelid);
    $listorder = ' listorder desc,id DESC';
    $page = $_GET['page'];
    if(!$page){
    $page = 1;
    }
    $pagesize = 9;
    $data = $content_model->listinfo($where,$listorder,$page,$pagesize);
    $totalnum = $content_model->count($where);
    $pages = pages($totalnum, $page, $pagesize, $urlrule); ?>
    {loop $data $v} 
    {php $video_info = get_vid($v[id], $v[catid], $isspecial = 0);} 
    <li>
    <a href='{$v[url]}' class="a-img">
    <img src="{$v[thumb]}" alt="">
    </a>
    <a href='{$v[url]}' class="a-title"><h1>楼盘:{$v[title]}</h1></a>
    <hr>
    <p class="style"><span>风格:{$v[lr_style]}</span><b>|</b><span>面积:{$v[lr_area]}㎡</span></p>
    <p class="link"><a class="make-designer" href="javascript:void(0);" name='{$v[title]}'>预约设计</a><a href='{$v[url]}'>查看详情</a></p>
    </li>
    {/loop}
    {/pc}
  </ul>
  {if $pages}
  <div class="pages"> 
    {$pages}
  </div>
  {/if}
</div>

这个时候会出现bug,提示说page_string()不存在


找到phpcms/libs/functions/global.func.php 在20行添加


function page_string() {
return '{$page}';
}


然后点击分页,接着会出现该信息不存在的弹窗。


注意此时的url是:http://php.bin012.com/case-7----2.html

想要判断这是啥错误,就直接用动态url去访问,

那么我这个筛选的动态就是


http://php.bin012.com/index.php?m=content&c=index&a=lists&catid=7&exam_area=&exam_layout=&exam_style=&page=2

QQ浏览器截图20200604004437.png



显而易见,其实这个页面是存在的,那么这就是伪静态规则没有写的原因。去htaccess写关于筛选页的规则


RewriteRule ^case-7-([0-9A-Za-z_]*)-([0-9A-Za-z_]*)-([0-9A-Za-z_]*)-([0-9A-Za-z_]*).html?$ index.php?m=content&c=index&a=lists&catid=7&exam_area=$1&exam_layout=$2&exam_style=$3&page=$4


至于每个值其实很简单,前面是网站显示的url,后面是要指向哪个动态url。

添加完规则后,再去刷新伪静态的页面,此时就和动态的展示一样了。


而在手机端上其实和PC端差不多,你可以复制PC端video筛选模板的代码放在手机端里,再重新走一遍上面的步骤即可实现。

PC端video筛选php函数在:/phpcms/libs/functions/autoload/video.func.php(删掉几个带get前缀的函数)

手机端放置筛选PHP函数在:/phpcms/libs/functions/extention.func.php


其实我并不建议做自适应,麻烦得很。能做响应式还是可以做响应式。

我把手机端的筛选函数上传上来。

extention.txt



<?php
/**
 *  extention.func.php 用户自定义函数库
 *
 * @copyright(C) 2005-2010 phpcms
 * @licensehttp://www.phpcms.cn/license/
 * @lastmodify2010-10-27
 */
function show_linkage($keyid, $linkageid = 0, $modelid = '', $fieldname='zone') {
    $datas = $infos = $array = array();
    $keyid = intval($keyid);
    $linkageid = intval($linkageid);
    //当前菜单id
    $field_value = intval($_GET[$fieldname]);
    $urlrule = structure_filters_url($fieldname,$array,1,$modelid);
    if($keyid == 0) return false;
    $datas = getcache($keyid,'linkage');
    $infos = $datas['data'];
    foreach($infos as $k=>$v){
        if($v['parentid']==$field_value){
          $array[$k]['name'] = $v['name'];
          $array[$k]['value'] = $k;
          $array[$k]['url'] = str_replace('{'.$fieldname.'}',$k,$urlrule);
          $array[$k]['menu'] = $field_value == $k ? '<a href="#" class="ac">'.$v['name'].'</a>' : '<a href="'.$array[$k]['url'].'">'.$v['name'].'</a>';
        }
    }
    return $array;
}
function structure_filters_url($fieldname,$array=array(),$type = 1,$modelid) {
    if(empty($array)) {
        $array = $_GET;
    } else {
        $array = array_merge($_GET,$array);
     }
      //TODO
    $fields = getcache('model_field_'.$modelid,'model');
    if(is_array($fields) && !empty($fields)) {
        ksort($fields);
        foreach ($fields as $_v=>$_k) {
            if($_k['filtertype'] || $_k['rangetype']) {
                if(strpos(URLRULE,'.html') === FALSE) $urlpars .= '&'.$_v.'={$'.$_v.'}';
            else $urlpars .= '-{$'.$_v.'}';
            }
        }
     }
     //后期增加伪静态等其他url规则管理,apache伪静态支持9个参数
     if(strpos(URLRULE,'.html') === FALSE) $urlrule ='/index.php?c=index&a=lists&catid=7&typeid=3'.$urlpars.'&page={$page}' ;
     else $urlrule ='/case-19'.$urlpars.'-{$page}.html';
     //根据get传值构造URL
     if (is_array($array)) foreach ($array as $_k=>$_v) {
         if($_k=='page') $_v=1;
         if($type == 1) if($_k==$fieldname) continue;
         $_findme[] = '/{\$'.$_k.'}/';
         $_replaceme[] = $_v;
     }
     //type 模式的时候,构造排除该字段名称的正则
     if($type==1) $filter = '(?!'.$fieldname.'.)';
     $_findme[] = '/{\$'.$filter.'([a-z0-9_]+)}/';
     $_replaceme[] = '';
     $urlrule = preg_replace($_findme, $_replaceme, $urlrule);
     return  $urlrule;
}
/**
 * 生成分类信息中的筛选菜单
 * @param $field   字段名称
 * @param $modelid  模型ID
 */
function wap_filters($field,$modelid,$diyarr = array()) {
    $fields = getcache('model_field_'.$modelid,'model');
    $options = empty($diyarr) ?  explode("\n",$fields[$field]['options']) : $diyarr;
    $field_value = intval($_GET[$field]);
    foreach($options as $_k) {
        $v = explode("|",$_k);
        $k = trim($v[1]);
        $option[$k]['name'] = $v[0];
        $option[$k]['value'] = $k;
        $option[$k]['url'] = structure_filters_url($field,array($field=>$k),2,$modelid);
        $option[$k]['menu'] = $field_value == $k ? '<a href="#" class="ac">'.$v[0].'</a>' : '<a href="'.$option[$k]['url'].'">'.$v[0].'</a>' ;
    }
    $all['name'] = '全部';
    $all['url'] = structure_filters_url($field,array($field=>''),2,$modelid);
    $all['menu'] = $field_value == '' ? '<a href="#" class="ac">'.$all['name'].'</a>' : '<a href="'.$all['url'].'">'.$all['name'].'</a>';
    array_unshift($option,$all);
    return $option;
}
/**
* 获取联动菜单层级
* @param  $keyid     联动菜单分类id
* @param  $linkageid 菜单id
* @param  $leveltype 获取类型 parentid 获取父级id child 获取时候有子栏目 arrchildid 获取子栏目数组
*/
function get_linkage_level($keyid,$linkageid,$leveltype = 'parentid') {
    $child_arr = $childs = array();
    $leveltypes = array('parentid','child','arrchildid','arrchildinfo');
    $datas = getcache($keyid,'linkage');
    $infos = $datas['data'];
    if (in_array($leveltype, $leveltypes)) {
        if($leveltype == 'arrchildinfo') {
          $child_arr = explode(',',$infos[$linkageid]['arrchildid']);
          foreach ($child_arr as $r) {
             $childs[] = $infos[$r];
          }
        return $childs;
        } else {
            return $infos[$linkageid][$leveltype];
        }
    }        
}
// 根据linkageid递归到父级
function get_parent_url($modelid,$field,$linkageid=0,$array = array()){
    $modelid = intval($modelid);
    if(!$modelid || empty($field)) return false;
    $fields = getcache('model_field_'.$modelid,'model');
    $keyid = $fields[$field]['linkageid'];
    $datas = getcache($keyid,'linkage');
    $infos = $datas['data'];    
    if(empty($linkageid)){
        $linkageid = intval($_GET[$field]);
        if(!$linkageid) return false;
    }   
    $urlrule = structure_filters_url($field,array(),1,$modelid);
    $urlrule = str_replace('{$'.$field.'}',$infos[$linkageid]['parentid'],$urlrule);
    array_unshift($array,array('name'=> $infos[$linkageid]['name'],'url'=>$urlrule));
    if($infos[$linkageid]['parentid']){
        return get_parent_url($modelid,$field,$infos[$linkageid]['parentid'],$array);
    }
    return $array;
}
/**
* 构造筛选时候的sql语句
*/
function structure_filters_sql($modelid) {
    $sql = $fieldname = $min = $max = '';
    $fieldvalue = array();
    $modelid = intval($modelid);
    $model =  getcache('model','commons');
    $fields = getcache('model_field_'.$modelid,'model');
    $fields_key = array_keys($fields);
    //TODO
    $sql = '`status` = \'99\'';
    foreach ($_GET as $k=>$r) {
      if(in_array($k,$fields_key) && intval($r)!=0 && ($fields[$k]['filtertype'] || $fields[$k]['rangetype'])) {
        if($fields[$k]['formtype'] == 'linkage') {
          $datas = getcache($fields[$k]['linkageid'],'linkage');
          $infos = $datas['data'];
          if($infos[$r]['arrchildid']) {
            $sql .=  ' AND `'.$k.'` in('.$infos[$r]['arrchildid'].')';
          }
        } elseif($fields[$k]['rangetype']) {
          if(is_numeric($r)) {
            $sql .=" AND `$k` = '$r'";
          } else {
            $fieldvalue = explode('_',$r);
            $min = intval($fieldvalue[0]);
            $max = $fieldvalue[1] ? intval($fieldvalue[1]) : 999999;
            $sql .=" AND `$k` >= '$min' AND  `$k` < '$max'";
          }
        } else {
          $sql .=" AND `$k` = '$r'";
        }
      }
    }
    return $sql;
}
/**
* 分页,如去掉则分页会有问题
*/
function wap_makeurlrule() {
    if(strpos(URLRULE,'.html') === FALSE) {
       return url_par('page={$'.'page}');
    }
    else {
        $url = preg_replace('/-[0-9]+.html$/','-{$page}.html',get_url());
        return $url;
    }
}
?>


标签: phpcmsapache
分享给朋友:

相关文章

PHPCMS完成手机端搭建全教程(新手看完即会)

PHPCMS完成手机端搭建全教程(新手看完即会)

注:这篇文章是在我做完一个自适应和一个响应式网站后写的。所以我建议,如果可以的话,最好用@media css做响应式网站,这样就不用考虑手机端的各种问题。因为我当初做的就是自适应,但是没有想到后面的坑...

修改phpcms后台添加或编辑时的弹出新窗口

修改phpcms后台添加或编辑时的弹出新窗口

如题,在后台添加内容的时候每次都要弹出新的窗口,所以让内容发布人员极其不爽而我当然是要修改该问题,使新窗口打开不用弹出。找到phpcms\modules\content\templates\conte...

使用火车头采集文章并发布在PHPCMS里(新手看完即会)

使用火车头采集文章并发布在PHPCMS里(新手看完即会)

网上其实有免登录的方法 https://www.gwygd.com/rRz6bMWRO.html但是我用过,发现不能用,所以只好用了登录的方法,所幸成功了。首先下载火车头,里面有phpcms采集文章的...

 PHP入门基础之PHP操作MySQL数据库

PHP入门基础之PHP操作MySQL数据库

1、PHP操作MySQL数据库的三种方式1.PHP mysql扩展PHP2.0版本开始引入,仅提供面向过程的接口通过调用函数实现例子:<?php     ...

PHPCMS列表页ajax动态获取更多(新手看完即会)

PHPCMS列表页ajax动态获取更多(新手看完即会)

本文取自Dong-Ge的phpcms 列表页ajax点击加载更多文章但是在实践过程中,由于我对phpcms的不熟悉导致还是浪费了一点时间经过咨询大佬,终于完美解决。1、在phpcms/model创建一...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信