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

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

来自版块: 站长杂谈发表于: 2015-8-9 00:11:32
29826
0
如本资源下载地址失效,请点击此处进行反馈
开通本站Svip会员,全站资源免费下
众所周知,ECSHOP的价格区间是在后台设置一个“价格区间个数”,然后由程序来自动平分,很多ECSHOP网店主都认为这样做,有很大不尽人意的地方。
1 w, a- v& Z; r. P' {5 Q7 E/ \, l4 N8 g& b* `
论坛里也有人提供过修改方法,好像只是在模板文件里手动写死几个区间的一种方法,还是不能自由定义。
% B5 h1 {* y+ ?$ N* p- M2 p+ P. [# d- V0 q
下面我要讲的方法是可以在ECSHOP后台自由定义价格区间(例如:1-30,31-200,201-1000,1001-5000,5000以上),前台自动体现的一种方法,而且每个类别的价格区间可以任意设置,让价格区间更人性化。& C0 @) A& R6 o# b: a+ @

* k* h/ j% @. O( C  v* k$ Y首先送上演示地址:演示地址已关,请询问客服
# {# M+ R2 e; c- G7 j
: K$ J" y( q8 y$ P* y1)、
首先我们来修改ECSHOP的数据库结构,目的是给 ecs_category 增加一个新字段,
进入 后台 》 数据库管理  》SQL查询,执行下面的SQL语句
ALTER TABLE `ecs_category` ADD `grade_define` VARCHAR( 255 ) NOT NULL AFTER `grade`
注意:这里我使用的是 默认数据库前缀ecs_,如果你的数据库前缀不是 ecs_  , 请修改之。
( q6 n2 s% y5 s* R7 i# [5 [  W7 w; h6 ?1 O7 L8 z
2)、
* P, B' B6 F: O; L% z' A  N  C8 a8 }! g/ [( G/ W" l
打开 /admin/templates/category_info.htm
找到
<tr>
- u& E2 O( _; }  l4 s& |( }        <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 b! Z3 \- w( A! B1 U        <td>
* \& R9 Z4 {- f3 l! a          <input type="text" name="grade" value="{$cat_info.grade|default:0}" size="40" /> <br />
5 a9 }. J& p# o4 A          <span class="notice-span" {if $help_open}style="display:block" {else} style="display:none" {/if} id="noticeGrade">{$lang.notice_grade}</span>
+ i( P2 F$ o6 K+ m$ B' U3 K        </td>
* N, l! \, u+ P! h, h0 L; @      </tr>

- H4 C! K6 K' z7 O+ B" U4 L将它修改为
<tr>
3 ]0 k' B6 a3 t  X( ~; J0 O; @        <td class="label">自定义价格区间:</td>
7 s' }, g/ x# H4 A$ F9 W        <td>0 }" s& {; e- E3 W% C
          <input type="text" name="grade_define" value="{$cat_info.grade_define}" size="60" /> <br />
, ~3 Z/ w& I4 [1 T  f4 C' ^          <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>
0 J! V* P  Z/ J# n  j' Q        </td>  s4 {6 F  ]8 Q' A5 b+ d6 A& ?
      </tr>
' Y: H/ W( ?2 @0 a8 Y/ t

4 M) X! c& X& F3 ]& {: e; [3)、; s. `5 Q2 p4 j" W
' M8 }+ n% B9 j* [# s% l0 |3 M+ @$ ~
接着打开  /admin/category.php 文件,搜索
( @) `9 j2 S  g( O, T
$cat['grade']        = !empty($_POST['grade'])        ? intval($_POST['grade'])      : 0;
/ V, ?, r& C) j' M# H
一共能搜到两处,在每一处的下面都增加代码(注意是每一处)
. h8 n* g, B: T3 a; Q0 D1 o% C" p; X4 n# g
$cat['grade_define']  = !empty($_POST['grade_define']) ? trim($_POST['grade_define'])  : '';  //自定义价格区间 by zhangyh
. u/ Q. X& ^7 p9 m- K0 @0 W' h
到此,后台管理部分修改完毕。
' D, ]" V# M1 }
& Z% C( ]% I2 ~/ U9 ^+ ]7 Z4)、
4 N1 v! M3 D9 n; L- C" {: _1 W; y4 B7 E5 D% k) K& I6 |
下面开始修改前台部分
! K5 K  k1 Z' G2 Z& ^1 ?' |
打开  /category.php
找到
/* 获取价格分级 */* B$ f. [) Q: K" w  @" f
    if ($cat['grade'] == 0  && $cat['parent_id'] != 0)
$ \5 Y9 X9 S* i2 H6 z! t    {
0 ^& c3 C; K! B" O' Z0 x        $cat['grade'] = get_parent_grade($cat_id); //如果当前分类级别为空,取最近的上级分类* `3 d7 x; X, T# `) W
    }
    if ($cat['grade'] > 1)! Z( i. h1 J' z* P/ Z2 c
    {
: }. S' R6 E: a7 j        /* 需要价格分级 */
        /*
+ b/ T# o' v0 O( t: I            算法思路:, i+ E5 F# O# c' o, e
                1、当分级大于1时,进行价格分级7 d! R- ^1 b, H+ e0 I. l9 U
                2、取出该类下商品价格的最大值、最小值
# D/ _. g- V: H% D  f5 p& F# w2 ]                3、根据商品价格的最大值来计算商品价格的分级数量级:
! l5 _/ V) @% g/ J% F; [                        价格范围(不含最大值)    分级数量级# C  q  Z9 [/ }
                        0-0.1                   0.0018 S- p6 W- D, ^6 K
                        0.1-1                   0.01
  V" [8 N4 Z; f: r, _7 u* R+ m                        1-10                    0.1( ^7 ]) [, j; \& h. ^5 m# P8 A
                        10-100                  1
' c" t8 c7 f7 L* n9 M* X                        100-1000                104 g( c( W% `' r1 l+ e) ?$ M
                        1000-10000              100
% s- X% k) A( m4 c9 [! [( s                4、计算价格跨度:
& v8 e4 }* i2 p                        取整((最大值-最小值) / (价格分级数) / 数量级) * 数量级
$ ?/ @; a/ t, M4 o                5、根据价格跨度计算价格范围区间2 w  K) b% s# z' H
                6、查询数据库
            可能存在问题:
& r/ L1 e) y: {! Z5 u$ Z1 b9 F                1、
% M5 e0 B6 y0 Q                由于价格跨度是由最大值、最小值计算出来的( K+ a6 U6 |+ `' m
                然后再通过价格跨度来确定显示时的价格范围区间
; B- J$ F4 N. h$ o; N2 Q                所以可能会存在价格分级数量不正确的问题
4 q) L& s' f, a/ N* U3 U+ V  r                该问题没有证明5 C+ j' N7 `+ f8 u
                2、; n! c5 A1 D, P" ~1 j, n" ]' s
                当价格=最大值时,分级会多出来,已被证明存在
: a/ k$ t0 q+ y% _& ~        */
        $sql = "SELECT min(g.shop_price) AS min, max(g.shop_price) as max ".
7 b# S3 ^7 T: {3 j# j* s               " FROM " . $ecs->table('goods'). " AS g ".
4 y; N: ?8 N% Z: h               " WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1  ';( k8 x4 A" E+ w* p; n  w
               //获得当前分类下商品价格的最大值、最小值
        $row = $db->getRow($sql);
        // 取得价格分级最小单位级数,比如,千元商品最小以100为级数
$ e- w" \3 l0 r, r& V. E' v6 S        $price_grade = 0.0001;
5 Z8 X6 L" t) V/ s' G( R        for($i=-2; $i<= log10($row['max']); $i++)# i; }& ^- F# q! _( e, Y
        {" L# D" q; T+ S5 y
            $price_grade *= 10;
" a4 w5 s. z3 ]  g8 `        }
        //跨度
! W: z  a/ R2 V, g        $dx = ceil(($row['max'] - $row['min']) / ($cat['grade']) / $price_grade) * $price_grade;# E: X8 b( ?! z/ W* X
        if($dx == 0)- t" Q* o2 X: _% z8 z
        {
2 F; z/ J, M* I4 i0 p/ C0 f            $dx = $price_grade;  O+ X2 ~- |- F, ?" N
        }
        for($i = 1; $row['min'] > $dx * $i; $i ++);
        for($j = 1; $row['min'] > $dx * ($i-1) + $price_grade * $j; $j++);
0 ~# j/ m& K( A3 J1 a4 s' @* z        $row['min'] = $dx * ($i-1) + $price_grade * ($j - 1);
        for(; $row['max'] >= $dx * $i; $i ++);
$ d, g) l2 ~+ r4 C: i) N* B' {4 y  A        $row['max'] = $dx * ($i) + $price_grade * ($j - 1);
        $sql = "SELECT (FLOOR((g.shop_price - $row[min]) / $dx)) AS sn, COUNT(*) AS goods_num  ".
6 U% i" q, b) \7 W, w8 g3 b5 S% |               " FROM " . $ecs->table('goods') . " AS g ".* }+ S: S( M, \8 i+ a% o
               " WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 '.) t5 T: t- s8 F  I0 s7 F
               " GROUP BY sn ";
        $price_grade = $db->getAll($sql);
        foreach ($price_grade as $key=>$val)& Q% v0 T9 C' H! l
        {
# _' j, J' E8 C            $temp_key = $key + 1;
+ V. p1 D) {" \            $price_grade[$temp_key]['goods_num'] = $val['goods_num'];
" G2 ]0 f  ?& V9 Y+ C: }            $price_grade[$temp_key]['start'] = $row['min'] + round($dx * $val['sn']);# G, @& ]' E9 |
            $price_grade[$temp_key]['end'] = $row['min'] + round($dx * ($val['sn'] + 1));
: P' W. x' b3 C7 v) E8 L5 J            $price_grade[$temp_key]['price_range'] = $price_grade[$temp_key]['start'] . '&nbsp;-&nbsp;' . $price_grade[$temp_key]['end'];  ?. L$ y4 [6 ]% M8 X& h/ r9 X4 D
            $price_grade[$temp_key]['formated_start'] = price_format($price_grade[$temp_key]['start']);* }/ z# w3 ?+ {# t) ^: V
            $price_grade[$temp_key]['formated_end'] = price_format($price_grade[$temp_key]['end']);
& j  z* n; K4 E  F            $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']);
            /* 判断价格区间是否被选中 */
" X) D3 P: V, u( j3 C            if (isset($_REQUEST['price_min']) && $price_grade[$temp_key]['start'] == $price_min && $price_grade[$temp_key]['end'] == $price_max)
8 F8 n  `2 c  \' f            {
) H% L$ R6 l+ U- s9 J( ]                $price_grade[$temp_key]['selected'] = 1;# e# T7 p; F& ]( C8 c, Q
            }1 ?6 f! e( B) G1 h
            else) F6 o2 k% O' x( j# e
            {
+ O5 C) t0 M! ]7 c6 X. W                $price_grade[$temp_key]['selected'] = 0;' z7 w; w7 _; e" g
            }2 X  s# s1 g% m  Z5 F, M/ M
        }
        $price_grade[0]['start'] = 0;
+ n, d( h7 M% u: D% ?( ^        $price_grade[0]['end'] = 0;: r; M% O  d7 y; p
        $price_grade[0]['price_range'] = $_LANG['all_attribute'];1 @" t6 h) j* I0 M4 x1 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']);" d" g+ t9 h# _/ |
        $price_grade[0]['selected'] = empty($price_max) ? 1 : 0;
        $smarty->assign('price_grade',     $price_grade);
    }
% k9 H( W1 ?* M: y- w8 E) U
8 }; \- G, L, g$ e& S
将它替换为
/* 获取价格分级_新 */
1 n/ _- l2 A" r; |  H- z if($cat['grade_define'])  l# Q# f, H% I1 r4 A# ?/ c/ ]5 \  P
{
4 ^) M* e% N" ^; C $price_grade=array();; h% b3 j3 Q3 `4 n
$price_grade[0]['start'] = 0;- ^& P- u9 A* n! Z
    $price_grade[0]['end'] = 0;
5 \5 G# _3 d$ H+ Z2 w    $price_grade[0]['price_range'] = $_LANG['all_attribute'];
! H2 P, U. {  C* Z    $price_grade[0]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand,
" E1 h, A: L# s% O8 U  'price_min'=>0, 'price_max'=> 0, 'filter_attr'=>$filter_attr_str), $cat['cat_name']);
# r6 ]3 S4 F4 R    $price_grade[0]['selected'] = empty($price_max) ? 1 : 0;
$grade_temp=explode(",", $cat['grade_define']);
" {" h9 W9 D+ t1 P foreach($grade_temp as $grade_temp_key=>$grade_temp_val)
9 x  i" ^9 G3 a% ]0 I+ } {# v) E! W& Y* `$ {; }8 X: w* Q
  $grade_temp_key2=$grade_temp_key+1;
9 k$ ]& y& d2 R4 E1 D  $grade_temp=explode("-", $grade_temp_val);
, s3 n% F8 Z9 h' h" G+ S  $price_grade[$grade_temp_key2]['start']=intval($grade_temp[0]);
9 ]+ \0 D3 v0 G/ @  $price_grade[$grade_temp_key2]['end']=$grade_temp[1] ?
2 I* k5 Q1 G! _# |   intval($grade_temp[1]) : "999999999";
- v# e: h( _- U5 g' t  $price_grade[$grade_temp_key2]['price_range'] = $grade_temp_val;
7 t" t# j' M- G) A! \2 A  $price_grade[$grade_temp_key2]['url'] = build_uri('category', array('cid'=>$cat_id,- X# m4 s% C" L  v
   'bid'=>$brand, 'price_min'=>$price_grade[$grade_temp_key2]['start'],, o6 A/ m* u0 n# }" a. x
   'price_max'=> $price_grade[$grade_temp_key2]['end'],. X+ C/ g) b& H1 s
   'filter_attr'=>$filter_attr_str), $cat['cat_name']);
0 K$ t- L4 `( Y- {; a        /* 判断价格区间是否被选中 */
5 h; d6 b8 C+ T) \4 V            if (isset($_REQUEST['price_min'])
1 q7 W8 a. @- x1 `4 `& |  e# N: V    && $price_grade[$grade_temp_key2]['start'] == $price_min
# k& M) s' Q6 E* K    && $price_grade[$grade_temp_key2]['end'] == $price_max)  o3 K* K. K0 I: m! @/ u
            {
/ l' D. o9 A0 x0 a. E                $price_grade[$grade_temp_key2]['selected'] = 1;
( I2 X' g) r8 p3 n" h" m, b3 W) d+ Y            }- z8 \- b6 m$ V' A/ t+ a* G. Z0 b
            else
4 O" R7 u3 q; M& @5 O' I9 {5 ^            {
; l! e" [  C3 u0 A6 }                $price_grade[$grade_temp_key2]['selected'] = 0;
2 o5 ]8 K6 O1 K# H2 w& h" m            }2 [3 t2 G, ~* `3 s% E* Y8 u
}- o% \, G7 }! k1 k0 U' u& O
$smarty->assign('price_grade',     $price_grade);8 ~: `! C/ S4 |: Q( W% y# m- z$ k
}

  C1 _4 K1 x9 z! k1 O( b4 D最后一步,找到2 }/ a8 Y( h- p* J* N

6 g; Z" j4 H* b% f& K
return $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .
3 \$ K, _$ E7 s4 f2 j1 t( q        " WHERE cat_id = '$cat_id'");

; l9 x; ~: d. \  X' J& B" Q将之修改为" x5 [3 ^3 k% J/ C* s& e$ X

; R- S% v2 q( k, F
return $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, grade_define, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .
% p% C! ?1 e, m( s" ^2 y. d, `        " WHERE cat_id = '$cat_id'");

8 I7 _7 S8 T3 V7 q

全部评论 0

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