众所周知,ECSHOP的价格区间是在后台设置一个“价格区间个数”,然后由程序来自动平分,很多ECSHOP网店主都认为这样做,有很大不尽人意的地方。
$ I8 g+ N$ Q4 h6 R' w2 `: {$ } c }/ u9 k7 p( [
论坛里也有人提供过修改方法,好像只是在模板文件里手动写死几个区间的一种方法,还是不能自由定义。4 m/ ?) s4 H5 U2 p* S+ r
$ [0 f" c/ c. D: O1 ?: B- T下面我要讲的方法是可以在ECSHOP后台自由定义价格区间(例如:1-30,31-200,201-1000,1001-5000,5000以上),前台自动体现的一种方法,而且每个类别的价格区间可以任意设置,让价格区间更人性化。
. X5 V. p0 w1 n W4 R6 H$ k+ T5 ?
, j% ]7 `9 m- i% c% X: N首先送上演示地址:演示地址已关,请询问客服3 K9 V3 a, E0 R; T) S
' V9 ~0 I. M7 e' r; z0 `
1)、 首先我们来修改ECSHOP的数据库结构,目的是给 ecs_category 增加一个新字段, 进入 后台 》 数据库管理 》SQL查询,执行下面的SQL语句 ALTER TABLE `ecs_category` ADD `grade_define` VARCHAR( 255 ) NOT NULL AFTER `grade` 注意:这里我使用的是 默认数据库前缀ecs_,如果你的数据库前缀不是 ecs_ , 请修改之。
: d0 c, X+ \$ X! s' \4 Q4 m$ l x/ b- I4 [1 R
2)、& U8 W9 r+ d S
- N3 C, L3 i) P7 c. ?2 g
打开 /admin/templates/category_info.htm 找到 <tr> Z z6 j# ?( V* h, L. k
<td class="label"><a href="javascript:showNotice('noticeGrade');" title="{$lang.form_notice}"><img src="images/notice.gif" width="16" height="16" border="0" alt="{$lang.notice_style}"></a>{$lang.grade}:</td>9 O& d& t& Y! t8 h: Z
<td>4 l# T9 ~" ?% g+ C, g6 G! I1 ~
<input type="text" name="grade" value="{$cat_info.grade|default:0}" size="40" /> <br /> S1 L! u: t, @0 n8 _
<span class="notice-span" {if $help_open}style="display:block" {else} style="display:none" {/if} id="noticeGrade">{$lang.notice_grade}</span>
. }5 n3 \* m+ u% p- E; y </td>( i3 b3 |6 h( e
</tr> | 9 H8 N& b# A6 @4 \! g9 r
将它修改为<tr>; h0 X5 q) `- F3 `
<td class="label">自定义价格区间:</td> [# m* R% v2 ^
<td>$ b# n1 B" Q: Y- T" Q
<input type="text" name="grade_define" value="{$cat_info.grade_define}" size="60" /> <br />
3 C) [5 @! V6 O$ m' D2 A/ t- r* { <span class="notice-span" {if $help_open}style="display:block" {else} style="display:none" {/if} id="noticeGrade">以 半角 , 间隔,如: 1-30,31-200,201-1000,1001-5000,5000以上</span>5 }6 P8 p+ w- L7 p8 Q4 z
</td>5 b; z1 c. M0 f/ M2 w, Y2 x! ^
</tr> | ) s" v- P1 m X' { z" w1 k- g7 J
3 g/ w1 l) k8 B8 E$ C
3)、- ^6 T2 S7 l; f1 b
% G* p6 i( Z" I' v0 ]. ~
接着打开 /admin/category.php 文件,搜索
8 H8 I" g0 u! {$ Q$cat['grade'] = !empty($_POST['grade']) ? intval($_POST['grade']) : 0; |
4 O3 l# j/ ^1 ~; T# N( Q- p' J$ i一共能搜到两处,在每一处的下面都增加代码(注意是每一处)
! J2 T0 Q8 n2 h4 G: j7 d4 g! ?, o) ^ a
$cat['grade_define'] = !empty($_POST['grade_define']) ? trim($_POST['grade_define']) : ''; //自定义价格区间 by zhangyh | 9 Y. Z' P1 _, d; ~
到此,后台管理部分修改完毕。 . j3 u) i& U) p
* f( J1 Y V1 }6 N M; e
4)、- Q6 Y4 ~5 }3 s; q7 J# c% a0 j4 M& K
, q$ o U0 z: j2 u, w3 n下面开始修改前台部分 ! t/ ]6 k! s# r2 v1 h4 ^3 _7 w. n
打开 /category.php 找到 /* 获取价格分级 */6 w; D! O$ Y8 q
if ($cat['grade'] == 0 && $cat['parent_id'] != 0)) B' t5 ^/ Q& |2 h
{
+ {2 Z1 S3 z' ?; j a' l6 b $cat['grade'] = get_parent_grade($cat_id); //如果当前分类级别为空,取最近的上级分类6 }/ B3 b' v) U% A8 G6 [
} if ($cat['grade'] > 1)
& O. R. w* q6 S+ m! s+ h {
, ]7 s+ S/ y( |" o# f/ y /* 需要价格分级 */ /*) {, J2 _0 N0 x, h9 g/ K6 Z
算法思路:
$ [( N" g$ m& X! V( X2 t 1、当分级大于1时,进行价格分级
& S) E( J9 K( W) B 2、取出该类下商品价格的最大值、最小值
?& o) q* Q4 I, V 3、根据商品价格的最大值来计算商品价格的分级数量级:
9 ]- U/ d! y% K 价格范围(不含最大值) 分级数量级! M/ O# b6 Y3 S t' m* o
0-0.1 0.001) G6 s. q2 ^( d, s4 o" v6 Z5 m
0.1-1 0.01
4 h" x; U5 q, }: e: ^ 1-10 0.11 Z( `' h" c- d
10-100 1
6 r' X7 o+ \( \ 100-1000 10
0 M) V( L& h# U: i2 z0 ` 1000-10000 100
* ]7 L; ?- Y! \$ [% U 4、计算价格跨度:
& j/ F/ B+ e2 S. N 取整((最大值-最小值) / (价格分级数) / 数量级) * 数量级
8 ], m8 L% x* h# ]' @ 5、根据价格跨度计算价格范围区间7 C& I4 y+ ^6 E: K9 [9 y
6、查询数据库 可能存在问题:+ U; n$ c4 X1 I& B$ ^" p! {+ Z c
1、, h: s- w: l2 ^& l
由于价格跨度是由最大值、最小值计算出来的4 M9 m6 p L+ H( y
然后再通过价格跨度来确定显示时的价格范围区间0 X( \2 a: E; D, m
所以可能会存在价格分级数量不正确的问题# Y6 \, K# l8 e) k8 A
该问题没有证明
5 `" h* o1 R, f3 z! \7 c 2、
1 ^! N+ k3 Z( K9 t$ n 当价格=最大值时,分级会多出来,已被证明存在
& h/ ], E" z) a' U8 }1 R" F" H9 R */ $sql = "SELECT min(g.shop_price) AS min, max(g.shop_price) as max ".
. }; v) o. E4 ]/ P, ~$ i " FROM " . $ecs->table('goods'). " AS g ".! W% D, H M% J% D7 ~9 M9 H+ [/ g
" WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 ';
1 {; g) S" @# M- A; H$ i% y/ f //获得当前分类下商品价格的最大值、最小值 $row = $db->getRow($sql); // 取得价格分级最小单位级数,比如,千元商品最小以100为级数+ X9 O& F7 a0 l5 k4 ~
$price_grade = 0.0001;! E) T% y4 _0 v
for($i=-2; $i<= log10($row['max']); $i++)3 Y9 b8 K8 [ _. Z* y, ^+ d0 `
{& M Z3 E4 ~* i+ V; C, T
$price_grade *= 10;
: w) l% V0 O- q4 n5 X } //跨度/ o4 {: k+ q: b* S9 i+ P
$dx = ceil(($row['max'] - $row['min']) / ($cat['grade']) / $price_grade) * $price_grade;
% V" ^- \* g, b; v if($dx == 0)
6 N! {( D- N4 W: e: s {
. O$ `& [2 G5 v# z' R% S0 g $dx = $price_grade;
' o R/ C3 j; M7 F } for($i = 1; $row['min'] > $dx * $i; $i ++); for($j = 1; $row['min'] > $dx * ($i-1) + $price_grade * $j; $j++);# ~% V2 K ]; m3 e9 P
$row['min'] = $dx * ($i-1) + $price_grade * ($j - 1); for(; $row['max'] >= $dx * $i; $i ++);
0 d$ A6 w- c3 \ $row['max'] = $dx * ($i) + $price_grade * ($j - 1); $sql = "SELECT (FLOOR((g.shop_price - $row[min]) / $dx)) AS sn, COUNT(*) AS goods_num ".
% y' U0 Z2 x' `8 i " FROM " . $ecs->table('goods') . " AS g ".7 c, `# ~5 X5 W9 v# T: m& t
" WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 '.
3 N' B7 u2 p8 ?$ ]4 J1 e Z: k " GROUP BY sn "; $price_grade = $db->getAll($sql); foreach ($price_grade as $key=>$val)
5 B$ N1 g. w! u. c8 u4 ~! L4 K- l {
0 [- Q# a# w, E9 j $temp_key = $key + 1;
3 \. V! Z! |+ I8 _ $price_grade[$temp_key]['goods_num'] = $val['goods_num'];2 g' i( Y" A) S7 [/ P+ r* y* ?
$price_grade[$temp_key]['start'] = $row['min'] + round($dx * $val['sn']);8 F6 \. D x! v% N( C! `
$price_grade[$temp_key]['end'] = $row['min'] + round($dx * ($val['sn'] + 1));5 ~. z' n1 A$ o8 F% m2 V2 r, F
$price_grade[$temp_key]['price_range'] = $price_grade[$temp_key]['start'] . ' - ' . $price_grade[$temp_key]['end'];
# T2 O$ |7 m4 i# {2 I1 S $price_grade[$temp_key]['formated_start'] = price_format($price_grade[$temp_key]['start']);% l6 V6 Y2 {5 a- g
$price_grade[$temp_key]['formated_end'] = price_format($price_grade[$temp_key]['end']);
6 Y4 A* z3 {% g% k $price_grade[$temp_key]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand, 'price_min'=>$price_grade[$temp_key]['start'], 'price_max'=> $price_grade[$temp_key]['end'], 'filter_attr'=>$filter_attr_str), $cat['cat_name']); /* 判断价格区间是否被选中 */' I# H" f8 S4 b
if (isset($_REQUEST['price_min']) && $price_grade[$temp_key]['start'] == $price_min && $price_grade[$temp_key]['end'] == $price_max)
0 K! g! |5 F$ @) x* ^4 A7 t4 m {" K5 P+ E# z& U2 P# n d( U# ]
$price_grade[$temp_key]['selected'] = 1;9 y3 K, T- }+ ~* h8 J
}
+ X9 a- Q7 ? j: s8 \( B2 L" @0 V else- s3 g! m" O2 ?, J r( P" N5 a
{
. H/ E( T) r- z $price_grade[$temp_key]['selected'] = 0;
: V4 n6 {0 Z& H& r" g }: Q$ ?/ v9 @9 a2 P; |4 o$ U6 ~1 k
} $price_grade[0]['start'] = 0;" e9 A3 F2 |3 b9 A. S" C
$price_grade[0]['end'] = 0;* {1 O1 [; t1 W7 _& ]2 K
$price_grade[0]['price_range'] = $_LANG['all_attribute'];
; k4 Z- ~3 E& f3 ~7 x/ u $price_grade[0]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand, 'price_min'=>0, 'price_max'=> 0, 'filter_attr'=>$filter_attr_str), $cat['cat_name']);
% s T9 k2 k6 D0 E1 T* t1 k $price_grade[0]['selected'] = empty($price_max) ? 1 : 0; $smarty->assign('price_grade', $price_grade); } |
2 y4 z! z, o# ]! h/ N! t
- t) e1 X% i* J将它替换为/* 获取价格分级_新 */
' f8 M$ Q: G! x1 _6 j( R2 f( M if($cat['grade_define']); m7 Y2 l& j6 e& H& N
{! s4 x4 ~. | w% B
$price_grade=array();& E, h, Y" e& e3 K# ] j8 G. S
$price_grade[0]['start'] = 0;
& y, |& v& K& D; s7 S8 M6 M $price_grade[0]['end'] = 0;
9 }7 O. C. I. i% x $price_grade[0]['price_range'] = $_LANG['all_attribute'];
/ x6 d- ^7 ^, T2 H- R $price_grade[0]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand,
2 B. e$ U! c! ]5 M" f0 ~6 a 'price_min'=>0, 'price_max'=> 0, 'filter_attr'=>$filter_attr_str), $cat['cat_name']);& k: ]% i" |( ?! S/ ?# V4 k
$price_grade[0]['selected'] = empty($price_max) ? 1 : 0; $grade_temp=explode(",", $cat['grade_define']);
! ^4 \% P8 W% u/ a/ ]: B foreach($grade_temp as $grade_temp_key=>$grade_temp_val)* w( G5 D$ |; N8 Z' S8 Z
{. b& y0 v# |" C* \' d
$grade_temp_key2=$grade_temp_key+1;# D3 o; z) M4 U7 I
$grade_temp=explode("-", $grade_temp_val);
3 D4 C1 O1 X1 e1 Z) ?) n g1 v $price_grade[$grade_temp_key2]['start']=intval($grade_temp[0]);) }0 q9 U% t0 d; r
$price_grade[$grade_temp_key2]['end']=$grade_temp[1] ?0 u1 n4 c6 s* ]6 K5 }% z
intval($grade_temp[1]) : "999999999";, e$ C5 s$ u( n. Z
$price_grade[$grade_temp_key2]['price_range'] = $grade_temp_val;
1 H" a$ ~! b# D3 {8 ] $price_grade[$grade_temp_key2]['url'] = build_uri('category', array('cid'=>$cat_id,
1 K7 w) j0 Y! `! | k& G* g1 R* x 'bid'=>$brand, 'price_min'=>$price_grade[$grade_temp_key2]['start'],2 U* N( X3 x' O5 E
'price_max'=> $price_grade[$grade_temp_key2]['end'],
8 R4 _- k" R& e F8 o4 A 'filter_attr'=>$filter_attr_str), $cat['cat_name']);
+ v3 H7 ?5 j, Z9 \6 x8 E- p /* 判断价格区间是否被选中 */: r( D# f6 \, N/ ^" s4 [- L
if (isset($_REQUEST['price_min'])4 W7 K J$ t V$ V5 o8 a
&& $price_grade[$grade_temp_key2]['start'] == $price_min8 v5 w4 W# l: b8 N
&& $price_grade[$grade_temp_key2]['end'] == $price_max)# M0 c/ `! q( B4 p
{
6 m; Z: L; h4 j% g5 c' Y $price_grade[$grade_temp_key2]['selected'] = 1;' v P5 s& e' P: L
}
: D' i, d* v: {8 \ u else
# x( C" p' _ {/ `+ n2 P* D {
& c& T( i# p4 c/ z# q) C $price_grade[$grade_temp_key2]['selected'] = 0;4 o, F, y5 A$ f) `
}
: @1 U3 Q W3 s2 t4 E$ A/ E }- i3 x1 r1 x# t& }+ r
$smarty->assign('price_grade', $price_grade);- U6 V1 A5 z+ P: i6 J# r% g9 a
} |
l X, u! K# c最后一步,找到3 G$ | R, b; L. w# t. M
/ z) u# G' S) @1 R: r" t. V" H9 \ r
return $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .% R! t, S! K, `( z) t
" WHERE cat_id = '$cat_id'"); |
" I* ] z/ O- G; ?2 e将之修改为$ U- T$ ~+ N" B4 b4 m" U4 j1 N
) N- C6 l( S8 U! R* oreturn $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, grade_define, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .+ D% N' M& v3 o6 w2 D; S1 O
" WHERE cat_id = '$cat_id'"); | 8 R- o& b& u p# g7 W
|