进入论坛发帖前请先读本帖 | 常见问题
ECShop营销服务包--网罗天下,帮您吆喝生意
立即下载V2.7.2 Release 0604正式版发布
安装指南 | 升级指南 | 用户手册 | 在线帮助
ECShop商业授权咨询与购买联系方式
ShopEx为您推荐精品货源,让您赚翻天
paypal支付插件+财付通支付插件补丁发布
快钱支付插件补丁发布
ECShop 模板制作手册 | ECShop 最新模板
ECShop V2.7.2模板 | ECShop2.7.0以前模板
卖否独立网店开店平台| 买否便捷购物导航
ECMall多用户商城系统
返回列表 发帖
ECShop V2.7.2 正式版 下载                             ECShop V2.7.1官方模板下载

发布一个取得ECshop当前分类及其子分类的Hack

应该说Ecshop的分类做得还是比较好的,考虑到了大部分人的应用,能把所有的分类列表都显示出来,但还是有一些漏洞,有些网友也已经发现了。
另外当我们点击有子分类的某个分类时,Ecshop将没必要显示的分类也一起读出来了(相当于你想查你爸爸所有的孩子、孙子时,它把你爸爸所有的兄弟姐妹都一起显示出来了),这对一部分用户来说确实没必要。

我的修改只是在原有功能上添加一些功能,所以不影响原有的功能,而且也结合了模板技术,应该说定制起来还比较方便的,与大家分享:

第一步:修改/include/lib_goods.php,在第24行加入以下代码:
  1. /**
  2. * 获得指定分类下的子分类
  3. *
  4. * @access  public
  5. * @param   integer     $cat_id     分类编号
  6. * @return  array
  7. */
  8. function get_children_tree($cat_id)
  9. {
  10.      if ($cat_id >0 )
  11.     {
  12.         $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('category') . " WHERE parent_id = '$cat_id'";
  13.         //$cot = $GLOBALS['db']->getOne($sql);        
  14.         if ($GLOBALS['db']->getOne($sql))
  15.         {
  16.             // 获取当前分类名及其子类
  17.             $sql = 'SELECT a.cat_id, a.cat_name, a.sort_order AS parent_order, a.cat_id, ' .
  18.                     'b.cat_id AS child_id, b.cat_name AS child_name, b.sort_order AS child_order ' .
  19.                 'FROM ' . $GLOBALS['ecs']->table('category') . ' AS a ' .
  20.                 'LEFT JOIN ' . $GLOBALS['ecs']->table('category') . ' AS b ON b.parent_id = a.cat_id ' .
  21.                 "WHERE a.cat_id = '$cat_id' ORDER BY parent_order ASC, a.cat_id ASC, child_order ASC";
  22.         }        
  23.         else
  24.         {
  25.             $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";
  26.             $parent_id = $GLOBALS['db']->getOne($sql);
  27.             if ($parent_id > 0)
  28.             {
  29.                 //获取当前分类、兄弟及其父类
  30.                 $sql = 'SELECT a.cat_id, a.cat_name, b.cat_id AS child_id, b.cat_name AS child_name, b.sort_order ' .
  31.                     'FROM ' . $GLOBALS['ecs']->table('category') . ' AS a ' .
  32.                     'LEFT JOIN ' . $GLOBALS['ecs']->table('category') . ' AS b ON b.parent_id = a.cat_id ' .
  33.                     "WHERE b.parent_id = '$parent_id' ORDER BY sort_order ASC";
  34.             }
  35.             else
  36.             {
  37.                 //获取当前分类
  38.                 $sql = 'SELECT a.cat_id, a.cat_name FROM '
  39.                         . $GLOBALS['ecs']->table('category') . ' AS a ' .
  40.                         "WHERE a.cat_id = '$cat_id'";
  41.             }
  42.         }
  43.         
  44.         
  45.         $res = $GLOBALS['db']->getAll($sql);

  46.     $cat_arr = array();
  47.     foreach ($res AS $row)
  48.     {
  49.         $cat_arr[$row['cat_id']]['id']   = $row['cat_id'];
  50.         $cat_arr[$row['cat_id']]['name'] = $row['cat_name'];
  51.         $cat_arr[$row['cat_id']]['url']  = build_uri('category', array('cid' => $row['cat_id']), $row['cat_name']);

  52.         if ($row['child_id'] != NULL)
  53.         {
  54.             $cat_arr[$row['cat_id']]['children'][$row['child_id']]['id']   = $row['child_id'];
  55.             $cat_arr[$row['cat_id']]['children'][$row['child_id']]['name'] = $row['child_name'];
  56.             $cat_arr[$row['cat_id']]['children'][$row['child_id']]['url']  = build_uri('category', array('cid' => $row['child_id']), $row['child_name']);
  57.         }
  58.     }

  59.     return $cat_arr;
  60.     }   
  61. }
复制代码
这其实就是一个get_children_tree函数,更具$cat_id来得到当前分类所有的孩子


第二步,修改/category.php,找到122行,原先的代码是:
  1. $smarty->assign('categories',       get_categories_tree($cat_id)); // 分类树
复制代码
这其实是模板技术,如果你想彻底抛弃原来的分类样式,那么把get_categories_tree($cat_id)换成刚才我们自定义的函数get_children_tree($cat_id)

如果你想保留原先的分类功能,再新增自定义的分类功能,那么在122行下面再新增一行:
  1. $smarty->assign('categories2',       get_children_tree($cat_id));
复制代码


如果想用不同的颜色表示出当前点击的分类和其他分类,那么还要保留当前点击的分类id。再加一行:
  1. $smarty->assign('current_cat_id',    $cat_id);    //当前的id
复制代码



最后一步是模板:修改category.dwt。
你要根据第二部定义的模板变量来写:到底是categories还是categories2,更具你实际情况来定。我这里是categories2:
  1. <!--{foreach from=$categories item=cat}-->
  2. {$cat.name|escape:html} <!--这个就是你点击的分类,下面都是他的子类-->
  3.      <!--{foreach from=$cat.children item=child}-->
  4.       <a href="{$child.url}">
  5. <!--{if $current_cat_id eq $child.id} 显示当前点击的分类为橙色--><span style="color:#ff6600"><!--{/if}-->· {$child.name|escape:html}<!--{if $current_cat_id eq $child.id}--></span><!--{/if}--></a>
  6.       <!--{foreachelse}-->
  7.       · 没有分类了!
  8.       <!--{/foreach}-->
  9. <!--{/foreach}-->
复制代码
效果图:
原先的分类树:
org.gif
2007-7-21 13:21


新增加的只有当前类别及其子类的(点击其中的“世界名表”):
modi.gif
2007-7-21 13:21


点击子类:
modi2.gif
2007-7-21 13:34


点击没有分类的:
modi3.gif
2007-7-21 13:34


[ 本帖最后由 xaero 于 2007-7-21 15:06 编辑 ]
2

评分人数

模板交流区群:QQ60221814;ECSHOP用户交流群:QQ77677503(满),79649325(满),7853552(新群),103412903(新群) 31497022 (热心用户建立)

赞一个!

非常好,严重支持!

参考你说的方法改了,效果很满意,谢谢了

http://www.360kbl.com/kblpro/

[ 本帖最后由 kebel 于 2007-7-23 09:34 编辑 ]
专业器材最齐全-科百隆  www.360kbl.com/kblpro

TOP

支持啊

TOP

修改category.dwt。
你要根据第二部定义的模板变量来写:到底是categories还是categories2,更具你实际情况来定。我这里是categories2:


<!--{foreach from=$categories item=cat}-->
{$cat.name|escape:html} <!--这个就是你点击的分类,下面都是他的子类-->
     <!--{foreach from=$cat.children item=child}-->
      <a href="{$child.url}">
<!--{if $current_cat_id eq $child.id} 显示当前点击的分类为橙色--><span style="color:#ff6600"><!--{/if}-->· {$child.name|escape:html}<!--{if $current_cat_id eq $child.id}--></span><!--{/if}--></a>
      <!--{foreachelse}-->
      · 没有分类了!
      <!--{/foreach}-->
<!--{/foreach}-->


请问这段代码应该放在category.dwt文件的哪里?

TOP

楼主,好高的手哇。
ECSHOP原创模板 每周更新   EC模板群:6429401

TOP

我看不懂~只知道是发共享的就加分

TOP

呵呵,有用就好~~

to:yck841007
你问的那段代码的作用是输出分类列表,你觉得你的分类列表应该放在哪里,代码就放在哪里~
或者你可以参考原模板的代码,把原模板的代码换掉也可以

TOP

人才

TOP

楼主能不能把网站给放出来。这样看实在不知道是达到什么效果

TOP

原帖由 xaero 于 2007-7-23 19:19 发表
呵呵,有用就好~~

to:yck841007
你问的那段代码的作用是输出分类列表,你觉得你的分类列表应该放在哪里,代码就放在哪里~
或者你可以参考原模板的代码,把原模板的代码换掉也可以


我对比了一下代码,看到有很多相似的地方,知道从哪里开始,但是不知道从哪里结束,前辈能不能帮忙改一下,麻烦了。

category.rar (4.21 KB)

TOP

yck841007 你提供的代码没问题啊

效果演示:http://www.fmbz.net,主页左边的分类,已经分类页面上的分类

TOP

我的已经改好了,请大家参考!!!

http://www.360kbl.com/kblpro/
未标题-1 拷贝.gif
专业器材最齐全-科百隆  www.360kbl.com/kblpro

TOP

受用,LZ牛

TOP

我看了下,还不是很明白

TOP

晕 这么相似 上次我就是帮客户修改了一个 取当前分类以及子分类和子分类的子分类
或者取出当前分类下面的所有子分类

修改这部分的客户大多数都是分类比较多 按照ec原来的分类 点进去一个分类以后 显示了所有的分类 所以分类会列的很长
修改后  比如点击手机这一个分类 仅仅会显示手机下面的分类 。。。

【ECSHOP 程序·模板·主机】交流QQ群:5583423

TOP

返回列表