ECSHOP可在后台自定义价格区间的方法

ECSHOP系统的在商品的价格区间是自动生成,用户最多能设置的是分成几个区间,而不能设置每一个区间的具体数值。

如下图:

在实际使用上几乎没什么意义,而用户只能设置多少个区间,如下图:

所以我们的目标是将这个部分该为用户可随意配置价格区间。

最终效果如下:

自由定义价格区间(例如:1-30,31-200,201-1000,1001-5000,5000以上)

接下来我们开始具体讲述一下如何来修改代码。

一、添加一个新数据表,来存储我们价格设置SQL代码如下:

  1. ALTER TABLE `ecs_category` ADD `grade_define` VARCHAR( 255 ) NOT NULL AFTER `grade`;

注意:这里我使用的是 默认数据库前缀ecs_,如果你的数据库前缀不是 ecs_ , 请修改之。

二、修改后台的价格区间界面

打开/admin/templates/category_info.htm模板文件,找到一下代码:

  1. <tr>
  2.     <td class="label">
  3.       <a href="javascript:showNotice('noticeGrade');" title="{$lang.form_notice}">
  4.         <img src="images/notice.gif" width="16" height="16" border="0" alt="{$lang.notice_style}" />
  5.       </a>
  6.       {$lang.grade}:
  7.     </td>
  8.     <td>
  9.       <input type="text" name="grade" value="{$cat_info.grade|default:0}" size="40" /><br />
  10.       <span class="notice-span" 
  11.         {if $help_open}
  12.           style="display:block" 
  13.         {else}
  14.           style="display:none" 
  15.         {/if}
  16.       id="noticeGrade">
  17.         {$lang.notice_grade}
  18.       </span>
  19.     </td>
  20. </tr>

然后修改成:

  1. <tr>
  2.   <td class="label">自定义价格区间:</td>
  3.   <td>
  4.     <input type="text" name="grade_define" value="{$cat_info.grade_define}" size="60" /> <br />
  5.     <span class="notice-span" 
  6.       {if $help_open}
  7.         style="display:block" 
  8.       {else}
  9.         style="display:none" 
  10.       {/if}
  11.     id="noticeGrade">
  12.       以 半角 , 间隔,如: 1-30,31-200,201-1000,1001-5000,5000以上
  13.     </span>
  14.   </td>
  15. </tr>

3、修改/admin/category.php的代码

打开文件后,找到一下代码:

  1. $cat['grade']        = !empty($_POST['grade'])        ? intval($_POST['grade'])      : 0;

一共能搜到两处,在每一处的下面都增加代码。

  1. //自定义价格区间 by 风来西林
  2. $cat['grade_define']  = !empty($_POST['grade_define']) ? trim($_POST['grade_define'])  : '';

现在后台的代码阶段就完成。

4、修改/category.php文件。

打开文件后找到一下代码段:

  1. if ($cat['grade'] == 0  && $cat['parent_id'] != 0)
  2.     {
  3.         $cat['grade'] = get_parent_grade($cat_id); //如果当前分类级别为空,取最近的上级分类
  4.     }
  5.     if ($cat['grade'] > 1)
  6.     {
  7.       
  8.       
  9.         $sql = "SELECT min(g.shop_price) AS min, max(g.shop_price) as max ".
  10.                " FROM " . $ecs->table('goods'). " AS g ".
  11.                " WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1  ';
  12.                //获得当前分类下商品价格的最大值、最小值
  13.         $row = $db->getRow($sql);
  14.         // 取得价格分级最小单位级数,比如,千元商品最小以100为级数
  15.         $price_grade = 0.0001;
  16.         for($i=-2; $i<= log10($row['max']); $i++)
  17.         {
  18.             $price_grade *= 10;
  19.         }
  20.         //跨度
  21.         $dx = ceil(($row['max'] - $row['min']) / ($cat['grade']) / $price_grade) * $price_grade;
  22.         if($dx == 0)
  23.         {
  24.             $dx = $price_grade;
  25.         }
  26.         for($i = 1; $row['min'] > $dx * $i; $i ++);
  27.         for($j = 1; $row['min'] > $dx * ($i-1) + $price_grade * $j; $j++);
  28.         $row['min'] = $dx * ($i-1) + $price_grade * ($j - 1);
  29.         for(; $row['max'] >= $dx * $i; $i ++);
  30.         $row['max'] = $dx * ($i) + $price_grade * ($j - 1);
  31.         $sql = "SELECT (FLOOR((g.shop_price - $row[min]) / $dx)) AS sn, COUNT(*) AS goods_num  ".
  32.                " FROM " . $ecs->table('goods') . " AS g ".
  33.                " WHERE ($children OR " . get_extension_goods($children) . ') AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 '.
  34.                " GROUP BY sn ";
  35.         $price_grade = $db->getAll($sql);
  36.         foreach ($price_grade as $key=>$val)
  37.         {
  38.             $temp_key = $key + 1;
  39.             $price_grade[$temp_key]['goods_num'] = $val['goods_num'];
  40.             $price_grade[$temp_key]['start'] = $row['min'] + round($dx * $val['sn']);
  41.             $price_grade[$temp_key]['end'] = $row['min'] + round($dx * ($val['sn'] + 1));
  42.             $price_grade[$temp_key]['price_range'] = $price_grade[$temp_key]['start'] . '&nbsp;-&nbsp;' . $price_grade[$temp_key]['end'];
  43.             $price_grade[$temp_key]['formated_start'] = price_format($price_grade[$temp_key]['start']);
  44.             $price_grade[$temp_key]['formated_end'] = price_format($price_grade[$temp_key]['end']);
  45.             $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']);
  46.           
  47.             if (isset($_REQUEST['price_min']) && $price_grade[$temp_key]['start'] == $price_min && $price_grade[$temp_key]['end'] == $price_max)
  48.             {
  49.                 $price_grade[$temp_key]['selected'] = 1;
  50.             }
  51.             else
  52.             {
  53.                 $price_grade[$temp_key]['selected'] = 0;
  54.             }
  55.         }
  56.         $price_grade[0]['start'] = 0;
  57.         $price_grade[0]['end'] = 0;
  58.         $price_grade[0]['price_range'] = $_LANG['all_attribute'];
  59.         $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']);
  60.         $price_grade[0]['selected'] = empty($price_max) ? 1 : 0;
  61.         $smarty->assign('price_grade',     $price_grade);
  62.     }

然后修改成一下代码:

  1. if($cat['grade_define'])
  2.  {
  3.  $price_grade=array();
  4.  $price_grade[0]['start'] = 0;
  5.     $price_grade[0]['end'] = 0;
  6.     $price_grade[0]['price_range'] = $_LANG['all_attribute'];
  7.     $price_grade[0]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand,
  8.   'price_min'=>0, 'price_max'=> 0, 'filter_attr'=>$filter_attr_str), $cat['cat_name']);
  9.     $price_grade[0]['selected'] = empty($price_max) ? 1 : 0;
  10.  $grade_temp=explode(",", $cat['grade_define']);
  11.  foreach($grade_temp as $grade_temp_key=>$grade_temp_val)
  12.  {
  13.   $grade_temp_key2=$grade_temp_key+1;
  14.   $grade_temp=explode("-", $grade_temp_val);
  15.   $price_grade[$grade_temp_key2]['start']=intval($grade_temp[0]);
  16.   $price_grade[$grade_temp_key2]['end']=$grade_temp[1] ?
  17.    intval($grade_temp[1]) : "999999999";
  18.   $price_grade[$grade_temp_key2]['price_range'] = $grade_temp_val;
  19.   $price_grade[$grade_temp_key2]['url'] = build_uri('category', array('cid'=>$cat_id,
  20.    'bid'=>$brand, 'price_min'=>$price_grade[$grade_temp_key2]['start'],
  21.    'price_max'=> $price_grade[$grade_temp_key2]['end'],
  22.    'filter_attr'=>$filter_attr_str), $cat['cat_name']);
  23.       
  24.             if (isset($_REQUEST['price_min'])
  25.     && $price_grade[$grade_temp_key2]['start'] == $price_min
  26.     && $price_grade[$grade_temp_key2]['end'] == $price_max)
  27.             {
  28.                 $price_grade[$grade_temp_key2]['selected'] = 1;
  29.             }
  30.             else
  31.             {
  32.                 $price_grade[$grade_temp_key2]['selected'] = 0;
  33.             }
  34.  }
  35.  $smarty->assign('price_grade',     $price_grade);
  36.  }

完成后我们在找到一下代码:

  1. return $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .
  2.         " WHERE cat_id = '$cat_id'");

修改成一下代码:

  1. return $GLOBALS['db']->getRow('SELECT cat_name, keywords, cat_desc, style, grade, grade_define, filter_attr, parent_id FROM ' . $GLOBALS['ecs']->table('category') .
  2.         " WHERE cat_id = '$cat_id'");

到这里我们的修改全部完成,登录到系统后可以设置价格区间了。



发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

无觅相关文章插件,快速提升流量