ThinkPHP刪除欄目(單)

  當咱們作一些網站項目的時候,都會遇到這樣一類問題,刪除一個欄目,而這個欄目又不是最底層欄目,也就是說,被刪除的欄目擁有子欄目,這時,咱們執行刪除該欄目的命令,就須要將該欄目及其子欄目一併刪除,由於咱們不可能讓一個類的上級欄目被刪除後,子欄目還顯示或存在數據庫中,這時候,欄目刪除的問題就來了。數據庫

先上圖:數組

  這是一個簡單的權限管理的頁面,圖中管理員權限爲頂級權限,欄目管理爲管理員權限的子權限,欄目添加又爲欄目管理的子權限,這樣一個三級分類,咱們想要達到的效果爲:刪除管理員權限,其下欄目管理、欄目添加權限全被同時刪除;刪除欄目管理權限,則欄目添加也同時被刪除;刪除欄目添加權限則只刪除其自己。函數

 

接下來實現方法:網站

1.是控制器中簡單刪除方法:this

1     public function privilege_del(){
2         $pri = D('privilege');
3         $id = I('id');
4         if($pri->delete($id)){
5             $this->success('刪除權限成功!',U('Privilege/privilege_lst'));
6         }else{
7             $this->error('刪除權限失敗!');
8         }
9     }

 

2.咱們思考,咱們想要的同時刪除的結果,實際上是當咱們選擇上級欄目刪除時,代碼首先幫咱們刪除該欄目類別的最底層的子欄目,而後依次向上刪除,最終刪除咱們選擇的上級欄目,因此咱們須要寫一個前置的構造函數進行操做 _before_delete($options) 這是ThinkPHP提供給咱們的函數,他的用法是在咱們執行刪除方法前,執行這個函數,其中$options爲咱們要刪除的信息,具體爲一個二維數組,當咱們把$options dump出來時,結果爲:                                                                                                                                                                                                                                                                                     spa

  也就是說,若是咱們想要取到這條信息的id值,只須要獲取$options['where']['id']便可,可是注意,若是數組中的where一樣是一個數組的時候,這就意味着咱們進行的是批量刪除,這也是單個刪除和批量刪除的區別所在,關於批量刪除,以後我會再寫一篇來簡單介紹,此次咱們只寫單個刪除。code

  首先,寫一個獲取全部數據的方法childid,這裏的$priid就是咱們傳進去的所要刪除的那一欄的idblog

1 public function childid($priid){
2         $data = $this->select();
3         return $this->getchildid($data,$priid);
4     }

  而後根據全部數據查找咱們要刪除的欄目的下面的子欄目的id,再次建立一個方法 getchildid獲取全部須要刪除的id遞歸

 1 public function getchildid($data,$parentid){
 2         static $ret=array();
 3         foreach ($data as $k => $v) {
 4             if($v['parentid']==$parentid){
 5                 $ret[]=$v['id'];
 6                 $this->getchildid($data,$v['id']);
 7             }
 8         }
 9         return $ret;
10     }

這裏又用到了遞歸,在全部數據中查詢完下級欄目後,查詢下級欄目的下級欄目,最後將該欄目的全部子欄目的id版存到ret數組中,返回。get

最後在構造函數中調用

1      public function _before_delete($options){
2         //單個刪除
3         $chilrenids =$this->childid($options['where']['id']);
4         $chilrenids = implode(',', $chilrenids);    
5         if($chilrenids){
6             $this->execute("delete from ed_privilege where id in($chilrenids)");
7         }
8     }

將獲取的id號用逗號隔開,由於此時不能再使用delete方法去刪除數據,若使用則將再次調用構造函數成爲死循環,因此咱們須要在這裏執行SQL語句進行數據刪除。

以上就是單個欄目刪除的所有內容。

相關文章
相關標籤/搜索