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;
}

浙公网安备 33010602011771号