实现功能前上网查阅了资料,网上有分享的源码,大多是复制转发, 千篇一律下载帝国官方给出的插件,然后再在数据库表新建字段,配几张图,没有具体实现的解说详细过程,下面详细讲实现步骤,以帝国EmpireCMS v7.5 Free (201804091030) 版本为例。
一:首先把下面的代码复制到很目录 e/class/userfun.php 文件里面去:
<?php //---------------------------用户自定义标签函数文件 //显示结合项筛选选项 function user_ShowFieldandChange($val,$fieldandvar,$fieldandcss,$changefieldandcss,$fieldexp,$valexp,$val3,$ecms=0){ global $public_r,$navclassid; $fieldandval=$val; $fieldandvart=$fieldandvar; $fieldandvar=str_replace('#',',',$fieldandvar); //附加参数 $urlcs=''; $mid=(int)$_GET['mid']; if($mid){ $urlcs.='&mid='.$mid; } if($_GET['classid']) { $classid=RepPostVar($_GET['classid']); $urlcs.='&classid='.$classid; } else { $urlcs.='&classid='.$navclassid; } if($_GET['ttid']) { $ttid=RepPostVar($_GET['ttid']); $urlcs.='&ttid='.$ttid; } if($_GET['ztid']) { $ztid=RepPostVar($_GET['ztid']); $urlcs.='&ztid='.$ztid; } if($_GET['endtime']) { $starttime=RepPostVar($_GET['starttime']); $endtime=RepPostVar($_GET['endtime']); $urlcs.='&starttime='.$starttime.'&endtime='.$endtime; } $line=(int)$_GET['line']; if($line) { $urlcs.='&line='.$line; } $tempid=(int)$_GET['tempid']; if($tempid) { $urlcs.='&tempid='.$tempid; } if($_GET['orderby']){ $orderby=RepPostVar($_GET['orderby']); $myorder=(int)$_GET['myorder']; $urlcs.='&orderby='.$orderby.'&myorder='.$myorder; } //间隔字符 $fieldexpr=explode('|',$fieldexp); $valexpr=explode('|',$valexp); //上下级 $frt=explode(',',$fieldandvart); $ftcount=count($frt); //输出选项 $fr=explode(',',$fieldandvar); $fcount=count($fr); $allstr=''; foreach ($_GET as $key=>$val){ if($val && in_array($key, $fr)){ $url_this=$key.'='.urlencode($val); $url=str_replace($url_this,'',$_SERVER[REQUEST_URI]); $tj='<br/><span style="padding:6px0 6px 15px;font-weight: 700;margin: 0 20px;font-size:1.3em;">已选择条件:</span>'; $yixuan.='<a class="del_jhx" href="'.$url.'">'.$val.' </a> '; } } echo $tj.$yixuan; $urladd=''; for($i=0;$i<$fcount;$i++){ $nofield=""; $field=$fr[$i]; for($ti=0;$ti<$ftcount;$ti++) { $frtval=explode('#',$frt[$ti]); if($field==$frtval[0]){$nofield="&".$frtval[1]."=";} } //选项链接 $getval=''; if($_GET[$field]) { $getval=htmlspecialchars($_GET[$field],ENT_QUOTES); $urladd.='&'.$field.'='.urlencode($getval); } //选项说明 $vsayr=explode('|==|',$fieldandval[$field]); //选项内容 $valallstr=''; $vr=explode('|',$vsayr[1]); $vcount=count($vr); for($vi=0;$vi<$vcount;$vi++) { $vtr=explode(',',$vr[$vi]); if($getval==$vtr[1]) { $css=$changefieldandcss; } else { $css=$fieldandcss; } $valallstr.=$valexpr[0].'<a href="/e/action/ListInfo.php?'.$urlcs.'&ph=1<!--url.add-->&'.$field. '='.urlencode($vtr[1]).$nofield.'" class="'.$css.'">'.$vtr[0].'</a>'.$valexpr[1]; } //自定义样式 实现二级自定义样式 if($val3[$field]!=""){ $fieldexpr2=explode('|',$val3[$field]); $allstr[$i]=$fieldexpr2[0].$vsayr[0].$valallstr.$fieldexpr2[1]; } else{ $allstr[$i]=$fieldexpr[0].$vsayr[0].$valallstr.$fieldexpr[1]; } //清空没有数据的行 if($vcount==1){$allstr[$i]=""; } } $allstr=str_replace('<!--url.add-->',$urladd,$allstr); return $allstr; } ?>
二:然后再把下面的代码放到需要显示筛选功能的模板页面里面
<style>.fieldandcss{}.changefieldandcss{background:#4598D2;color:#fff;}.del_jhx{ border:1px solid #0CF; padding:2px;}</style> <?php $GET=$_GET; //------- 函数参数设置开始 ----- //要显示的结合项字段列表,多个字段用半角逗号“,”隔开 如果是二级关系用 “#” $fieldandvar='myarea,jiage,jushi';//需要结合查询的字段名 //正常链接样式 $fieldandcss='fieldandcss'; //已选的选项链接样式 $changefieldandcss='changefieldandcss'; //字段与字段的显示间隔符,格式:开始显示字符|结束显示字符 $fieldexp='<table><tr><td>|</td></tr></table>'; //选项与选项的显示间隔符,格式:开始显示字符|结束显示字符 $valexp='| '; //字段显示选项设置,多项用“|”号隔开,格式:选项说明|==|内容1,值1|内容2,值2 $val=array(); $val2=array(); $val3=array(); $val['myarea']='<br/><b>区域:</b>|==|不限,|东城,东城区|朝阳,朝阳区|崇文,崇文区|宣武,宣武区|海淀,海淀区|丰台,丰台区|牡丹区,牡丹|长江路,长江'; $val['jiage']='<b>价格:</b>|==|不限,|2000以下,1__2000|2000-3000,2000__3000|3000-4000,3000__4000|4000-5000,4000__5000|5000-6000,5000__6000|6000-7000,6000__7000|7000以上,7000__9999999'; $val['jushi']='<b>户型:</b>|==|不限,|一居,一居|两居,两居|三居,三居|四居,四居|五居,五居|五居以上,五居以上'; $val3['jiage']='<div class="gzw">|</div><br/>'; $val3['myarea']='<div class="gzw">|</div><br/>'; $val3['jushi']='<div class="gzw">|</div><br/>'; $g=user_ShowFieldandChange($val,$fieldandvar,$fieldandcss,$changefieldandcss,$fieldexp,$valexp,$val3); ?> <?=$g[0]?> <?=$g[1]?> <?=$g[2]?> <?=$g[3]?> <?=$g[4]?>
以上两部分代码添加完,后台刷新相关页面的缓存,基本效果就出来了。
点击选项你会发现可能不起作用,没有对应的文章被筛选出来,那是因为源码需要修改,获取的字段修改为你需要结合查询字段就可以了,下面讲如何添加自己需要的字段或直接使用已有的字段查询。
这里需要例子,我安装的帝国cms使用的都是自带数据,菜单也没修改,如果你修改过,除非你帝国cms很理解,不然建议本地搭建测试,理解思路了再修改。
以导航菜单里的分类信息栏目为例
登录后台》系统》 数据表与系统模型》 管理数据表 》 分类信息数据表 》 [管理字段]
管理字段用来查询或添加我们需要的字段名,最后修改对应源码索引的字段名
这里我添加了两个不存在但是需要的字段,添加完字段在对应栏目添加发布文章内容时就会出现我们添加的字段,让我填写信息,下面是自己添加字段时的注意项
点击添加字段,添加需要的字段,如下图
只添加红色标注的选项即可,填好直接提交,刷新管理字段就看到了
然后我们添加文章内容时就可以看到我们添加的字段了,后台可以添加,前台页面还没有调用显示我们添加的字段,除非你不需要它显示,我们打开需要显示的页面模板添加字段标签,默认字段调用标签格式为[!–你的英文字段名–],至于样式是套用其他标签还是自己写都行,前台模板添加完标签代码保存,然后发布文章试试看看是否添加成功,记得后台刷新模板缓存哦。下面是模板调用事例截图:
然后我们再打开
系统》 数据表与系统模型》 管理数据表 》 分类信息数据表 》 [管理系统模型]
按上图红色选区修改勾选对应的选项,最后点击提交即可。
然后需要的字段都添加好了,去修改第二步放在模板里的源码,
这里筛选内容格式为|模板里显示的词,要查询的字段属性的值|, 字段属性的值要对应你后台字段里添的或下拉选择的值,价格区间格式为 |模板里显示的词,
要查询的字段属性的取值范围|
修改完复制到需要显示筛选的模板里保存刷新缓存即可,然后添加内容去试试筛选功能吧。
当然网上有的教程说的是直接把上面放模板里的源码封装在userfun.php里,如下图,在函数里定义个函数方法,在要结合项属性筛选的地方加上php函数调用代码:
<?=user_ShowFieldandChange()?>
<?php //---------------------------用户自定义标签函数文件 //显示结合项筛选选项 function user_ShowFieldandChange($ecms=0){ global $public_r; //------- 函数参数设置开始 ----- //要显示的结合项字段列表,多个字段用半角逗号“,”隔开 $fieldandvar='quyu,zujin,tingshi,fangshi'; //字段显示选项设置,多项用双“#”号隔开,格式:选项说明|==|内容1,值1##内容2,值2 $fieldandval=array(); $fieldandval['quyu']='<dt>区域:</dt><dd> |==|不限,##全鞍山,全鞍山##铁东,铁东##铁西,铁西##立山,立山##千山,千山'; $fieldandval['zujin']='<dt>租金:</dt><dd> |==|不限,##500元以下,1__499##500-1000元,500__999##1000-1500元,1000__1499##1500-2000元, 1500__1999##2000-3000元,2000_2999##3000-4500元,3000__4499##4500元以上,4500__99999999'; $fieldandval['tingshi']='<dt>厅室:</dt><dd> |==|不限,##一室,一室##两室,两室##三室,三室##四室,四室##四室以上,四室以上'; $fieldandval['fangshi']='<dt>方式:</dt><dd> |==|不限,##整套出租,整套出租##单间出租,单间出租##床位,床位'; //正常链接样式 $fieldandcss='fieldandcss'; //已选的选项链接样式 $changefieldandcss='select'; //字段与字段的显示间隔符,格式:开始显示字符|结束显示字符 $fieldexp='<dl class="secitem">|</dd></dl>'; //选项与选项的显示间隔符,格式:开始显示字符|结束显示字符 $valexp=" |"; //------- 函数参数设置结束 ----- //附加参数 $urlcs=''; $mid=(int)$_GET['mid']; if($mid) { $urlcs.='&mid='.$mid; } if($_GET['classid']) { $classid=RepPostVar($_GET['classid']); $urlcs.='&classid='.$classid; } if($_GET['ttid']) { $ttid=RepPostVar($_GET['ttid']); $urlcs.='&ttid='.$ttid; } if($_GET['ztid']) { $ztid=RepPostVar($_GET['ztid']); $urlcs.='&ztid='.$ztid; } if($_GET['endtime']) { $starttime=RepPostVar($_GET['starttime']); $endtime=RepPostVar($_GET['endtime']); $urlcs.='&starttime='.$starttime.'&endtime='.$endtime; } $line=(int)$_GET['line']; if($line) { $urlcs.='&line='.$line; } $tempid=(int)$_GET['tempid']; if($tempid) { $urlcs.='&tempid='.$tempid; } if($_GET['orderby']) { $orderby=RepPostVar($_GET['orderby']); $myorder=(int)$_GET['myorder']; $urlcs.='&orderby='.$orderby.'&myorder='.$myorder; } //间隔字符 $fieldexpr=explode('|',$fieldexp); $valexpr=explode('|',$valexp); //输出选项 $fr=explode(',',$fieldandvar); $fcount=count($fr); $allstr=''; $urladd=''; for($i=0;$i<$fcount;$i++) { $field=$fr[$i]; //选项链接 $getval=''; if($_GET[$field]) { $getval=htmlspecialchars($_GET[$field],ENT_QUOTES); $urladd.='&'.$field.'='.urlencode($getval); } //选项说明 $vsayr=explode('|==|',$fieldandval[$field]); //选项内容 $valallstr=''; $vr=explode('##',$vsayr[1]); $vcount=count($vr); for($vi=0;$vi<$vcount;$vi++) { $vtr=explode(',',$vr[$vi]); if($getval==$vtr[1]) { $css=$changefieldandcss; } else { $css=$fieldandcss; } $valallstr.=$valexpr[0].'<a href="'.$public_r['newsurl'].'e/action/ListInfo.php?'.$urlcs.'&ph=1<!--url.add-->&'.$field.'='.urlencode($vtr[1]).'" class="'.$css.'">'.$vtr[0].'</a>'.$valexpr[1]; } $allstr.=$fieldexpr[0].$vsayr[0].$valallstr.$fieldexpr[1]; } $allstr=str_replace('<!--url.add-->',$urladd,$allstr); echo $allstr; } ?>
不同页面需要筛选不同的内容可以复制上面的代码,修改为不同的函数方法名和字段名再引用。