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

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

来自版块: 站长杂谈发表于: 2015-8-9 00:11:32
29773
0
如本资源下载地址失效,请点击此处进行反馈
开通本站Svip会员,全站资源免费下
众所周知,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'] . '&nbsp;-&nbsp;' . $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

全部评论 0

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