|

- 帖子
- 48
- 积分
- 146
- 体力
- 64 点
- 金币
- 0
- 威望
- 0
|

发布一个取得ECshop当前分类及其子分类的Hack
应该说Ecshop的分类做得还是比较好的,考虑到了大部分人的应用,能把所有的分类列表都显示出来,但还是有一些漏洞,有些网友也已经发现了。
另外当我们点击有子分类的某个分类时,Ecshop将没必要显示的分类也一起读出来了(相当于你想查你爸爸所有的孩子、孙子时,它把你爸爸所有的兄弟姐妹都一起显示出来了),这对一部分用户来说确实没必要。
我的修改只是在原有功能上添加一些功能,所以不影响原有的功能,而且也结合了模板技术,应该说定制起来还比较方便的,与大家分享:
第一步:修改/include/lib_goods.php,在第24行加入以下代码:- /**
- * 获得指定分类下的子分类
- *
- * @access public
- * @param integer $cat_id 分类编号
- * @return array
- */
- function get_children_tree($cat_id)
- {
- if ($cat_id >0 )
- {
- $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('category') . " WHERE parent_id = '$cat_id'";
- //$cot = $GLOBALS['db']->getOne($sql);
- if ($GLOBALS['db']->getOne($sql))
- {
- // 获取当前分类名及其子类
- $sql = 'SELECT a.cat_id, a.cat_name, a.sort_order AS parent_order, a.cat_id, ' .
- 'b.cat_id AS child_id, b.cat_name AS child_name, b.sort_order AS child_order ' .
- 'FROM ' . $GLOBALS['ecs']->table('category') . ' AS a ' .
- 'LEFT JOIN ' . $GLOBALS['ecs']->table('category') . ' AS b ON b.parent_id = a.cat_id ' .
- "WHERE a.cat_id = '$cat_id' ORDER BY parent_order ASC, a.cat_id ASC, child_order ASC";
- }
- else
- {
- $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";
- $parent_id = $GLOBALS['db']->getOne($sql);
- if ($parent_id > 0)
- {
- //获取当前分类、兄弟及其父类
- $sql = 'SELECT a.cat_id, a.cat_name, b.cat_id AS child_id, b.cat_name AS child_name, b.sort_order ' .
- 'FROM ' . $GLOBALS['ecs']->table('category') . ' AS a ' .
- 'LEFT JOIN ' . $GLOBALS['ecs']->table('category') . ' AS b ON b.parent_id = a.cat_id ' .
- "WHERE b.parent_id = '$parent_id' ORDER BY sort_order ASC";
- }
- else
- {
- //获取当前分类
- $sql = 'SELECT a.cat_id, a.cat_name FROM '
- . $GLOBALS['ecs']->table('category') . ' AS a ' .
- "WHERE a.cat_id = '$cat_id'";
- }
- }
-
-
- $res = $GLOBALS['db']->getAll($sql);
- $cat_arr = array();
- foreach ($res AS $row)
- {
- $cat_arr[$row['cat_id']]['id'] = $row['cat_id'];
- $cat_arr[$row['cat_id']]['name'] = $row['cat_name'];
- $cat_arr[$row['cat_id']]['url'] = build_uri('category', array('cid' => $row['cat_id']), $row['cat_name']);
- if ($row['child_id'] != NULL)
- {
- $cat_arr[$row['cat_id']]['children'][$row['child_id']]['id'] = $row['child_id'];
- $cat_arr[$row['cat_id']]['children'][$row['child_id']]['name'] = $row['child_name'];
- $cat_arr[$row['cat_id']]['children'][$row['child_id']]['url'] = build_uri('category', array('cid' => $row['child_id']), $row['child_name']);
- }
- }
- return $cat_arr;
- }
- }
复制代码 这其实就是一个get_children_tree函数,更具$cat_id来得到当前分类所有的孩子
第二步,修改/category.php,找到122行,原先的代码是:- $smarty->assign('categories', get_categories_tree($cat_id)); // 分类树
复制代码 这其实是模板技术,如果你想彻底抛弃原来的分类样式,那么把get_categories_tree($cat_id)换成刚才我们自定义的函数get_children_tree($cat_id)
如果你想保留原先的分类功能,再新增自定义的分类功能,那么在122行下面再新增一行:- $smarty->assign('categories2', get_children_tree($cat_id));
复制代码
如果想用不同的颜色表示出当前点击的分类和其他分类,那么还要保留当前点击的分类id。再加一行:
- $smarty->assign('current_cat_id', $cat_id); //当前的id
复制代码
最后一步是模板:修改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}-->
复制代码 效果图:
原先的分类树:
新增加的只有当前类别及其子类的(点击其中的“世界名表”):
点击子类:
点击没有分类的:
[ 本帖最后由 xaero 于 2007-7-21 15:06 编辑 ] |
-
2
评分人数
-
|