众所周知,ECSHOP的价格区间是在后台设置一个“价格区间个数”,然后由程序来自动平分,很多ECSHOP网店主都认为这样做,有很大不尽人意的地方。
+ r( w7 Q, T6 B, M* \. h$ n+ X# I# l! e4 d3 y0 z* P) q
论坛里也有人提供过修改方法,好像只是在模板文件里手动写死几个区间的一种方法,还是不能自由定义。3 a" a _7 D! k) z) e( O" M
! `% ]5 f; s$ V) m; B& s. {4 r M
下面我要讲的方法是可以在ECSHOP后台自由定义价格区间(例如:1-30,31-200,201-1000,1001-5000,5000以上),前台自动体现的一种方法,而且每个类别的价格区间可以任意设置,让价格区间更人性化。
9 ^1 e/ _$ g5 |1 z7 ]; ^* i
. ^# Y j4 N; h$ E+ y' y5 i# @$ X @6 r3 K首先送上演示地址:演示地址已关,请询问客服/ E% x% \: B6 O2 k5 \
. T+ R# L. y; k5 {2 s" ]3 y
1)、 首先我们来修改ECSHOP的数据库结构,目的是给 ecs_category 增加一个新字段, 进入 后台 》 数据库管理 》SQL查询,执行下面的SQL语句 ALTER TABLE `ecs_category` ADD `grade_define` VARCHAR( 255 ) NOT NULL AFTER `grade` 注意:这里我使用的是 默认数据库前缀ecs_,如果你的数据库前缀不是 ecs_ , 请修改之。
% O' a7 n9 l4 `$ s$ n( ]+ F+ V0 }/ G5 v
2)、+ j7 D' k6 I6 y1 P j% S* P
b1 A. N c, c& G
打开 /admin/templates/category_info.htm 找到 <tr>( P2 c- _, v/ K: 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>; v- z; ^9 Z% o
<td>
( E% t& V/ s, t. ~7 [ <input type="text" name="grade" value="{$cat_info.grade|default:0}" size="40" /> <br />
, ~( ?- ]7 r6 _9 I <span class="notice-span" {if $help_open}style="display:block" {else} style="display:none" {/if} id="noticeGrade">{$lang.notice_grade}</span>
- T9 F1 ?5 U# T6 Z$ Y </td>
, q' n3 w' h: _$ k2 R8 g0 ~% h: B </tr> |
- ?6 h6 _1 p3 f# q! Q' T* K将它修改为<tr>
5 G& i- [; T2 u0 f0 M2 e <td class="label">自定义价格区间:</td>& C+ o) W4 p D% G$ d
<td>
7 b- j- q8 p: L9 ~) d7 W1 G: `2 | <input type="text" name="grade_define" value="{$cat_info.grade_define}" size="60" /> <br />9 V% A- r" {: k! e! @ Z. ]
<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>3 i# A. e6 O# c
</td>; _" Y( t5 H1 Q! s
</tr> |
6 n* U3 e Z; M7 |% k/ U" U& j* n4 s/ O- v0 a7 L
3)、
8 R% i# Y+ `! G) [% F
I: q( U0 S2 [1 I; Y5 A接着打开 /admin/category.php 文件,搜索 - ?' Q3 V4 x v' l: M. I+ i
$cat['grade'] = !empty($_POST['grade']) ? intval($_POST['grade']) : 0; | : D$ v0 t* q6 W) E& k
一共能搜到两处,在每一处的下面都增加代码(注意是每一处)
0 A, r. U% B0 m
& |' {0 R# h8 y4 Z: ^* X9 K4 Y$cat['grade_define'] = !empty($_POST['grade_define']) ? trim($_POST['grade_define']) : ''; //自定义价格区间 by zhangyh |
) k4 P$ `* F6 I' a& B( c到此,后台管理部分修改完毕。
( U4 h {7 \' |5 B) Q" F: Y: z6 U* p* o) i6 c7 r$ f N5 j
4)、) ~* y* @- i! C9 E) T8 W9 ^2 z
- \* v+ Q- s, d. ~% L下面开始修改前台部分
% q% g# W3 E& J/ u打开 /category.php 找到 /* 获取价格分级 */2 R- b% x" z% J( M
if ($cat['grade'] == 0 && $cat['parent_id'] != 0)
7 k, K/ f& R# E {$ v* f+ S+ }7 V
$cat['grade'] = get_parent_grade($cat_id); //如果当前分类级别为空,取最近的上级分类
, z" `9 @/ ?+ n- D( i } if ($cat['grade'] > 1)
) k( ` d. Z5 J2 f {! G( R2 R+ `! W, V% ?: r! P% d1 I
/* 需要价格分级 */ /*
0 U# ?0 i" e- O4 C 算法思路:
+ J# F4 A: w* j" ?) c 1、当分级大于1时,进行价格分级
- ?! `8 S. w) @; Q 2、取出该类下商品价格的最大值、最小值
; s6 _- H4 G9 q7 j 3、根据商品价格的最大值来计算商品价格的分级数量级:. g! y) O9 q, q. u* q' B# `7 k( [& o
价格范围(不含最大值) 分级数量级1 M K) i* q+ t$ p% U9 A c7 s5 d; |
0-0.1 0.001
* r5 d/ u, F3 y- V4 M 0.1-1 0.01
$ f& b; y: z5 N4 s5 m 1-10 0.1$ v7 \# \$ `4 ~
10-100 1
0 m8 h" ^& Q7 v- ~ q 100-1000 10! g: S/ z8 G2 l
1000-10000 100
7 v8 C: T( M0 U# h 4、计算价格跨度:3 c2 X+ y/ B# Q
取整((最大值-最小值) / (价格分级数) / 数量级) * 数量级
W$ k( C; c7 L a6 C0 o 5、根据价格跨度计算价格范围区间
7 F/ @8 O5 c1 r; t& V1 [ 6、查询数据库 可能存在问题:
+ f" {4 ?+ @% n2 k# }9 h 1、
1 b- d4 A x+ e0 Z* w+ P3 q 由于价格跨度是由最大值、最小值计算出来的# F8 C( c9 {( m. e" B7 i# D
然后再通过价格跨度来确定显示时的价格范围区间$ T7 S- b* \5 P7 [
所以可能会存在价格分级数量不正确的问题% J9 n0 M4 a+ d0 H
该问题没有证明2 H% R+ @! G% |, a
2、
3 c) C7 U# h+ ^# k! R 当价格=最大值时,分级会多出来,已被证明存在3 t& }/ |& F( K0 _/ y
*/ $sql = "SELECT min(g.shop_price) AS min, max(g.shop_price) as max ".
( M- l; }, e4 J" ] i2 e " FROM " . $ecs->table('goods'). " AS g ".# t, Y& C# L4 K$ B* T3 ^# W
" WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 ';' M; k) r u' I2 a" @
//获得当前分类下商品价格的最大值、最小值 $row = $db->getRow($sql); // 取得价格分级最小单位级数,比如,千元商品最小以100为级数- k6 }) s' N7 ?& \5 l* Y
$price_grade = 0.0001;: h7 ^. B5 ?- g1 M; L3 e
for($i=-2; $i<= log10($row['max']); $i++)
( N' [5 q- D- ] {% @# l$ v; b" R/ p" |! Y
$price_grade *= 10;
' j1 u- g' N2 E$ B# p2 b } //跨度
8 O; v# ^/ |8 V6 O: l- [7 \ $dx = ceil(($row['max'] - $row['min']) / ($cat['grade']) / $price_grade) * $price_grade;6 U' O; a" A0 ~& v7 A- Y e! B) J
if($dx == 0)
) `# P$ f4 k; _) a$ f7 k* A/ T { [% L' l/ z/ H9 ]
$dx = $price_grade;3 g7 I7 B+ v: q9 J* D. A: L
} for($i = 1; $row['min'] > $dx * $i; $i ++); for($j = 1; $row['min'] > $dx * ($i-1) + $price_grade * $j; $j++);' v c. \1 i0 L1 {& {, ?7 E
$row['min'] = $dx * ($i-1) + $price_grade * ($j - 1); for(; $row['max'] >= $dx * $i; $i ++);
" H2 W X* |- F) d $row['max'] = $dx * ($i) + $price_grade * ($j - 1); $sql = "SELECT (FLOOR((g.shop_price - $row[min]) / $dx)) AS sn, COUNT(*) AS goods_num ".% Y: L" D6 I5 I# [" C
" FROM " . $ecs->table('goods') . " AS g ".3 H) W5 N; Y) b- ^8 L! J
" WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 '.
m/ n" o. r! | " GROUP BY sn "; $price_grade = $db->getAll($sql); foreach ($price_grade as $key=>$val)
4 g! W3 H- ^1 ?9 Q, {' C {
4 A% U% _6 `! s7 f* n7 f" r $temp_key = $key + 1;
2 |3 {( h& y e, {4 x $price_grade[$temp_key]['goods_num'] = $val['goods_num'];1 M" o1 j2 }4 L
$price_grade[$temp_key]['start'] = $row['min'] + round($dx * $val['sn']);
. X$ A/ m& _5 n, J0 ~ $price_grade[$temp_key]['end'] = $row['min'] + round($dx * ($val['sn'] + 1));: D4 ] G: o4 g
$price_grade[$temp_key]['price_range'] = $price_grade[$temp_key]['start'] . ' - ' . $price_grade[$temp_key]['end'];
1 |) m9 S% r \ $price_grade[$temp_key]['formated_start'] = price_format($price_grade[$temp_key]['start']);) l' @5 u# l( O# D0 L. l; J0 f
$price_grade[$temp_key]['formated_end'] = price_format($price_grade[$temp_key]['end']);# V) M8 M& X4 e- i( Q4 v
$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']); /* 判断价格区间是否被选中 */, G& e2 u3 ^( L2 w& x* g
if (isset($_REQUEST['price_min']) && $price_grade[$temp_key]['start'] == $price_min && $price_grade[$temp_key]['end'] == $price_max)
: u" d3 x2 L& C$ l/ v! F+ d6 H {0 l5 ~8 \6 M/ \/ U9 s I
$price_grade[$temp_key]['selected'] = 1;
) x- [ \4 S( D0 }2 S6 G7 @; J. S }
( F' p- a# C1 t' ]/ t else6 g9 z; Y' n1 U |1 U
{
( e+ o7 G; l8 ? $price_grade[$temp_key]['selected'] = 0;
6 i4 V. G4 I: Z/ I$ q1 ? }8 r6 G/ n+ ^* t* i
} $price_grade[0]['start'] = 0;: ~7 P3 c6 V) y# H" {
$price_grade[0]['end'] = 0;! v- a3 y W! f( d8 S% M: D
$price_grade[0]['price_range'] = $_LANG['all_attribute'];% a! b" y( s/ n" J8 |# K0 q$ q' D
$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']);
7 p3 J5 }$ n" v i $price_grade[0]['selected'] = empty($price_max) ? 1 : 0; $smarty->assign('price_grade', $price_grade); } | 8 t: p) {! k) H( }
. p% E" R' h: H4 S( p将它替换为/* 获取价格分级_新 */7 h7 i: o8 w- g0 f! s1 t5 A) w
if($cat['grade_define']): w, A$ D x! s7 \4 t
{
4 d- f& m% y# L: @) Z: u, i $price_grade=array();
, J, i" p- C) d g $price_grade[0]['start'] = 0;
& v0 E Y: ]% W( k/ p $price_grade[0]['end'] = 0;
, |5 e* u( @1 _5 b' \+ p $price_grade[0]['price_range'] = $_LANG['all_attribute'];
0 }4 C Z9 ]4 q9 I C $price_grade[0]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand,) Y4 v/ C) {5 I3 G6 k
'price_min'=>0, 'price_max'=> 0, 'filter_attr'=>$filter_attr_str), $cat['cat_name']);
% t* d( j O" I8 r8 z$ H: t' E u $price_grade[0]['selected'] = empty($price_max) ? 1 : 0; $grade_temp=explode(",", $cat['grade_define']);! c8 w0 ?1 k# x) b7 h, W+ h" C( o
foreach($grade_temp as $grade_temp_key=>$grade_temp_val)$ h- \ t9 G/ R& f
{8 d% K" j- D" W. ^- I
$grade_temp_key2=$grade_temp_key+1;
) G0 ^. Q( B* Q$ N* ^ $grade_temp=explode("-", $grade_temp_val);4 X/ D: C' W) ]8 i
$price_grade[$grade_temp_key2]['start']=intval($grade_temp[0]);
4 [; }5 @% R6 q. J+ J' [ $price_grade[$grade_temp_key2]['end']=$grade_temp[1] ?
; t3 G6 l: t8 {) v& f0 B } intval($grade_temp[1]) : "999999999";
- H: [ J6 ?+ e0 V, e% G; M1 G2 s $price_grade[$grade_temp_key2]['price_range'] = $grade_temp_val;
" q1 j8 n$ x6 [) d+ W% h# {* J& T $price_grade[$grade_temp_key2]['url'] = build_uri('category', array('cid'=>$cat_id,
$ g, D, L$ l2 d: H& K4 l 'bid'=>$brand, 'price_min'=>$price_grade[$grade_temp_key2]['start'],) U6 z; Y( y) c) b& J- G
'price_max'=> $price_grade[$grade_temp_key2]['end'],+ d W+ ` N7 j: H1 z
'filter_attr'=>$filter_attr_str), $cat['cat_name']);) K/ T0 u$ M* n, R
/* 判断价格区间是否被选中 */
4 L; J1 _% Y7 `* Q if (isset($_REQUEST['price_min'])% }# u0 D ^- H
&& $price_grade[$grade_temp_key2]['start'] == $price_min o) Z, m/ T* ^ O! X! r z1 o
&& $price_grade[$grade_temp_key2]['end'] == $price_max)
# F# Y+ L8 c: j: U U$ G {
, W4 ?! x* [# T7 E& i2 X$ z8 M $price_grade[$grade_temp_key2]['selected'] = 1;( L5 e1 T/ r3 I0 T# x5 \; t
}) [( B+ G) M6 S
else
. n' n2 v( n6 K {/ E' V% @; [: v P f
$price_grade[$grade_temp_key2]['selected'] = 0;( c# @, w* {3 l+ ]1 x7 K% f
}
* |% {% v. s% J" N }
|, n- |0 u! h }9 T. b; t $smarty->assign('price_grade', $price_grade);- c, B9 ]; @& X" E* Z0 E
} |
1 ?1 ^4 y5 x! z0 @( Y, ]. o2 Q% b
最后一步,找到
1 u2 o3 e4 t. W5 D0 n: y9 y$ y4 J
& y4 j1 v' C1 @0 z8 ?# {* Z return $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .
1 z& }! O7 \- I9 K " WHERE cat_id = '$cat_id'"); |
' _! U+ C. @: s. Y! Z5 T将之修改为
+ k' t3 L9 e3 Q* I9 M; K5 Q& }9 d
return $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, grade_define, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .* X) Q: Y, H k8 j4 @8 z" C) n' }
" WHERE cat_id = '$cat_id'"); |
& _ m: C M z; v# i% _" L |