//获取树结构数据
//生成数据
public function tree($type = 1){
/*function _function_private_remove_arr_key($data){
foreach($data as &$v){
if(isset($v['child'])){
$v['child'] = _function_private_remove_arr_key(array_values($v['child']));
}
}
unset($v);
return $data;
}*/
$data = array('parent' => array());
$list = $this->_getlist('categorys', '*', "type=$type", "length(path)-length(replace(path,',','')) asc,length(path) asc,orderby asc,id asc");
foreach($list as $v){
if(!$v['pid']){
$v['path'] = $v['id'];
$v['thumb'] = concaturl($v['thumb']);
$data['parent'][$v['id']] = $v;
}else{
$paths = explode(',', $v['path']);
$data_var = '$data[\'parent\']['.$paths[0].'][\'child\']';
for($i = 1; $i < count($paths); $i ++){
$data_var .= '['.$paths[$i].'][\'child\']';
}
$v['path'] .= ','.$v['id'];
$v['thumb'] = concaturl($v['thumb']);
$data_var .= '['.$v['id'].']=$v;';
eval($data_var);
}
}
//$data['parent'] = _function_private_remove_arr_key(array_values($data['parent']));
return $data;
}
//path路径维护函数
//删除或独立调整下线层级树
public function fixpath($ids, $type = 1){
if(!is_array($ids))$ids = explode(',', $ids);
foreach($ids as $k => $v){
if(empty($v))continue;
$childs = $this->_getlist('categorys', 'id,path', "type=".$type." and FIND_IN_SET('".$v."', path)>0");
if(!empty($childs)){
foreach($childs as $vv){
if($vv['id'] == $v)continue;//排除自己
$path = trim(str_replace(','.$v.',', '', ','.$vv['path'].','), ',');
$paths = explode(',', $path);
$toppid = intval(current($paths));
$pid = intval(end($paths));
$this->db->update('categorys', array('pid' => $pid, 'toppid' => $toppid, 'path' => $path), "id=".$vv['id']);
}
}
}
}
//删除所有下级
public function delpath($ids, $type = 1){
if(!is_array($ids))$ids = explode(',', $ids);
foreach($ids as $k => $v){
if(empty($v))continue;
$this->db->delete('categorys', "type=".$type." and FIND_IN_SET('".$v."', path)>0");
}
}
//调整上级时调整所有下级树
public function fixchild($ids, $type = 1){
if(!is_array($ids))$ids = explode(',', $ids);
foreach($ids as $k => $v){
if(empty($v))continue;
$childs = $this->_getcols('categorys', 'id,path', "type=".$type." and (id=".$v." or FIND_IN_SET('".$v."', path)>0)");
if(!empty($childs)){
$myrow = $childs[$v];
foreach($childs as $vv){
if($vv['id'] == $v)continue;//排除自己
$path = trim(preg_replace('/.*?(,'.$v.',.*?)/', $myrow['path'].'$1', ','.$vv['path'].','), ',');
$paths = explode(',', $path);
$toppid = intval(current($paths));
$pid = intval(end($paths));
$this->db->update('categorys', array('pid' => $pid, 'toppid' => $toppid, 'path' => $path), "id=".$vv['id']);
}
}
}
}
//添加/修改获取层级数据
public function newpath($id, $pid, $type = 1){
$data = array();
$data['pid'] = $pid;
$data['toppid'] = $pid;
$data['path'] = $pid ? $pid : '';
if($pid){
$parent = $this->_getrow('categorys', 'id,toppid,path', $id ? "id<>$id and toppid<>$id and pid<>$id and FIND_IN_SET($id, path)=0 and id=$pid" : "id=$pid");
if($parent){
$data['toppid'] = $parent['toppid'] ? : $parent['id'];
$data['path'] = trim($parent['path'].','.$pid, ',');
}else{
$data['pid'] = 0;
$data['toppid'] = 0;
$data['path'] = '';
}
}
return $data;
}
//获取path标题
public function pathstr($id, $separator = ',', $all = true){
$row = $this->db->get_row($this->table, '*', $this->keyField."=".$id);
$str = '';
if(!$row['path']){
$str = $all ? '<b>'.$row[$this->showField].'</b>' : '';
}else{
$str = $this->db->get_field($this->table, "group_concat(".$this->showField." order by field(".$this->keyField.",".$row['path'].") asc Separator '".$separator."')", "FIND_IN_SET(".$this->keyField.", '".$row['path']."')>0");
if($all)$str .= $separator.'<b>'.$row[$this->showField].'</b>';
}
return $str;
}