ecshop 当前分类及其子类的HACK
应该说Ecshop的分类做得还是比较好的,考虑到了大部分人的应用,能把所有的分类列表都显示出来,但还是有一些漏洞,有些网友也已经发现了.
当我们点击有子分类的某个分类时,Ecshop将没必要显示的分类也一起读出来了,相当于你想查你爸爸所有的孩子、孙子时,它把你爸爸所有的兄弟姐妹都一起显示出来了,这对一部分用户来说确实没必要.
我的修改只是在原有功能上添加一些功能,所以不影响原有的功能,而且也结合了模板技术,应该说定制起来还比较方便的,与大家分享:
第一步:修改/include/lib_goods.php,在第24行加入以下代码:
- function get_children_tree($cat_id)
- {
- if ($cat_id >0 )
- {
- $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('category') . " WHERE parent_id = '$cat_id'";
-
- 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}--》