### [phpcms文章如何筛选分类?](https://www.prosaas.cn/article/4111) **Published:** 2020-06-10T02:55:48 **Author:** 5201314 **Excerpt:** phpcms文章如何筛选分类phpcms文章筛选分类的方法:首先,用下面这些代码替换掉phpcms/libs/… **** **phpcms文章如何筛选分类** **phpcms文章筛选分类的方法:** 首先,用下面这些代码替换掉phpcms/libs/functions/extention.func.php的内容 $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 ? ''.$v\['name'\].'' : ''.$v\['name'\].'' ; } } return $array; } /\*\* \* 构造筛选URL \*/ 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 =APP\_PATH.'index.php?m=content&c=index&a=lists&catid={$catid}'.$urlpars.'&page={$page}' ; else $urlrule =APP\_PATH.'list-{$catid}'.$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 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 ? ''.$v\[0\].'' : ''.$v\[0\].'' ; } $all\['name'\] = '全部'; $all\['url'\] = structure\_filters\_url($field,array($field=>''),2,$modelid); $all\['menu'\] = $field\_value == '' ? ''.$all\['name'\].'' : ''.$all\['name'\].''; 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 makeurlrule() { if(strpos(URLRULE,'.html') === FALSE) { return url\_par('page={$'.'page}'); } else { $url = preg\_replace('/-\[0-9\]+.html$/','-{$page}.html',get\_url()); return $url; } } ?> 然后,内容——模型管理——选择一个模型添加新字段,如图。  最后,在要调用产品筛选的栏目模板页添加标签 ,如下。 性别: {loop filters('xingbie',$modelid) $r} {$r\[menu\]} {/loop} {php $sql = structure\_filters\_sql($modelid)} {php $urlrule = makeurlrule()} {pc:content action="lists" where="$sql" catid="$catid" num="10" order="id DESC" page="$page" urlrule="$urlrule"}