打印

[php] 一种多条件混合筛选的简单实现!


如上图:
最近老有朋友问,多条件混合筛选是如何实现的,实现其实比较简单,只是有好多人把精力下在如何去在后台处理URI上了!
后台处理URI的方法经过我一番思考,恕我愚钝,没有理清楚思路!
所以干脆来简单的:

以下是代码:
提示:另存为php文件,放在你的web目录里访问即可演示!
声明:简单的写了个例子,旨在说明原理,并没有斟酌,明白了原理自己改写下就可以了!
复制内容到剪贴板
代码:
<?php
$conditions = array('price','color','metal');//要进行筛选的字段放在这里
$price = $color = $metal='';//先给需要筛选的字段赋空值,这些值将输出到页面的hidden fileds 中
//以下循环给已经进行的筛选赋值,以便能够在下一次筛选中保留
foreach($conditions as $value){
    if(isset($_GET[$value])){
        $$value = $_GET[$value];
    }
}
//以下是演示输出$_GET数据
echo '<pre>';
print_r($_GET);
echo '</pre>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>分类筛选演示</title>
<style type="text/css">
body{font-size:14px;font-family:Tahoma,"宋体"}
</style>
<script type="text/javascript">
function Filter(a,b){
    var $ = function(e){return document.getElementById(e);}
    var ipts = $('filterForm').getElementsByTagName('input'),result=[];
    for(var i=0,l=ipts.length;i<l;i++){
        if(ipts[i].getAttribute('to')=='filter'){
            result.push(ipts[i]);
        }
    }
    if($(a)){
        $(a).value = b;
        for(var j=0,len=result.length;j<len;j++){
            if(result[j].value==''){
                result[j].parentNode.removeChild(result[j]);
            }
        }
        document.forms['filterForm'].submit();
    }
    return false;
}
</script>
</head>
<body>
<form id="filterForm" action="index.php" method="GET">
<!--
form的id 要和程序里统一
为避免与其他使用的隐藏域冲突,添加了to属性
以下是筛选字段隐藏域
需要筛选的隐藏域需要加 to 属性
-->
<input to="filter" type="hidden" id="price" name="price" value="<?=$price?>" />
<input to="filter" type="hidden" id="color" name="color" value="<?=$color?>" />
<input to="filter" type="hidden" id="metal" name="metal" value="<?=$metal?>" />
</form>
<!--
要筛选的属性可以由程序生成,注意规律!
-->
价格:<a href="javascript:Filter('price','100-1000');">100-1000</a>
      <a href="javascript:Filter('price','1001-2000');">1001-2000</a>
      <a href="javascript:Filter('price','2001-3000');">2001-3000</a><br/>
颜色:<a href="javascript:Filter('color','red');">红色</a>
      <a href="javascript:Filter('color','blue');">蓝色</a><br />
材质:<a href="javascript:Filter('metal','gold');">纯金</a>
      <a href="javascript:Filter('metal','silver');">纯银</a><br />
</body>
</html>
[ 本帖最后由 fonqing 于 2010-7-20 21:03 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
本帖最近评分记录
  • wuleying 威望 +1 原创内容 2010-8-16 10:19
PHP定制 QQ:31301678
很实用,收下再研究

收藏了。

不错,果然是高手。
专业网站建设

TOP

额.这个属于前台范畴了..

TOP

这种方法虽然可以实现,但对于现在要推广网站的朋友们来说,SEO可能不太友好,蜘蛛没办法爬行这样的页面。
我的方法也是在后台完成的,前台只是添加相应的标签,贴下代码,期待更好的办法。


后台接收参数,增加URL筛选标签:
复制内容到剪贴板
代码:
<?php
//区域
if(!empty($quyu)) {
$sql=sql.' and quyu='.$quyu;
$quyuAdd='/quyu/'.$quyu;
}
//售价
if(!empty($price)) {
$sql=sql.' and price='.$price;
$priceAdd='/quyu/'.$price;
}
//面积
if(!empty($area)) {
$sql=sql.' and area='.$area;
$areaAdd='/area/'.$area;
}
//来源
if(!empty($from)) {
$sql=sql.' and from='.$from;
$fromAdd='/from/'.$from;
}
//物业
if(!empty($wuye)) {
$sql=sql.' and wuye='.$quyu;
$wuyeAdd='/wuye/'.$wuye;
}
//替换Tpl模板
$this->assign("quyu",$quyuAdd);
$this->assign("from",$from);
$this->assign("wuyeAdd",$wuyeAdd);
$this->assign("areaAdd",$areaAdd);
$this->assign("priceAdd",$priceAdd);
?>
模板页:
复制内容到剪贴板
代码:
<p>区域:<a href="/ershoufang{$wuyeAdd}{$roomAdd}{$priceAdd}{$areaAdd}{$infofromAdd}/" class="redBA">不限</a>
<volist name="quyulist" id="vo">
<a href="/ershoufang/quyu/{$vo.ename}{$wuyeAdd}{$roomAdd}{$priceAdd}{$areaAdd}{$infofromAdd}/" <php>if($vo["ename"]==$_GET['quyu']){echo'class="now"';}</php>>{$vo.name}区</a>
其他类似
</volist>
</p>
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!

TOP

哦,网了告诉,上面的代码网站使用了伪静态,参数都是以“/参数名称/值/” 这样的形式传递的.
http://www.dc99.com/ershoufang/quyu/shunde/bankuai/longjiang/wuye/kufang/room/5/price/30-50/area/40-60/from/3/

希望楼下有更好的办法。

[ 本帖最后由 HmilyHeart 于 2010-7-21 01:26 编辑 ]

TOP

其实,本来想用后台处理 那个URL 的,可惜不用URL重写,写了好一会思路还是有点乱!
用URL重写规划以后貌似倒是好处理点!
通过前台代码研究了一下ZOL的筛选,很强大,貌似也是借助URL规则写的!
有空再写个不用URL重写的后台端的!
同时也期待,原始 QueryString的筛选脚本,以便膜拜!

PS:楼上地产街LOGO做得不错!

[ 本帖最后由 fonqing 于 2010-7-21 01:13 编辑 ]
PHP定制 QQ:31301678

TOP

仔细看了下
ZOL的,比如:http://detail.zol.com.cn/cpu_ind ... p10550_1_1_0_1.html
觉得也应该是使用为伪静态。至于动态页面还是静态页面就不太清楚了。

这样的URL,在后台接收一个总的参数,然后在后台通过正则再提取不同参数值。

优点:目录结构比较浅,好像只有一级到2级,利于蜘蛛爬行。
缺点:用户体验方面来说,不太友好。

[ 本帖最后由 HmilyHeart 于 2010-7-21 01:25 编辑 ]

TOP

保留着,留着以后用。

TOP

引用:
原帖由 HmilyHeart 于 2010-7-21 01:22 发表
仔细看了下
ZOL的,比如:http://detail.zol.com.cn/cpu_ind ... p10550_1_1_0_1.html
觉得也应该是使用为伪静态。至于动态页面还是静态页面就不太清楚了。

这样的URL,在后台 ...
确实是伪静态+Nginx rewrite的,我实现过差不多的例子。

[ 本帖最后由 112183883 于 2011-7-1 23:39 编辑 ]

TOP

另外,写了个原始QueryString的demo,截图:



演示地址:http://w3dog.com/demo.php

代码:

<?php

    $urlparts = array('addr', 'age', 'school');
    $url = array();
    foreach ($_GET as $k=> $v) {
        if (in_array($k, $urlparts)) {
            $url[$k] = $v;
        }
    }

    function buildurl($url, $name, $value)
    {
        $url[$name] = $value;
        return http_build_query(array_filter($url));
    }

?>

<html>
<head>
<title>URL多值Query实例</title>
<meta http-equiv="content-type" content="text/html;charset=gb2312" />
<style>
* { font-family:Tahoma, sans-serif; font-size:14px; }
a:link, a:visited { color:blue; text-decoration:none; }
a:hover { color:red; text-decoration:underline; }
</style>
</head>

<body>
URL多值Query实例:
<br/>
<br/>
地区:
<?php if ($url['addr'] == 'hz'): ?>杭州<?php else: ?><a href="?<?php echo buildurl($url, 'addr', 'hz'); ?>">杭州</a><?php endif; ?>&nbsp;
<?php if ($url['addr'] == 'sh'): ?>上海<?php else: ?><a href="?<?php echo buildurl($url, 'addr', 'sh'); ?>">上海</a><?php endif; ?>&nbsp;
<?php if ($url['addr'] == 'gz'): ?>广州<?php else: ?><a href="?<?php echo buildurl($url, 'addr', 'gz'); ?>">广州</a><?php endif; ?>&nbsp;
<?php if ($url['addr'] != ''): ?>[<a href="?<?php echo buildurl($url, 'addr', ''); ?>">取消</a>]<?php endif; ?>
<br/>
年龄:
<?php if ($url['age'] == '1'): ?>18岁以下<?php else: ?><a href="?<?php echo buildurl($url, 'age', '1'); ?>">18岁以下</a><?php endif; ?>&nbsp;
<?php if ($url['age'] == '2'): ?>18-35岁<?php else: ?><a href="?<?php echo buildurl($url, 'age', '2'); ?>">18-35岁</a><?php endif; ?>&nbsp;
<?php if ($url['age'] == '3'): ?>35岁以上<?php else: ?><a href="?<?php echo buildurl($url, 'age', '3'); ?>">35岁以上</a><?php endif; ?>&nbsp;
<?php if ($url['age'] != ''): ?>[<a href="?<?php echo buildurl($url, 'age', ''); ?>">取消</a>]<?php endif; ?>
<br/>
学历:
<?php if ($url['school'] == '1'): ?>小学<?php else: ?><a href="?<?php echo buildurl($url, 'school', '1'); ?>">小学</a><?php endif; ?>&nbsp;
<?php if ($url['school'] == '2'): ?>初中<?php else: ?><a href="?<?php echo buildurl($url, 'school', '2'); ?>">初中</a><?php endif; ?>&nbsp;
<?php if ($url['school'] == '3'): ?>高中<?php else: ?><a href="?<?php echo buildurl($url, 'school', '3'); ?>">高中</a><?php endif; ?>&nbsp;
<?php if ($url['school'] == '4'): ?>大学<?php else: ?><a href="?<?php echo buildurl($url, 'school', '4'); ?>">大学</a><?php endif; ?>&nbsp;
<?php if ($url['school'] != ''): ?>[<a href="?<?php echo buildurl($url, 'school', ''); ?>">取消</a>]<?php endif; ?>
<br/>
</body>

</html>

只是提供一个思路,需要的可以自己改改:)
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!

TOP

回复 11# 112183883 的帖子

html的输出应该封装一下.

TOP

回复 12# wuleying 的帖子

嗯,只是为了演示随手写的一个测试而已,实际工作中已经很久没写过这种php和html混杂的代码了。

TOP

把一些属性放到form里面提交是很常见的做法。
不过我喜欢用http_build_params然后去掉当前属性,给每一个选项一个链接。

[ 本帖最后由 irlvirus 于 2010-8-18 17:19 编辑 ]
BI网店汇总 thread-3005075-1-1.html

TOP



[ 本帖最后由 112183883 于 2010-8-18 17:28 编辑 ]

TOP

回复 15# 112183883 的帖子

不好意思,刚没看到下面的。。。。呵呵
BI网店汇总 thread-3005075-1-1.html

TOP

Notice: Undefined index 出现这样的提示。。在没有get值的时候。

TOP

学习了
<?php

TOP

有点复杂,呵呵

TOP