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

2016-07-07 15:13 来源:www.chinab4c.com 作者:ecshop专家

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

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

第一步:修改/include/lib_goods.php,在第24行加入以下代码:
  1. /**
  2. * 获得指定分类下的子分类
  3. *
  4. * @accesspublic
  5. * @paraminteger$cat_id分类编号
  6. * @returnarray
  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. $res = $GLOBALS['db']->getAll($sql);

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

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

  57. return $cat_arr;
  58. }
  59. }
复制代码
这其实就是一个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

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

点击子类:
modi2.gif

点击没有分类的:
modi3.gif


回答:
非常好,严重支持!

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

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


支持啊

修改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文件的哪里?

楼主,好高的手哇。

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

呵呵,有用就好~~

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

人才

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

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

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


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

category.rar (4.21 KB)


yck841007 你提供的代码没问题啊

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

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

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

未标题-1 拷贝.gif (72.65 KB)

未标题-1 拷贝.gif


受用,LZ牛

我看了下,还不是很明白

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

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

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