TP5數據庫四個字段實現無限分類

數據表設計:
CREATE TABLE NewTable (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
pid int(10) UNSIGNED ZEROFILL NOT NULL ,
name varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
path varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
PRIMARY KEY (id)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=53
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

前端頁面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>四個字段的無限分類</h1>
<form action="{:url('add')}" method="post">
請選擇上級分類:<select name="pid">
<option value="0">頂級分類</option>
{foreach $cates as $vo}
<option value={$vo.id}>|{$vo.pre}{$vo.name}</option>

        {/foreach}

    </select><br/>

    請填寫分類的名稱:<input type="text" name="name"/></br>
    <input type="submit" value="添加">
</form>

</body>
</html>
控制器
<?php
namespace app\index\controller;
use think\Db;
use think\Controller;
use app\model\Category;

class Index extends Controller
{
public function index()
{
//添加分類的界面
//查詢所有的分類
$db=Db::name('categroy');
$data=$db->order('concat(path,"-",id)')->select();
#order('concat(path,"-",id)')自動排序
foreach ($data as &$cate) {
$prefix='';
$i=count(explode("-", $cate['path']));
for($n=0;$n<=$i;$n++){
$prefix.="--";
}
$cate['pre']=$prefix;
}
$this->assign('cates',$data);
return $this->fetch();
}
public function add(){
$db=Db::name('categroy');
if($_POST['pid']==0){
$_POST['path']=0;

    }else{
        $_POST['path']=$db->where('id='.$_POST['pid'])->value('path')."-".$_POST['pid'];   
    }
        $name=$_POST['name'];
    if($db->insert($_POST)){
        $this->success('添加成功');
    }else{
        $this->error('添加失敗');
    }
   #原理:4個字段
   /*
   ID   PID   NAME   PATH
   1    0     服裝    0-1
   2    0     遊戲    0-2
   3    1     男裝    0-1-3
   4    3     上衣    0-1-3-4
    */
}}

無線遞歸分類
public function user(){
$db=Db::name('categroy1');
// $data=$db->getTree();
$opt=$db->getOption($data);
$this->assign('opt',$opt);
$this->assign('cates',$data);
return $this->fetch();
}
public function doAdd(){
//執行添加數據
$db=Db::name('categroy1');
if($db->insert()){
$this->success('添加成功',url('index'));
}else{
$this->error('添加失敗',url('index'));
}
return $this->fetch();
}

    模型
    <?php

class CategoryModel extends Model{

#通過上級分類的主鍵id號查詢子類
public function getTree($pid=0){
    $data=$this->where('pid='.$pid)->select();
    foreach($data as &$cate){
        #通過該分類的主鍵id查詢該分類的子類
        $cate['cates']=$this->getTree($cate['id']);
    }
    return $data;
}

#拼裝屬性結構
#通過一個數組組裝option
public function getOption($data){
    static $i=0;
    for($n=0;$n<=$i*2;$n++){
        $prefix.="-";
    }
    foreach ($data as $cate) {
        $opt.="<option value='".$cate['id']."'>".$prefix.$cate['name']."</option>";
        #判斷該分類下是否包含子類,如果有子類,將數組傳入接着拼裝
        if(!empty($case['cates'])){
            $i++;
            $opt.=$this->getOption($case['cases']);
        }else{
            $i=0;
        }
        return $opt;
    }
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章