**
* 获得指定商品分类同级的所有分类以及该分类下的子分类
*/
function goods_category_tree($catid = 0,$ifview = '2')
{
$data = read_static_cache('goods_category_tree');
/****************************/
/*获得所有根分类和所有子分类*/
/****************************/
if($catid == 0) {
if($data === false){
$parentid = 0;
$bif_view = ($ifview == '2' || $ifview == '1') ? " AND a.if_view = '$ifview' AND b.if_view = '$ifview'" : "";
$sql = "SELECT a.catid, a.catname, a.color, a.if_view, b.catid AS childid, b.catname AS childname FROM `{$GLOBALS['db_mymps']}goods_category` AS a LEFT JOIN `{$GLOBALS['db_mymps']}goods_category` AS b ON b.parentid = a.catid WHERE a.parentid = '$parentid' {$bif_view} ORDER BY a.catorder ASC , catid ASC, b.catorder ASC";
$res = $GLOBALS['db']->getAll($sql);
$cat_arr = array();
foreach ($res AS $row){
if ($row['if_view']){
$cat_arr[$row['catid']]['catid'] = $row['catid'];
$cat_arr[$row['catid']]['catname'] = $row['catname'];
$cat_arr[$row['catid']]['color'] = $row['color'];
$cat_arr[$row['catid']]['if_view'] = $row['if_view'];
$cat_arr[$row['catid']]['uri'] = Rewrite('goods',array('catid'=>$row['catid']));
if ($row['childid'] != NULL){
$cat_arr[$row['catid']]['children'][$row['childid']]['catid'] = $row['childid'];
$cat_arr[$row['catid']]['children'][$row['childid']]['catname'] = $row['childname'];
$cat_arr[$row['catid']]['children'][$row['childid']]['if_view'] = $row['if_view'];
$cat_arr[$row['catid']]['children'][$row['childid']]['color']= $row['childcolor'];
$cat_arr[$row['catid']]['children'][$row['childid']]['uri']= Rewrite('goods',array('catid'=>$row['childid']));
}
}
}
write_static_cache('goods_category_tree',$cat_arr);
}else{
$cat_arr = $data;
}
}
/****************************/
/*获得一个根分类和所有子分类*/
/****************************/
else {
if($data === NULL || empty($data[$catid])){
$bif_view = ($ifview == '2' || $ifview == '1') ? " AND b.if_view = '$ifview'" : "";
$parentid = $GLOBALS['db']->getOne("SELECT parentid FROM `{$GLOBALS['db_mymps']}goods_category` WHERE catid = '$catid'");
if ($parentid == 0){
/* 获取当前同级分类及其子分类 */
$sql = "SELECT a.catid, a.catname, a.catorder, a.if_view, b.catid AS childid, b.catname AS childname, b.catorder AS childorder FROM `{$GLOBALS['db_mymps']}goods_category` AS a LEFT JOIN `{$GLOBALS['db_mymps']}goods_category` AS b ON b.parentid = a.catid {$bif_view} WHERE a.catid = '$catid' ORDER BY catorder ASC , catid ASC, childorder ASC";
}else{
/* 获取当前分类及其父分类 */
$sql = "SELECT a.catid, a.catname, a.catorder, a.if_view, a.html_dir, a.htmlpath, b.catid AS childid, b.catname AS childname, b.catorder AS childorder FROM `{$GLOBALS['db_mymps']}goods_category` AS a LEFT JOIN `{$GLOBALS['db_mymps']}goods_category` AS b ON b.parentid = a.catid {$bif_view} WHERE b.parentid = '$parentid' ORDER BY catorder ASC , catid ASC, childorder ASC";
}
$res = $GLOBALS['db']->getAll($sql);
$cat_arr = array();
foreach ($res AS $row){
if ($row['if_view']){
$cat_arr[$row['catid']]['catid'] = $row['catid'];
$cat_arr[$row['catid']]['catname'] = $row['catname'];
$cat_arr[$row['catid']]['catorder'] = $row['catorder'];
$cat_arr[$row['catid']]['if_view'] = $row['if_view'];
$cat_arr[$row['catid']]['uri'] = Rewrite('goods',array('catid'=>$row['catid']));
if ($row['childid'] != NULL){
$cat_arr[$row['catid']]['children'][$row['childid']]['catid'] = $row['childid'];
$cat_arr[$row['catid']]['children'][$row['childid']]['catname'] = $row['childname'];
$cat_arr[$row['catid']]['children'][$row['childid']]['if_view'] = $row['if_view'];
$cat_arr[$row['catid']]['children'][$row['childid']]['catorder'] = $row['childorder'];
$cat_arr[$row['catid']]['children'][$row['childid']]['uri']= Rewrite('goods',array('catid'=>$row['childid']));
}
}
}
} else {
$cat_arr[] = $data[$catid];
}
}
return $cat_arr;
}
/**
* 获得指定分类下的子分类的数组
*
* @access public
* @param int $catid 分类的ID
* @param int $selected 当前选中分类的ID
* @param boolean $re_type 返回的类型: 值为真时返回下拉列表,否则返回数组
* @param int $level 限定返回的级数。为0时返回所有级数
* @param int $is_show_all 如果为true显示所有分类,如果为false隐藏不可见分类。
* @return mix
*/
function goods_cat_list($catid = 0, $selected = 0, $re_type = true, $level = 0, $is_show_all = true)
{
global $seoset;
$data = read_static_cache('goods_category_pid_releate');
if ($data === false){
$sql = "SELECT c.catid, c.catname, c.parentid, c.if_view, c.catorder, COUNT(s.catid) AS has_children FROM `{$GLOBALS['db_mymps']}goods_category` AS c LEFT JOIN `{$GLOBALS['db_mymps']}goods_category` AS s ON s.parentid=c.catid GROUP BY c.catid ORDER BY c.parentid, c.catorder ASC";
$res = $GLOBALS['db']->getAll($sql);
$sql = NULL;
$newres = array();
//如果数组过大,不采用静态缓存方式
if (count($res) <= 1000){
write_static_cache('goods_category_pid_releate', $res);
}
} else {
$res = $data;
}
if (empty($res) == true){
return $re_type ? '' : array();
}
$options = goods_cat_options($catid, $res); // 获得指定分类下的子分类的数组
$children_level = 99999; //大于这个分类的将被删除
if ($is_show_all == false){
foreach ($options as $key => $val){
if ($val['level'] > $children_level){
unset($options[$key]);
}else{
if ($val['is_show'] == 0){
unset($options[$key]);
if ($children_level > $val['level']){
$children_level = $val['level']; //标记一下,这样子分类也能删除
}
}else{
$children_level = 99999; //恢复初始值
}
}
}
}
/* 截取到指定的缩减级别 */
if ($level > 0){
if ($catid == 0){
$end_level = $level;
}else{
$first_item = reset($options); // 获取第一个元素
$end_level = $first_item['level'] + $level;
}
/* 保留level小于end_level的部分 */
foreach ($options AS $key => $val){
if ($val['level'] >= $end_level){
unset($options[$key]);
}
}
}
if ($re_type == true){
$select = '';
foreach ($options AS $var){
$select .= '';
}
return $select;
}else{
foreach ($options as $key => $value){
$options[$key]['url'] = $value['catid'];
}
return $options;
}
}
/**
* 过滤和排序所有分类,返回一个带有缩进级别的数组
*
* @access private
* @param int $catid 上级分类ID
* @param array $arr 含有所有分类的数组
* @param int $level 级别
* @return void
*/
function goods_cat_options($spec_catid, $arr)
{
$cat_options = array();
if (isset($cat_options[$spec_cat_id])){
return $cat_options[$spec_cat_id];
}
if (!isset($cat_options[0])){
$level = $last_cat_id = 0;
$options = $cat_id_array = $level_array = array();
$data = read_static_cache('goods_category_option_static');
if ($data === false){
while (!empty($arr)){
foreach ($arr AS $key => $value){
$cat_id = $value['catid'];
if ($level == 0 && $last_cat_id == 0){
if ($value['parentid'] > 0){
break;
}
$options[$cat_id] = $value;
$options[$cat_id]['level'] = $level;
$options[$cat_id]['id'] = $cat_id;
$options[$cat_id]['name'] = $value['catname'];
unset($arr[$key]);
if ($value['has_children'] == 0){
continue;
}
$last_cat_id = $cat_id;
$cat_id_array = array($cat_id);
$level_array[$last_cat_id] = ++$level;
continue;
}
if ($value['parentid'] == $last_cat_id){
$options[$cat_id] = $value;
$options[$cat_id]['level'] = $level;
$options[$cat_id]['id'] = $cat_id;
$options[$cat_id]['name'] = $value['catname'];
unset($arr[$key]);
if ($value['has_children'] > 0){
if (end($cat_id_array) != $last_cat_id){
$cat_id_array[] = $last_cat_id;
}
$last_cat_id = $cat_id;
$cat_id_array[] = $cat_id;
$level_array[$last_cat_id] = ++$level;
}
} elseif ($value['parentid'] > $last_cat_id){
break;
}
}
$count = count($cat_id_array);
if ($count > 1){
$last_cat_id = array_pop($cat_id_array);
}elseif ($count == 1){
if ($last_cat_id != end($cat_id_array)){
$last_cat_id = end($cat_id_array);
}else{
$level = 0;
$last_cat_id = 0;
$cat_id_array = array();
continue;
}
}
if ($last_cat_id && isset($level_array[$last_cat_id])){
$level = $level_array[$last_cat_id];
}else{
$level = 0;
}
}
//如果数组过大,不采用静态缓存方式
if (count($options) <= 2000){
write_static_cache('goods_category_option_static', $options);
}
}else{
$options = $data;
}
$cat_options[0] = $options;
}else{
$options = $cat_options[0];
}
if (!$spec_cat_id){
return $options;
}else{
if (empty($options[$spec_cat_id])){
return array();
}
$spec_cat_id_level = $options[$spec_cat_id]['level'];
foreach ($options AS $key => $value){
if ($key != $spec_cat_id){
unset($options[$key]);
}else{
break;
}
}
$spec_cat_id_array = array();
foreach ($options AS $key => $value){
if (($spec_cat_id_level == $value['level'] && $value['catid'] != $spec_cat_id) ||
($spec_cat_id_level > $value['level'])){
break;
}else{
$spec_cat_id_array[$key] = $value;
}
}
$cat_options[$spec_cat_id] = $spec_cat_id_array;
return $spec_cat_id_array;
}
}
/*
* 获得指定分类的所有上级分类
*/
function goods_parent_cats($cat='')
{
global $seo;
if ($cat == 0) return array();
$data = read_static_cache('goods_category_pid_releate');
if($data === false){
$arr = $GLOBALS['db']->getAll("SELECT catid, catname, parentid FROM `{$GLOBALS['db_mymps']}goods_category`") ;
} else {
$arr = $data;
}
if (empty($arr)) return array();
$index = 0;
$cats = array();
while (1){
foreach ($arr AS $row){
if ($cat == $row['catid']){
$cat = $row['parentid'];
$cats[$index]['catid'] = $row['catid'];
$cats[$index]['catname'] = $row['catname'];
$cats[$index]['uri'] = Rewrite('goods',array('catid'=>$row['catid']));
$index++;
break;
}
}
if ($index == 0 || $cat == 0){
break;
}
}
return $cats;
}
?>