在ECSHOP后台自定义价格区间,让价格区间更人性化-站长杂谈下载

在ECSHOP后台自定义价格区间,让价格区间更人性化

开通本站Svip会员,全站资源免费下
众所周知,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'] . '&nbsp;-&nbsp;' . $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* o
return $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

全部评论 0

您需要登录后才可以回帖 立即登录
登录
0
0
0
返回顶部