织梦CMS实现多条件筛选功能

用织梦实现筛选的功能,其实主要就是运用到了织梦的高级搜索功能,而后用ajax去post替换掉原本的结果就能够了。javascript

其实筛选的话,主要有两个问题须要解决,一个是前台的筛选实现,一个是后台根据前台的点击,反馈出相应的结果。php

因而在网上搜索了N多的资料了以后,先实现前台的功能,就是你点了以后会有一个筛选的效果出来,固然,也只是一个效果。具体能够参照:jquery仿京东筛选效果。下面就一步一步用织梦来实现这样的功能。css

首先咱们先在后台自定义模型(自定义模型都不会的同窗,能够直接去面壁思过了)html

看到参照网站的图片,能够发现商品的话,主要有下面的几个字段:品牌,价格,尺寸,平台,显卡这五个字段。java

其中品牌、平台、显卡为option类型,价格为整数类型,尺寸为小数类型,添加模型的时候,记得勾上“使字段能够在列表的底层模板中得到(自定义字段默认仅能在文档模板显示,启用此选项将使列表查询变慢,如无必要请不要选择)”jquery

下面根据咱们设置的这些字段,开始直接调用。假如咱们的模板目录为/templets/jingdong,那么咱们开始在这个文件夹里面新建三个文件,名称分别为filter.htm、filter.js、以及filter.css。ajax

filter.htm代码sql

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="/templets/jingdong/filter.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script src="/templets/jingdong/filter.js" type="text/javascript"></script>
<title>织梦仿京东筛选</title>
</head>
<body>
<div id="filter">
<dl>
<dt>品牌:</dt>
<dd>
<div><a>所有</a></div>
</dd>
<dd>
<div><a>惠普(hp)</a></div>
</dd>
<dd>
<div><a>联想(Lenovo)</a></div>
</dd>
<dd>
<div><a>联想(ThinkPad)</a></div>
</dd>
<dd>
<div><a>宏基(acer)</a></div>
</dd>
<dd>
<div><a>华硕</a></div>
</dd>
<dd>
<div><a>戴尔</a></div>
</dd>
<dd>
<div><a>三星</a></div>
</dd>
<dd>
<div><a>索尼</a></div>
</dd>
<dd>
<div><a>东芝</a></div>
</dd>
<dd>
<div><a>Gateway</a></div>
</dd>
<dd>
<div><a>微星</a></div>
</dd>
<dd>
<div><a>海尔</a></div>
</dd>
<dd>
<div><a>清华同方</a></div>
</dd>
<dd>
<div><a>富士通</a></div>
</dd>
<dd>
<div><a>苹果(Apple)</a></div>
</dd>
<dd>
<div><a>神舟</a></div>
</dd>
<dd>
<div><a>方正</a></div>
</dd>
<dd>
<div><a>优雅</a></div>
</dd>
</dl>
<dl>
<dt>价格:</dt>
<dd>
<div><a>所有</a></div>
</dd>
<dd>
<div><a>1000-2999</a></div>
</dd>
<dd>
<div><a>3000-3499</a></div>
</dd>
<dd>
<div><a>3500-3999</a></div>
</dd>
<dd>
<div><a>4000-4499</a></div>
</dd>
<dd>
<div><a>4500-4999</a></div>
</dd>
<dd>
<div><a>5000-5999</a></div>
</dd>
<dd>
<div><a>6000-6999</a></div>
</dd>
<dd>
<div><a>7000-9999</a></div>
</dd>
<dd>
<div><a>10000以上</a></div>
</dd>
</dl>
<dl>
<dt>尺寸:</dt>
<dd>
<div><a>所有</a></div>
</dd>
<dd>
<div><a>8.9英寸及如下</a></div>
</dd>
<dd>
<div><a>11英寸</a></div>
</dd>
<dd>
<div><a>12英寸</a></div>
</dd>
<dd>
<div><a>13英寸</a></div>
</dd>
<dd>
<div><a>14英寸</a></div>
</dd>
<dd>
<div><a>15英寸</a></div>
</dd>
<dd>
<div><a>16英寸-17英寸</a></div>
</dd>
</dl>
<dl>
<dt>平台:</dt>
<dd>
<div><a>所有</a></div>
</dd>
<dd>
<div><a>AMD Brazos APU平台</a></div>
</dd>
<dd>
<div><a>Intel Sandy Bridge平台</a></div>
</dd>
<dd>
<div><a>Intel平台</a></div>
</dd>
<dd>
<div><a>AMD平台</a></div>
</dd>
</dl>
<dl>
<dt>显卡:</dt>
<dd>
<div><a>所有</a></div>
</dd>
<dd>
<div><a>独立显卡</a></div>
</dd>
<dd>
<div><a>集成显卡</a></div>
</dd>
<dd>
<div><a>核芯显卡</a></div>
</dd>
</dl>
</div>
</body>
</html>

接着昨天晚上的写,昨天晚上说到了新建一个filter.htm,而后把上个文章的代码复制进去,如今把filter.css以及flter.js也分别复制好。
filter.css代码数据库

@charset "gb2312";
#filter {
width:620px;
height:auto;
margin-left:auto;
margin-right:auto;
font-size:12px;
}
#filter dl {
padding:0;
margin-top:0;
margin-bottom:0;
clear:both;
padding:4px 0;
}
#filter dt, dd {
display:block;
float:left;
width:auto;
padding:0;
margin:3px 0;
}
#filter dt {
height:14px;
padding-bottom:4px;
font-weight:bold;
color:#333333;
}
#filter dd {
color:#005AA0;
margin-right:8px;
}
#filter a {
cursor:pointer;
}
.seling {
background-color:#005AA0;
color:#FFFFFF;
}
.seled {
background-color:#005AA0;
color:#FFFFFF;
}

JS代码安全

// JavaScript Document
$(function () {
//选中filter下的全部a标签,为其添加hover方法,该方法有两个参数,分别是鼠标移上和移开所执行的函数。
$("#filter a").hover(
function () {
$(this).addClass("seling");
},
function () {
$(this).removeClass("seling");
}
);
//选中filter下全部的dt标签,而且为dt标签后面的第一个dd标签下的a标签添加样式seled。(感叹jquery的强大)
$("#filter dt+dd a").attr("class", "seled");
//为filter下的全部a标签添加单击事件
$("#filter a").click(function () {
$(this).parents("dl").children("dd").each(function () {
//下面三种方式效果相同(第三种写法的内部就是调用了find()函数,因此,第2、三种方法是等价的。)
//$(this).children("div").children("a").removeClass("seled");
//$(this).find("a").removeClass("seled");
$('a',this).removeClass("seled");
});
$(this).attr("class", "seled");
alert(RetSelecteds()); //返回选中结果
});
alert(RetSelecteds()); //返回选中结果
});
function RetSelecteds() {
var result = "";
$("#filter a[class='seled']").each(function () {
result += $(this).html()+"\n";
});
return result;
}
 

若是步骤按照织梦多条件筛选功能实现(一)织梦多条件筛选功能实现(二)来操做的话这时候直接打开filter.htm已经能够看到效果了,那么下面要作的就是在织梦里面,用织梦的东西往里面去套。

咱们如今已经在栏目列表里面添加了“仿京东”这个栏目了,这个栏目模型就是使用咱们在第一篇中讲到的新建的模型。这个栏目的ID为“1”。而后把这个栏目的列表模板设置为咱们刚刚添加的那个filter.htm。如今咱们能够去更新下“仿京东”这个栏目的文档了。更新成功,浏览下,嗯,能够访问了。可是怎么跟咱们刚刚制做的那个filter.htm如出一辙啊,那是由于咱们尚未在里面添加织梦的模板标签。如今就能够随便添加模板标签了。

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

这就得看看咱们添加的自定义字段在数据库中的位置了,而后把他们给“弄”出来。嗯,这里我弄出来的方式是采用自定义函数弄出来的。函数代码以下,有须要的能够直接拿去了,可是记住是放到织梦的/include/extend.func.php里面啊,放其它位置出问题概不负责…

得到option类型数据的可取值

//得到全部自定义模型中的option类型能够取得的值
function GetAllOption($option_name,$table="dede_jingdong")
{
global $dsql;
$sql="show columns from ".$table." like '".$option_name."'";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row=$dsql->GetArray())
{
$enum=$row['Type'];
}
$enum_arr=explode("','",$enum);
$enum_arr[0]=str_replace("enum('","",$enum_arr[0]);//去掉分割后第一个元素的enum('
$enum_arr[count($enum_arr)-1]=str_replace("')","",$enum_arr[count($enum_arr)-1]);//去掉分割后最后一个元素的')
return $enum_arr;
}

好了,有这个函数就能够将原本的filter.htm给简化啦!

下面是简化后的代码

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="/templets/jingdong/filter.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script src="/templets/jingdong/filter.js" type="text/javascript"></script>
<title>织梦仿京东筛选</title>
</head>
<body>
<div id="filter">
<dl>
<dt>品牌:</dt>
<dd>
<div><a>所有</a></div>
</dd>
{dede:php}
$arr=GetAllOption("pinpai");
foreach($arr as $v)
{
echo "
<dd>
<div><a>$v</a></div>
</dd>
";
}
{/dede:php}
</dl>
<dl>
<dt>价格:</dt>
<dd>
<div><a>所有</a></div>
</dd>
<dd>
<div><a>1000-2999</a></div>
</dd>
<dd>
<div><a>3000-3499</a></div>
</dd>
<dd>
<div><a>3500-3999</a></div>
</dd>
<dd>
<div><a>4000-4499</a></div>
</dd>
<dd>
<div><a>4500-4999</a></div>
</dd>
<dd>
<div><a>5000-5999</a></div>
</dd>
<dd>
<div><a>6000-6999</a></div>
</dd>
<dd>
<div><a>7000-9999</a></div>
</dd>
<dd>
<div><a>10000以上</a></div>
</dd>
</dl>
<dl>
<dt>尺寸:</dt>
<dd>
<div><a>所有</a></div>
</dd>
<dd>
<div><a>8.9英寸及如下</a></div>
</dd>
<dd>
<div><a>11英寸</a></div>
</dd>
<dd>
<div><a>12英寸</a></div>
</dd>
<dd>
<div><a>13英寸</a></div>
</dd>
<dd>
<div><a>14英寸</a></div>
</dd>
<dd>
<div><a>15英寸</a></div>
</dd>
<dd>
<div><a>16英寸-17英寸</a></div>
</dd>
</dl>
<dl>
<dt>平台:</dt>
<dd>
<div><a>所有</a></div>
</dd>
{dede:php}
$arr=GetAllOption("pingtai");
foreach($arr as $v)
{
echo "
<dd>
<div><a>$v</a></div>
</dd>
";
}
{/dede:php}
</dl>
<dl>
<dt>显卡:</dt>
<dd>
<div><a>所有</a></div>
</dd>
{dede:php}
$arr=GetAllOption("xianka");
foreach($arr as $v)
{
echo "
<dd>
<div><a>$v</a></div>
</dd>
";
}
{/dede:php}
</dl>
</div>
</body>
</html>
 

织梦多条件筛选功能实现(四)

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

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

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

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

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

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

不过好像是织梦系统自带的不能够的,我试了好屡次都不行,追踪了一下,好像并无查询附加表,因而在advancesearch.php的218行,原来的代码是

 

$query = "SELECT main.id AS aid,main.*,main.description AS description1, type.*
FROM $maintable main
LEFT JOIN #@__arctype type ON type.id = main.typeid
LEFT JOIN $addontable addon ON addon.aid = main.id
$where $orderby";

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

 

$query = "SELECT main.id AS aid,main.*,main.description AS description1, type.*,addon.*
FROM $maintable main
LEFT JOIN #@__arctype type ON type.id = main.typeid
LEFT JOIN $addontable addon ON addon.aid = main.id
$where $orderby";
 

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

还有一个就是若是使用()英文括号的话,要当心了,由于会被安全sql过滤掉。

下面,是我简单的制做了下filter_tmp.htm,你们能够参考使用。

 

{dede:datalist}
<div>
<strong>标题:</strong>{dede:field.title/}<br />
<strong>品牌:</strong>{dede:field.pinpai/}<br />
<strong>价格:</strong>{dede:field.jiage/}<br />
<strong>尺寸:</strong>{dede:field.chicun/}<br />
<strong>平台:</strong>{dede:field.pingtai/}<br />
<strong>显卡:</strong>{dede:field.xianka/}<br />
</div>
{/dede:datalist}
{dede:pagelist listsize='5'/}

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

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

而后打开filter.js,下面重点都是在这个js里面写的。下面把几个文件打包了一下,有须要的同窗能够下载了。

固然了,下载了出问题概不负责。。

看懂的总归能够看懂,看不懂的,说的在清楚也看不懂。。

相关文章
相关标签/搜索