ecshop商城购物系统的商品分类列表页有一个“商品属性筛选”功能,可以对不同品牌不同价格不同属性的商品进行筛选过滤。但是这个筛选区有一个很需要完善的地方,那就是商品的筛选属性能够自定义排序。国际惯例,查阅网上资料发现全都是要花钱的,价格600-800元,而CSDN下载该插件需要1积分/C币,待我登录并绑定手机号码之后发现原来是不可以只充值1积分/C币,C币120枚起售!再去万能的淘宝上面搜索该插件也要86元,罢了,自己动手ecshop二次开发。
一、数据库结构修改
进入ECSHOP后台-数据库管理-SQL查询,输入下面SQL语句,提交查询。注意,如果你的数据表前缀不是ecs_,请先将下面SQL语句中ecs_修改成你的数据表前缀,再提交查询。
ALTER TABLE `ecs_category` ADD `brand_sort` VARCHAR(600) NOT NULL DEFAULT ''; ALTER TABLE `ecs_category` ADD `attr_value_sort` VARCHAR(600) NOT NULL DEFAULT '';
二、需要修改的文件
重点的修改在根目录/category.php这个文件里,首先需要修改get_cat_info函数,增加返回brand_sort和attr_value_sort字段的值,这个函数的作用是获得分类的信息:
function get_cat_info($cat_id) { $row=$GLOBALS['db']->getRow('select cat_id,cat_name,keywords,cat_desc,parent_id,setting,style,grade,grade_define,filter_attr,brand_sort,attr_value_sort from '.$GLOBALS['ecs']->table('category').' where cat_id='.$cat_id); $row['url']=build_uri('category', array('cid'=>$row['cat_id']), $row['cat_name']); return $row; }
接下来,搜索《$smarty->assign('brands', $brands);》这行代码,并在这行代码下面添加以下代码,排序的原理不难看出,其实就是通过循环筛选属性,按照自定义的顺序重新生成新的筛选属性数组变量。
if($brands and $cat['brand_sort']){ $brands_attr=array(); $brands_attr[0]=$brands[0]; $brands_temp=explode(',', $cat['brand_sort']); foreach($brands_temp as $v){ foreach($brands as $val){ if($val['brand_name']==$v){ $brands_attr[]=$val; break; } } } $brands=$brands_temp; $smarty->assign('brands', $brands); }
最后,搜索《$smarty->assign('filter_attr_list', $all_attr_list);》这行代码,并在这行代码上面添加以下代码,排序的原理同上。
if($cat['attr_value_sort']){ $attr_value_sort=explode("\r\n",$cat['attr_value_sort']); $attr_define_sort=array(); foreach($attr_value_sort as $val){ if($val){ $attr_name_and_values=explode(':',$val); $attr_define_sort[$attr_name_and_values[0]]=explode(',',$attr_name_and_values[1]); } } foreach($all_attr_list as $k=>$v){ foreach($attr_define_sort as $key=>$val){ if($v['filter_attr_name']==$key){ $_attr_list=array(); $_attr_list[0]=$v['attr_list'][0]; foreach($val as $value){ foreach($v['attr_list'] as $attr_temp){ if($attr_temp['attr_value']==$value){ $_attr_list[]=$attr_temp; break; } } } $all_attr_list[$k]['attr_list']=$_attr_list; } } } }