您的位置:首頁>正文

thinkphp實現無限級分類

普通的方法(採用for和foreach) //顯示 foreach($data as $k=>$v){ //str_repeat函數用於把字串重複指定的次數 $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title']; }

無限級分類的設計思路:

為了能夠使得欄目的管理更加動態化, 在這裡可以設置添加欄目, 添加的資料庫中設計一個名為pid的欄位, 便於新添加的欄目可以找到他的父欄目。 如果是頂級的欄目, 則pid為0。 再提取資料顯示的時候, 後臺資料庫中設置有type欄位, 用於標識該欄目的等級, 在資料顯示的時候用str_repeat函數在前面加上‘-----’, 來區分他們的等級。

這個時候的排序顯得非常的重要, 並且此方法沒辦法很好的把父級和子級聯繫在一起, 不建議使用

排序

添加的時候為了更加方便的直觀的顯示哪個欄目下有什麼子欄目, 可以選擇在裡面設置一個sorts排序欄位, 用於排序。 在前端, 為了能夠方便排序。 需要表單提交全部的排序的內容。 前端的話只需要在表單input的name屬性裡加入一個陣列名稱

然後後臺進行接受, 同樣用for和foreach進行迴圈操作和遍歷

//把新的獲得的排序的資訊儲存到資料庫中 $arr=$_POST; for($i=0;$ifind($arr['id'][$i]); $sort['sorts']=$arr['sorts'][$i]; $model->save($sort); } //然後根據新的排序資訊進行排序 $data=$model->order('sorts')->select; foreach($data as $k=>$v){ $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title']; }用遞迴的方法實現無限級分類public function getCate($field='*'){ //用field查詢固定欄位的資料, 若是沒有輸入實參, 則預設查詢全部 //獲取到資料庫中相關欄目的資料 $data=$this->field($field)->order('sorts asc')->select; //調用遞迴函數 return $this->getTree($data);}//根據父級欄目的id去查詢子欄目的資訊//遞迴函數, 傳入全部的欄目資訊, 用pid來標識欄目所對應的父級的欄目id,level來表示欄目的等級public function getTree($data,$pid=0,$level=0){ //此處應該定義static 如果沒有用static,
則無法輸出全部的欄目資訊 static $tree=array; foreach($data as $key=>$v){ if($v['pid']==$pid){ $v['level']=$level; //str_repeat函數用於把字串重複指定的次數, 用於區別欄目的等級 $v['title']=str_repeat('----',$level).$v['title']; $tree=$v; $this->getTree($data,$v['id'],$level+1); } }}

在用遞迴函數進行無限級分類的時候建議寫在model函數裡, 這樣在控制器中只需要調用模型中的方法即可。 再模型中要想調用資料庫的查詢操作, 不用加表明, 只需要在模型中使用$this即可。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示