ecshop 当前分类及其子类的HACK
发布:smiling 来源: PHP粉丝网 添加日期:2014-07-21 14:46:16 浏览: 评论:0
应该说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'";
- //$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}--》
Tags: ecshop当前分类 子类HACK
- 上一篇:在ecshop商品列表页显示商品货号SN的方法
- 下一篇:ECSHOP调用分类文章
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)