phpcms筛选功能+分页功能的实现(新手看完就会)
首先,我是在网上找了很多资料,基本上都是一样的代码,都是复制一段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自带的视频有筛选功能,突然我就看见出坑之时了。经过我半上午的研究,最后是弄成功了的,附上我弄好的筛选功能。当然本文部分代码也摘自以上道友的代码
这是做好的页面。
1、在网上下载phpcms v9模板,然后进行安装。
在最后安装成功的时候,会有报错问题,修改页面 phpcms\libs\classes\db_mysqli.class.php 245行和253行 改 continue 为break 即可
2、登陆后台,新建栏目,选择视频模型
目录名自定义,这个设置了后面都要一样。
3、新建url规则
在扩展里新建url规则,然后在管理栏目修改栏目页的url规则,并清除缓存
4、路径报错
此时会出现”生成栏目伪静态显示/%7B$catdir%7D/的错误“问题
在.htaccess文件添加url规则,然后清除url缓存,再次输入静态路径就成功了
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^([0-9A-Za-z_]*)/$ index.php?m=content&c=index&a=lists&catdir=$1 </IfModule>
5、在后台添加筛选字段
去后台的内容->模型管理->视频模型->字段管理->添加字段(你也可以看看phpcms默认的画质字段,这样通过比对,你就知道该如何添加属于自己的筛选字段)
下图是我自己添加的一个影片类型字段,红色框的都是要注意的,最好是按照我的选择选,毕竟是我实验过的。
字段类型选择选项;主表字段选择是(以防出现调不到该字段);
选项列表像我这样,“选项名字|选项值”。这个值最好要有规律,而且要和其他的筛选字段有区分。避免冲突
选项类型可以根据自己需求,这个是填写内容时筛选字段的展示形式
是否作为筛选字段,一定要选是,
6、修改视频模型php模板/phpcms/libs/functions/autoload/video.func.php
改的有点多,我直接复制代码,你们自行比对进行修改
/** * 构造筛选URL */ function video_filters_url($fieldname,$array=array(),$type = 1,$modelid, $isphp = 0) { if(empty($array)) { $array = $_GET; } else { $array = array_merge($_GET,$array); } //$setting = getcache('yp_setting', 'yp'); $fields = getcache('model_field_'.$modelid,'model'); if(is_array($fields) && !empty($fields)) { ksort($fields); foreach ($fields as $_v=>$_k) { // gai if($_k['filtertype'] || $_k['rangetype']) { //此处要改 $urlpars .= '-{$'.$_v.'}'; } } } //伪静态url规则管理,apache伪静态支持9个参数 // 注释 $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid=19&modelid='.$modelid.$urlpars.'&page={$page}'; // 注释 if(strpos(URLRULE,'.html') === FALSE) $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid={$catid}'.$urlpars.'&page={$page}' ; $urlrule = APP_PATH.'case-7'.$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.'}/'; if (strpos('_', $_v)===false) { $_v = intval($_v); } else { $str_arr = explode('_', $_v); $str_arr = array_map("intval", $str_arr); $_v = implode('_', $str_arr); } $_replaceme[] = $_v; } //type 模式的时候,构造排除该字段名称的正则 if($type==1) $filter = '(?!'.$fieldname.'.)'; $_findme[] = '/{\$'.$filter.'([a-z0-9_]+)}/'; $_replaceme[] = ''; $urlrule = preg_replace($_findme, $_replaceme, $urlrule); //此处删掉 // 注释 $b = isset($_GET['b']) ? intval($_GET['b']) : 1; // 注释 $urlrule .='&b='.$b; return $urlrule; }
7、修改前端模板list_video.html
文件目录=>/phpcms/templates/default/content/list_video.html
添加完成后再去video模板里面删掉一些东西,如果你们业务需要就留着,不需要就删掉即可。
我就会删掉不必要的只留下筛选的代码和循环的代码。
video_filters传入三个参数,第一个为筛选字段名,后面两个默认不用改
筛选代码:
筛选时分页代码:
这是伪静态分页规则,后面凡是用到分页的我都复制了一份,效果还是很好的。源码在这:
<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
显而易见,其实这个页面是存在的,那么这就是伪静态规则没有写的原因。去.htaccess写关于筛选页的规则
这个地方要注意和自己命名的栏目名字一样,然后就是catid
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
下面是video.func.php代码:
<?php /** * 生成分类信息中的筛选菜单 * @param $field 字段名称 * @param $modelid 模型ID * @param $diyarr 数据包 * @param $isall 是否显示全部 */ function video_filters($field = '',$modelid,$diyarr = array(),$isall = 1) { $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'] = video_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>'; } if ($isall) { $all['name'] = L('all'); $all['url'] = video_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; } /** * 构造筛选URL */ function video_filters_url($fieldname,$array=array(),$type = 1,$modelid, $isphp = 0) { if(empty($array)) { $array = $_GET; } else { $array = array_merge($_GET,$array); } //$setting = getcache('yp_setting', 'yp'); $fields = getcache('model_field_'.$modelid,'model'); if(is_array($fields) && !empty($fields)) { ksort($fields); foreach ($fields as $_v=>$_k) { // gai if($_k['filtertype'] || $_k['rangetype']) { $urlpars .= '-{$'.$_v.'}'; } } } //伪静态url规则管理,apache伪静态支持9个参数 // $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid=19&modelid='.$modelid.$urlpars.'&page={$page}'; // if(strpos(URLRULE,'.html') === FALSE) $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid={$catid}'.$urlpars.'&page={$page}' ; // else $urlrule =APP_PATH.'case/{$catid}'.$urlpars.'-{$page}.html'; $urlrule = APP_PATH.'shai-6'.$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.'}/'; if (strpos('_', $_v)===false) { $_v = intval($_v); } else { $str_arr = explode('_', $_v); $str_arr = array_map("intval", $str_arr); $_v = implode('_', $str_arr); } $_replaceme[] = $_v; } //type 模式的时候,构造排除该字段名称的正则 if($type==1) $filter = '(?!'.$fieldname.'.)'; $_findme[] = '/{\$'.$filter.'([a-z0-9_]+)}/'; $_replaceme[] = ''; $urlrule = preg_replace($_findme, $_replaceme, $urlrule); // $b = isset($_GET['b']) ? intval($_GET['b']) : 1; // $urlrule .='&b='.$b; return $urlrule; } /** * 构造筛选时候的sql语句 */ function video_filters_sql($modelid,$catid) { $sql = $fieldname = $min = $max = ''; $fieldvalue = array(); $modelid = intval($modelid); $model = getcache('video_model','model'); $fields = getcache('model_field_'.$modelid,'model'); $fields_key = array_keys($fields); //TODO $siteid = get_siteid(); $sql = '`status` = \'99\''; $category = getcache('category_content_'.$siteid); if ($category[$catid]['child']) { $sql .= ' AND `catid` IN('.$datas[$catid]['arrchildid'].')'; } else { $sql .= ' AND `catid`=\''.$catid.'\''; } 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]['formtype'] == 'catids') { $datas = getcache('category_content_'.$modelid); if ($datas[$r]['child']) { $sql .= ' AND `'.$k.'` IN('.$datas[$r]['arrchildid'].')'; } else { $sql .= ' AND `'.$k.'`=\''.$r.'\''; } } 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 video_makeurlrule() { $setting = getcache('video', 'video'); if($setting['enable_rewrite'] == 0) { return url_par('page={$'.'page}'); } else { $url = preg_replace('/-[0-9]+.html$/','-{$page}.html',get_url()); return $url; } } function player_code($id = 'video_player',$channelid,$vid,$width = 622, $height = 460, $style_projectid = '') { if(!$channelid) return 'channelid empty!'; if(!$vid) return 'vid empty!'; $player = getcache('player', 'video'); $player_config = $player[$channelid]; $default_style = $player_config['default']; $style_projectid = $style_projectid ? $style_projectid : $default_style; $_config = $player_config['STY-'.$style_projectid]; if(empty($_config)) return 'style error!'; $playerurl = pc_base::load_config('ku6server', 'player_url').$vid.'/style/'.$style_projectid.'/v.swf'; $string = '<embed id="'.$id.'" name="'.$id.'" src="'.$playerurl.'" width="'.$width.'" height="'.$height.'" quality="high" align="middle" allowScriptAccess="always" allowfullscreen="true" type="application/x-shockwave-flash"></embed>'; return $string; } ?>
手机端放置筛选PHP函数在:/phpcms/libs/functions/extention.func.php
其实我并不建议做自适应,麻烦得很。能做响应式还是可以做响应式。
下面是手机端的筛选PHP函数模板:
<?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; } } ?>