ecshop重写get_categories_tree函数,
ecshop在分类超过500的时候,因递归里查询数据库,造成数据连接超时,故重写
/** * 获得指定分类同级的所有分类以及该分类下的子分类 * * @access public * @param integer $cat_id 分类编号 * @return array * @author Abner On by 2018-02-28 * 因原来使用递归查询分类数据,造成的mysql链接过多,故使用此方式 */ function get_categories_tree( $cat_id = 0 ) { if ( 0 < $cat_id ) { $sql = "SELECT parent_id FROM {$GLOBALS['ecs']->table('category')} WHERE cat_id='{$cat_id}' "; $parent_id = $GLOBALS['db']->getOne( $sql ); } else { $parent_id = 0; } $sql = "SELECT cat_id as id,cat_name as name, parent_id,is_show FROM {$GLOBALS['ecs']->table('category')} WHERE is_show = 1 ORDER BY sort_order ASC, cat_id ASC"; $data = $GLOBALS['db']->getAll( $sql ); $tree = get_child_tree($data, $parent_id); return $tree; } /** * 将标准二维数组换成树与v1.0类似 * @param array $list 待转换的数据集 * @param array $parent_id 父级id号 * @param string $pk 唯一标识字段 * @param string $pid 父级标识字段 * @param string $child 子集标识字段 * return array * @author Abner On by 2018-02-28 * 因原来使用递归查询分类数据,造成的mysql链接过多,故使用此方式 */ function get_child_tree( $list, $parent_id=0, $pk='id', $pid='parent_id', $child='cat_id' ) { // 创建Tree $tree = array(); if(is_array($list)) { // 创建基于主键的数组引用 $refer = array(); foreach ($list as $key => $data) { $refer[$data[$pk]] =& $list[$key]; } foreach ($list as $key => $data) { // 判断是否存在parent $parentId = $data[$pid]; if ($parent_id == $parentId) { $list[$key]['url'] = build_uri( "category", array("cid" => $list[$key]['id']), $list[$key]['name'] ); $tree[] =&$list[$key]; } else { if (isset($refer[$parentId])) { $parent =&$refer[$parentId]; $list[$key]['url'] = build_uri( "category", array("cid" => $list[$key]['id']), $list[$key]['name'] ); $parent[$child][] =&$list[$key]; } } } } return $tree; }