一级分类pid默认为0
依次绑定pid
效果:
1.控制器中调用模型中的getOption方法
control:$this->assign('cate_option',cate::getOption($rows['pid']));
model:
/**
* @param int $id 选中的ID
* @return string
*/
public static function getOption($id = 0)
{
$rows = self::where("status=1")->order("sort asc")->select();
$top = ['id'=>0,'name'=>'顶级分类','pid'=>''];
$mer = merge(array_to_object($top),$rows);
return make_option_tree_for_select($mer);
}
2.将顶级分类转化成对象
if(!function_exists('array_to_object')){
function array_to_object($arr) {
if (gettype($arr) != 'array') {
return;
}
foreach ($arr as $k => $v) {
if (gettype($v) == 'array' || getType($v) == 'object') {
$arr[$k] = (object)array_to_object($v);
}
}
return (object)$arr;
}
}
}
3.将顶级分类与数据库的分类合并
if(!function_exists('merge')){
function merge($first=[],$origin=[]){
$cateList[0]=$first;
foreach($origin as $key=>$value){
array_push($cateList,$value);
}
return $cateList;
}
}
4.创建select树状结构
/**
* @param $arr
* @param int $depth,当$depth为0的时候表示不限制深度
* @return string
*/
function make_option_tree_for_select($arr, $depth=0)
{
$arr = make_tree_with_namepre($arr);
if (!function_exists('make_options1')) {
function make_options1($arr, $depth, $recursion_count=0, $ancestor_ids='') {
$recursion_count++;
$str = '';
foreach ($arr as $v) {
$str .= "<option value='{$v->id}' data-depth='{$recursion_count}' data-ancestor_ids='".ltrim($ancestor_ids,',')."'>{$v->name}</option>";
if ($v->pid == 0) {
$recursion_count = 1;
}
if ($depth==0 || $recursion_count<$depth) {
$str .= make_options1($v->children, $depth, $recursion_count, $ancestor_ids.','.$v->id);
}
}
return $str;
}
}
return make_options1($arr, $depth);
}
function make_tree_with_namepre($arr)
{
$arr = make_tree($arr);
if (!function_exists('add_namepre1')) {
function add_namepre1($arr, $prestr='') {
$new_arr = array();
foreach ($arr as $v) {
if ($prestr) {
if ($v == end($arr)) {
$v->name = $prestr.'└─ '.$v->name;
} else {
$v->name = $prestr.'├─ '.$v->name;
}
}
if ($prestr == '') {
$prestr_for_children = ' ';
} else {
if ($v == end($arr)) {
$prestr_for_children = $prestr.' ';
} else {
$prestr_for_children = $prestr.'│ ';
}
}
$v->children = add_namepre1($v->children, $prestr_for_children);
$new_arr[] = $v;
}
return $new_arr;
}
}
return add_namepre1($arr);
}
if(!function_exists('make_tree')){
function make_tree($arr, $parent_id=0){
$new_arr = array();
foreach($arr as $k=>$v){
if($v->pid == $parent_id){
$new_arr[] = $v;
unset($arr[$k]);
}
}
foreach($new_arr as &$a){
$a->children = make_tree($arr, $a->id);
}
return $new_arr;
}
}
当分类较多时可以使用
http://element-cn.eleme.io/#/zh-CN/component/cascader