发布时间:2017-03-25 来源:未知 浏览:404 关键词:

很多织梦建站的站长在做产品列表页的时候,产品分类多而且都是关联的,用户不能快速的找到自己需要的东西,很多情况下都需要用到筛选功能,织梦后台列表页默认是没有联动筛选功能,实现这个联动筛选功能需要对织梦进行二次开发,接下来教大家如何实现这个联动筛选功能,如下图所示:

:因为织梦默认是禁止使用php标签,所以需要在后台模板引擎禁用标签里面解除这个标签的禁用,具体方法:
后台——系统——系统基本参数——其它选项——模板引擎禁用标签:php
将这个PHP去掉后保存就可以了!

第一步:打开arc.listview.class.php 找到:if(empty($cfg_need_typeid2)) $cfg_need_typeid2 = 'N';  
在下面加入以下代码:
 
//联动筛选获得附加表的相关信息
$addtable  = $this->ChannelUnit->ChannelInfos['addtable'];
if($addtable!="")
{
$addJoin = " LEFT JOIN `$addtable` ON arc.id = ".$addtable.'.aid ';
$addField = '';
$fields = explode(',',$this->ChannelUnit->ChannelInfos['listfields']);
foreach($fields as $k=>$v)
{
$nfields[$v] = $k;
}
if(is_array($this->ChannelUnit->ChannelFields) && !empty($this->ChannelUnit->ChannelFields))
{
foreach($this->ChannelUnit->ChannelFields as $k=>$arr)
{
if(isset($nfields[$k]))
{
if(!empty($arr['rename'])) {
$addField .= ','.$addtable.'.'.$k.' as '.$arr['rename'];
}
else {
$addField .= ','.$addtable.'.'.$k;
}
}
}
}
if (isset($_REQUEST['tid']))
{
foreach($_GET as $key => $value) {
$filtersql .= ($key!="tid" && $key!="TotalResult" &&
$key!="PageNo") ? " AND $addtable.".wwwcms_filter($key)." =
'".wwwcms_filter(urldecode($value))."'" : '';
}
}
}
else
{
$addField = '';
$addJoin = '';
}

第二步:打开extend.func.php文件在底部加入以下代码:

/*联动筛选字符过滤函数*/
function wwwcms_filter($str,$stype="inject") {
  if ($stype=="inject")  {
   $str = str_replace(
          array( "select", "insert", "update", "delete", "alter",
"cas", "union", "into", "load_file", "outfile", "create", "join",
"where", "like", "drop", "modify", "rename", "'", "/*", "*", "../",
"./"),
       array("","","","","","","","","","","","","","","","","","","","","",""),
       $str);
  } else if ($stype=="xss") {
   $farr = array("/\s+/" ,
                 "/<(\/?)(script|META|STYLE|HTML|HEAD|BODY|STYLE
|i?frame|b|strong|style|html|img|P|o:p|iframe|u
|em|strike|BR|div|a|TABLE|TBODY|object|tr|td
|st1:chsdate|FONT|span|MARQUEE|body|title |\r\n|link
|meta|\?|\%)([^>]*?)>/isU",
        "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",
        );
   $tarr = array(" ",
                 "",
        "\\1\\2",
        );
   $str = preg_replace($farr, $tarr, $str);
   $str = str_replace(
          array( "<", ">", "'", "\"", ";", "/*", "*", "../", "./"),
       array("&lt;","&gt;","","","","","","",""),
       $str);
  }
  return $str;
 }
 
/**
  *  载入自定义表单(用于发布)
  *
  * @access    public
  * @param     string  $fieldset  字段列表
 * @param     string  $loadtype  载入类型
 * @return    string
  */
 
 function AddFilter($channelid, $type=1, $fieldsnamef, $defaulttid, $loadtype='autofield')
 {
  global $tid,$dsql,$id;
  $tid = $defaulttid ? $defaulttid : $tid;
  if ($id!="")
  {
   $tidsq = $dsql->GetOne(" Select typeid From `dede_archives` where id='$id' ");
   $tid = $tidsq["typeid"];
  }
  $nofilter = (isset($_REQUEST['TotalResult']) ?
"&TotalResult=".$_REQUEST['TotalResult'] :
'').(isset($_REQUEST['PageNo']) ? "&PageNo=".$_REQUEST['PageNo'] :
'');
  $filterarr = wwwcms_filter(stripos($_SERVER['REQUEST_URI'],
"list.php?tid=") ? str_replace($nofilter, '', $_SERVER['REQUEST_URI']) :
$GLOBALS['cfg_cmsurl']."/plus/list.php?tid=".$tid);
     $cInfos = $dsql->GetOne(" Select * From  `dede_channeltype` where id='$channelid' ");
  $fieldset=$cInfos['fieldset'];
  $dtp = new DedeTagParse();
     $dtp->SetNameSpace('field','<','>');
     $dtp->LoadSource($fieldset);
     $dede_addonfields = '';
     if(is_array($dtp->CTags))
     {
         foreach($dtp->CTags as $tid=>$ctag)
         {
             $fieldsname = $fieldsnamef ? explode(",", $fieldsnamef) : explode(",", $ctag->GetName());
    if(($loadtype!='autofield' || ($loadtype=='autofield' &&
$ctag->GetAtt('autofield')==1)) &&
in_array($ctag->GetName(), $fieldsname) )
             {
                 $href1 = explode($ctag->GetName().'=', $filterarr);
     $href2 = explode('&', $href1[1]);
     $fields_value = $href2[0];
     $dede_addonfields .= '<dl><dt>'.$ctag->GetAtt('itemname').':</dt><dd>';
     switch ($type) {
      case 1:
       $dede_addonfields .=
(preg_match("/&".$ctag->GetName()."=/is",$filterarr,$regm) ?
'<a  title="全部"
href="'.str_replace("&".$ctag->GetName()."=".$fields_value,"",$filterarr).'">全部</a>'
: '<dd><a class="on">全部</a>').'';
     
       $addonfields_items = explode(",",$ctag->GetAtt('default'));
       for ($i=0; $i<count($addonfields_items); $i++)
       {
        $href = stripos($filterarr,$ctag->GetName().'=') ?
str_replace("=".$fields_value,"=".urlencode($addonfields_items[$i]),$filterarr)
:
$filterarr.'&'.$ctag->GetName().'='.urlencode($addonfields_items[$i]);//echo
$href;
        $dede_addonfields .=
($fields_value!=urlencode($addonfields_items[$i]) ? '<a
 title="'.$addonfields_items[$i].'"
href="'.$href.'">'.$addonfields_items[$i].'</a>' : '<a
class="on">'.$addonfields_items[$i].'</a>');
       }
       $dede_addonfields .= '</dd></dl>';
      break;
     
      case 2:
       $dede_addonfields .= '<select
name="filter"'.$ctag->GetName().'
onchange="window.location=this.options[this.selectedIndex].value">
        '.'<option
value="'.str_replace("&".$ctag->GetName()."=".$fields_value,"",$filterarr).'">全部</option>';
       $addonfields_items = explode(",",$ctag->GetAtt('default'));
       for ($i=0; $i<count($addonfields_items); $i++)
       {
        $href = stripos($filterarr,$ctag->GetName().'=') ?
str_replace("=".$fields_value,"=".urlencode($addonfields_items[$i]),$filterarr)
:
$filterarr.'&'.$ctag->GetName().'='.urlencode($addonfields_items[$i]);
        $dede_addonfields .= '<option
value="'.$href.'"'.($fields_value==urlencode($addonfields_items[$i]) ? '
selected="selected"' :
'').'>'.$addonfields_items[$i].'</option>
        ';
       }
       $dede_addonfields .= '</select><br/>
       ';
      break;
     }
             }
         }
     }
  echo $dede_addonfields;
 }

第三步:到这里PHP文件修改的部分就完成了!接下来就需要给指定的模型添加字段了,这里需要注意的就是 字段类型的选择,字段类型需要选择单选按钮或者使用select下拉框,如下图所示:

第四部: 前台调用标签

{dede:php}AddFilter(3,1,'fenleia,fenleib,fenleic');{/dede:php}
注:标签说明:
AddFilter函数里面的第一个数字3是内容模型的id号,各个内容模型的id请到后台内容模型管理里面查看;
第二个数字1是表示筛选的样式,1是使用超链接进行选择,2是使用select下拉框选择,具体可以自己设置了查看效果;
第三个部分'fenleia,fenleib,fenleic'是要添加筛选功能的字段名,这里有3个字段,注意需要用半角逗号隔开。

织梦DEDE分类信息实现联动筛选(支持多条件多级选项)解决方案的更多相关文章

  1. [转载]织梦DEDE多选项筛选_联动筛选功能的实现_二次开发

    织梦默认的列表页没有筛选功能,但有时候我们做产品列表页的时候,产品的字段比较多,很多人都需要用到筛选功能,这样可以让用户更方便的找到自己所需要的东西,实现这个联动筛选功能需要对织梦进行二次开发,下面就 ...

  2. 织梦DEDE多选项筛选_联动筛选功能的实现_二次开发

    织梦默认的列表页没有筛选功能,但有时候我们做产品列表页的时候,产品的字段比较多,很多人都需要用到筛选功能,这样可以让用户更方便的找到自己所需要的东西,实现这个联动筛选功能需要对织梦进行二次开发,下面就 ...

  3. 织梦dede文章列表调用标签的用法和规则

    织梦dede列表标签在任何模板的网站中都可能会使用到,而且我们在仿站的时候也经常要使用到列表标签.这里主机吧就给大家讲一下文章列表以及图片列表.软件列表以及分类信息列表标签的用法,和结合div+css ...

  4. 织梦dede模板中广告的去除方法?

    织梦)dede模板中广告的去除方法1.我们先删除头部的广告,找到templetsdefault下的head.htm文件,打开后找到<div>{dede:myad name=’innerTo ...

  5. 织梦DEDE网站后台如何上传附件

    如题,织梦DEDE网站后台如何上传附件?今天本人遇到这样的问题,在网站后台里点击一番后,成功上传了一个pdf文件和doc文件,特来分享经验. 工具/原料 织梦dede网站 doc文件 方法/步骤 1 ...

  6. 织梦(DEDE)CMS V5.3 覆盖任意变量导致远程包含漏洞

    漏洞版本: 织梦(DEDE)CMS V5.3 漏洞描述: 织梦内容管理系统,最强大的中文开源CMS网站管理项目,使用PHP+MySQL架构. 在文件include/common.inc.php中: f ...

  7. 织梦dede模板中调用会员信息标签的方法

    织梦CMS v5.7调用文章所属会员信息标签 打开官方默认模板article_artcile.htm,我们可以提取出如下代码: {dede:memberinfos} 会员头像:<a href=& ...

  8. 织梦 dede 笔记

    将项目转移到另一服务器 方法: https://www.genban.org/news/dedecms-13096.html 在实际中,我走的是第二种方法 方法一: 1  后台>系统>备份 ...

  9. 织梦dede如何去除Power by DedeCms

    自从dedecms织梦系统更新到6.7日的版本,底部版权信息调用标签{dede:global.cfg_powerby/}会自动加上织梦官方的链接[Power by DedeCms ],想必很多新用户使 ...

随机推荐

  1. k近邻法的实现

    k近邻法 模型 使用的模型实际上对应于特征空间的划分.模型的三个基本要素:1.距离度量 2. k值的选择 3. 分类决策规则决定. k值的选择:k值的选择,k如果选择的过小会导致过拟合,模型会变得复杂 ...

  2. Mybatis案例升级版——小案例大道理

    纯Mybatis案例升级版——小案例大道理 前言: 这几天看了一本书<原则>,在上面看到了一句话叫“每个人都把自己眼界的局限当成世界的局限”,大学生是

  3. python查找时,不支持compound class

    1.python使用如下代码查找页面上的元素时, browser.findElement_by_class_name("widget-content nopadding") 报错: ...

  4. POJ 2155 Matrix (2维树状数组)

    POJ-Matrix 题意:给你一个n*n矩阵的灯泡,灯泡的初始状态都为0,T次操作,分别是翻转操作:将x1,y1 --- x2, y2的灯泡状态反转 和 查询操作 找出x1, y1位置灯泡的状态. ...

  5. Codeforces 938D Buy a Ticket

    Buy a Ticket 题意要求:求出每个城市看演出的最小费用, 注意的一点就是车票要来回的. 题解:dijkstra 生成优先队列的时候直接将在本地城市看演出的费用放入队列里, 然后直接跑就好了, ...

  6. codeforces 810 D. Glad to see you!(二分+互动的输入方式)

    题目链接:http://codeforces.com/contest/810/problem/D 题意:两个人玩一场游戏要猜出Noora选的f种菜的任意两种.一个人猜点另一个人回答 TAK如果 ,(x ...

  7. CF999C Alphabetic Removals 思维 第六道 水题

    Alphabetic Removals time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. Request请求的应用

    1.通过request获得请求行 获得客户端的请求方式:String getMethod() 获得请求的资源: String getRequestURI()   StringBuffer getReq ...

  9. webpack多页应用架构系列(一):一步一步解决架构痛点

    这系列文章讲什么? 前些时间,写过一个项目,前后端分离,没有借助任何框架,项目页面特别的多,页面都是html直接写的,许多公共html,写了好多处,有一个地方需要改就得改好多地方,js也是随意写,每个 ...

  10. 如何设置FreePBX的数据库用户可以通过远程来连接Mysql数据库?

    要满足mysql允许通过除了本机外的主机进行使用客户端连接的方法: 要设置root用户允许通过外网用户进行连接访问的操作方法: 1.首先先改mysql的配置文件 将绑定的#bind-address = ...