前段時間發表了一個刪除欄目的隨筆,當時實現的功能是刪除一條信息,這次來實現一下批量刪除欄目。
我們需要達到的是這樣一個效果:
選中批量刪除按鈕后可以選中所有該頁面的欄目,這個是前端頁面的實現,在這里就不多說了,我們直接進入正題:批量刪除的功能。
1.前端頁面這里也有一個小小的點,就是選擇框的name值應給給他賦值為一個id的數組,value值為該欄目的id。
2.我們在控制器中單獨寫一個批量刪除的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public function privilege_bdel(){ $ids = I( 'ids' ); $pri = D( 'privilege' ); $ids = implode( ',' , $ids ); if ( $ids ){ if ( $pri -> delete ( $ids )){ $this ->success( '批量刪除欄目成功!' ,U( 'Privilege/privilege_lst' )); } else { $this ->error( '批量刪除欄目失敗,請重試!' ); } } else { $this ->error( '未選中任何內容,請重試!' ); } } |
這里要將傳過來的id數組轉化為以逗號分隔的字符串如:1,2,3,這樣可以直接進行delete操作。
這就是我們dump出來options的結果,這條也是我們用來判斷刪除時是單個刪除還是批量刪除的依據,如果options[where][id]是一個數組的話,則說明進行的是批量刪除,否則就是單個刪除。
3.在模型中對刪除前構造函數的修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public function _before_delete( $options ){ //批量刪除 if ( is_array ( $options [ 'where' ][ 'id' ])){ $arr = explode ( ',' , $options [ 'where' ][ 'id' ][1]); $sonpri = array (); foreach ( $arr as $k => $v ) { $sonpri2 = $this ->childid( $v ); $sonpri = array_merge ( $sonpri , $sonpri2 ); } $sonpri = array_unique ( $sonpri ); $chilrenids = implode( ',' , $sonpri ); } else { //單個刪除 $chilrenids = $this ->childid( $options [ 'where' ][ 'id' ]); $chilrenids = implode( ',' , $chilrenids ); } if ( $chilrenids ){ $this ->execute( "delete from ed_privilege where id in($chilrenids)" ); } } |
在這里我們寫出批量刪除的代碼(單個刪除之前已經寫過,不再提)
將傳過來的字符串轉化為不帶逗號的數組形式存在$arr中,建立一個空數組$sonpri,然后foreach遍歷,這里先查找出所有的子欄目id(會用childid函數),存入$sonpri2數組中 ,再將$sonpri和$sonpri2合并為一個數組,使用array_merge()函數完成,這樣我們才算是獲取到了所有子欄目的id,但是我們所獲取的id組中,會出現許多重復的id,所以這里我們還要進行去重的操作,使用array_unique()函數。最后再進行一次數組的拆分,得到id字符串,再進行刪除就大功告成了。
以上這篇ThinkPHP刪除欄目(實現批量刪除欄目)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。