当前位置:首页 > CMS教程 > DeDecms > 列表

织梦多条件筛选功能实现(dede联动搜索)

发布:smiling 来源: PHP粉丝网  添加日期:2014-11-08 10:20:47 浏览: 评论:0 

我们现在已经在栏目列表里面添加了“仿京东”这个栏目了,这个栏目模型就是使用我们在第一篇中讲到的新建的模型。这个栏目的ID为“1”。然后把这个栏目的列表模板设置为我们刚刚添加的那个filter.htm。现在我们可以去更新下“仿京东”这个栏目的文档了。更新成功,浏览下,嗯,可以访问了。但是怎么跟我们刚刚制作的那个filter.htm一模一样啊,那是因为我们还没有在里面添加织梦的模板标签。现在就可以随便添加模板标签了。

我们实际是想直接调用出来我们添加的那些字段。那应该如何操作呢?

这就得看看我们添加的自定义字段在数据库中的位置了,然后把他们给“弄”出来。嗯,这里我弄出来的方式是采用自定义函数弄出来的。函数代码如下,有需要的可以直接拿去了,但是记住是放到织梦的/include/extend.func.php里面啊.

  1. //获得所有自定义模型中的option类型可以取得的值 
  2. function GetAllOption($option_name,$table="dede_jingdong"
  3.     global $dsql
  4.     $sql="show columns from ".$table." like '".$option_name."'"
  5.     $dsql->SetQuery($sql); 
  6.     $dsql->Execute(); 
  7.     while($row=$dsql->GetArray()) 
  8.     { //开源软件:phpfensi.com 
  9.         $enum=$row['Type']; 
  10.     } 
  11.     $enum_arr=explode("','",$enum); 
  12.     $enum_arr[0]=str_replace("enum('","",$enum_arr[0]);//去掉分割后第一个元素的enum(' 
  13.     $enum_arr[count($enum_arr)-1]=str_replace("')","",$enum_arr[count($enum_arr)-1]);//去掉分割后最后一个元素的') 
  14.     return $enum_arr

好了,有这个函数就可以将本来的filter.htm给简化啦!

下面是简化后的代码:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312"
  5. <link href="/templets/jingdong/filter.css" rel="stylesheet" type="text/css" /> 
  6. <script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script> 
  7. <script src="/templets/jingdong/filter.js" type="text/javascript"></script> 
  8. <title>织梦仿京东筛选</title> 
  9. </head> 
  10. <body> 
  11. <div id="filter"
  12.   <dl> 
  13.     <dt>品牌:</dt> 
  14.     <dd> 
  15.       <div><a>全部</a></div> 
  16.     </dd> 
  17.     {dede:php} 
  18.     $arr=GetAllOption("pinpai"); 
  19.     foreach($arr as $v
  20.     { 
  21.     echo " 
  22.     <dd> 
  23.       <div><a>$v</a></div> 
  24.     </dd> 
  25.     "; 
  26.     } 
  27.     {/dede:php} 
  28.   </dl> 
  29.   <dl> 
  30.     <dt>价格:</dt> 
  31.     <dd> 
  32.       <div><a>全部</a></div> 
  33.     </dd> 
  34.     <dd> 
  35.       <div><a>1000-2999</a></div> 
  36.     </dd> 
  37.     <dd> 
  38.       <div><a>3000-3499</a></div> 
  39.     </dd> 
  40.     <dd> 
  41.       <div><a>3500-3999</a></div> 
  42.     </dd> 
  43.     <dd> 
  44.       <div><a>4000-4499</a></div> 
  45.     </dd> 
  46.     <dd> 
  47.       <div><a>4500-4999</a></div> 
  48.     </dd> 
  49.     <dd> 
  50.       <div><a>5000-5999</a></div> 
  51.     </dd> 
  52.     <dd> 
  53.       <div><a>6000-6999</a></div> 
  54.     </dd> 
  55.     <dd> 
  56.       <div><a>7000-9999</a></div> 
  57.     </dd> 
  58.     <dd> 
  59.       <div><a>10000以上</a></div> 
  60.     </dd> 
  61.   </dl> 
  62.   <dl> 
  63.     <dt>尺寸:</dt> 
  64.     <dd> 
  65.       <div><a>全部</a></div> 
  66.     </dd> 
  67.     <dd> 
  68.       <div><a>8.9英寸及以下</a></div> 
  69.     </dd> 
  70.     <dd> 
  71.       <div><a>11英寸</a></div> 
  72.     </dd> 
  73.     <dd> 
  74.       <div><a>12英寸</a></div> 
  75.     </dd> 
  76.     <dd> 
  77.       <div><a>13英寸</a></div> 
  78.     </dd> 
  79.     <dd> 
  80.       <div><a>14英寸</a></div> 
  81.     </dd> 
  82.     <dd> 
  83.       <div><a>15英寸</a></div> 
  84.     </dd> 
  85.     <dd> 
  86.       <div><a>16英寸-17英寸</a></div> 
  87.     </dd> 
  88.   </dl> 
  89.   <dl> 
  90.     <dt>平台:</dt> 
  91.     <dd> 
  92.       <div><a>全部</a></div> 
  93.     </dd> 
  94.     {dede:php} 
  95.     $arr=GetAllOption("pingtai"); 
  96.     foreach($arr as $v
  97.     { 
  98.     echo " 
  99.     <dd> 
  100.       <div><a>$v</a></div> 
  101.     </dd> 
  102.     "; 
  103.     } 
  104.     {/dede:php} 
  105.   </dl> 
  106.   <dl> 
  107.     <dt>显卡:</dt> 
  108.     <dd> 
  109.       <div><a>全部</a></div> 
  110.     </dd> 
  111.     {dede:php} 
  112.     $arr=GetAllOption("xianka"); 
  113.     foreach($arr as $v
  114.     { 
  115.     echo " 
  116.     <dd> 
  117.       <div><a>$v</a></div> 
  118.     </dd> 
  119.     "; 
  120.     } 
  121.     {/dede:php} 
  122.   </dl> 
  123. </div> 
  124. </body> 
  125. </html> 

我们已经在前台实现了筛选的功能了,虽然价格、尺寸两个类型没有添加,这是因为我是要把他们固定做好,因为他们在模型中使用的类型是数字类型,并非其他三个(品牌、平台以及显卡)是option类型。

既然前台已经做好了,那我们就开始后台的功能了。

具体的后台我使用的是advancesearch.php这个搜索的功能来实现的。

我们复制一个advancesearch.php的模板出来,默认的advanceserach.php的模板是/templets/default/advancesearch.htm,我们把这个模板,复制到我们的自定义的模板文件夹/templets/jingdong里面,名字就叫做filter_tmp.htm。

然后进入后台,在“内容模型管理”里面选择你所需要搜索的模型,然后点击这个模型后面的放大镜图标,在“附件表可供自定义搜索的字段”中,勾选上你需要搜索的字段,自定义搜索结果模板页,写上我们刚刚复制的模板名称,叫做filter_tmp.htm,确定。

这里可以测试一下,能否正常使用搜索。

不过好像是织梦系统自带的不可以的,我试了好多次都不行,追踪了一下,好像并没有查询附加表,于是在advancesearch.php的218行,原来的代码是:

  1. $query = "SELECT main.id AS aid,main.*,main.description AS description1, type.* 
  2.     FROM $maintable main 
  3.     LEFT JOIN cms_arctype type ON type.id = main.typeid 
  4.     LEFT JOIN $addontable addon ON addon.aid = main.id 
  5.     $where  $orderby"; 

在type.*的后面添加行一个addon.*,也就是变成如下的代码:

  1. $query = "SELECT main.id AS aid,main.*,main.description AS description1, type.*,addon.* 
  2.     FROM $maintable main 
  3.     LEFT JOIN cms_arctype type ON type.id = main.typeid 
  4.     LEFT JOIN $addontable addon ON addon.aid = main.id 
  5.     $where  $orderby"; 

然后还有124行添加  ${$var}=iconv(“utf-8″,”gb2312″,${$var}); 否则会导致中文乱码。

还有一个就是如果使用()英文括号的话,要小心了,因为会被安全sql过滤掉。

下面,是我简单的制作了下filter_tmp.htm,大家可以参考使用。

  1. {dede:datalist} 
  2. <div style="border: 1px solid #CCC;margin:20px 0;"
  3. <strong>标题:</strong>{dede:field.title/}<br /> 
  4. <strong>品牌:</strong>{dede:field.pinpai/}<br /> 
  5. <strong>价格:</strong>{dede:field.jiage/}<br /> 
  6. <strong>尺寸:</strong>{dede:field.chicun/}<br /> 
  7. <strong>平台:</strong>{dede:field.pingtai/}<br /> 
  8. <strong>显卡:</strong>{dede:field.xianka/}<br /> 
  9. </div> 
  10. {/dede:datalist} 
  11. {dede:pagelist listsize='5'/} 

但是我们最终是要把这个页面“嵌”到filter.htm中,也就是最终的列表页里面。

现在我们打开filter这个模板文件,在最下面加一个div,id设置为result,这个是用来存放最后筛选出来的结果的地方。

然后打开filter.js,下面重点都是在这个js里面写的。

Tags: 织梦条件筛选 dede联动搜索

分享到: