首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii2 GridView 批次刪除完整實作:CheckboxColumn + AJAX 非同步處理

     編輯:PHP 相關知識

Yii2 GridView 批次刪除完整實作:CheckboxColumn + AJAX 非同步處理

GridView 批次刪除是後台管理常見需求。核心步驟:(1) GridView 設定 id 與 CheckboxColumn,(2) 頁面放置批次刪除按鈕,(3) JavaScript 取得勾選的主鍵陣列,(4) AJAX 送至後端處理,(5) 完成後 PJAX 重新載入列表。本文提供最精簡可用的完整程式碼。

View 完整程式碼

 'grid-pjax']);
echo GridView::widget([
    'id' => 'grid', // 關鍵:JS 取得選取列需用此 id
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\CheckboxColumn', 'name' => 'id'], // name 對應主鍵欄位
        'id',
        'title',
        ['attribute' => 'status', 'filter' => [0 => '停用', 1 => '啟用']],
        ['class' => 'yii\grid\ActionColumn'],
    ],
]);

// 批次刪除按鈕
echo Html::button('批次刪除', ['class' => 'btn btn-danger btn-batch-delete', 'id' => 'btn-batch-delete']);
Pjax::end();

// 註冊 JS
$this->registerJs(<<

Controller 處理批次刪除

response->format = \yii\web\Response::FORMAT_JSON;
    $ids = \Yii::$app->request->post('ids', []);
    if (!is_array($ids) || !$ids) {
        return ['success' => false, 'message' => '無效的 ID 列表'];
    }

    // 建議:使用交易確保原子性
    $transaction = \Yii::$app->db->beginTransaction();
    try {
        $deleted = Article::deleteAll(['id' => $ids]);
        $transaction->commit();
        return ['success' => true, 'deleted' => $deleted];
    } catch (\Exception $e) {
        $transaction->rollBack();
        \Yii::error($e->getMessage());
        return ['success' => false, 'message' => '伺服器錯誤'];
    }
}
?>

進階:軟刪除 (邏輯刪除)

若使用 yii\behaviors\SoftDeleteBehavior 或自訂 is_delete 欄位:

is_delete = 1;
    return $this->save(false, ['is_delete', 'updated_at']);
}

// Controller
Article::updateAll(['is_delete' => 1, 'updated_at' => time()], ['id' => $ids]);
?>

常見坑點排查

問題原因解決
getSelectedRows() 回傳空陣列GridView id 未設定或與 JS 選取器不符GridView 設定 'id' => 'grid',JS 用 $('#grid')
PJAX 重整後按鈕事件失效JS 事件綁定在舊 DOM使用事件代理 $(document).on('click', '#btn-batch-delete', ...) 或放在 PJAX 容器內重新註冊
CSRF 驗證失敗AJAX 未攜帶 CSRF tokenYii2 預設 $.post 會自動帶入 _csrf,確認 meta tag 存在
刪除大量資料超時單次交易過大分批處理、或使用隊列異步刪除

安全性提醒

  • 後端務必驗證權限(RBAC/ACF),防止越權刪除。
  • 記錄操作日誌:誰、何時、刪除哪些 ID。
  • 考慮加入「回收站」機制,支援還原。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved