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

Yii 後台批量操作實作:核取方塊全選、單刪/批刪/狀態切換完整流程

     編輯:PHP 綜合知識

列表頁批量操作的標準化實作模式

本文展示後台管理常見的「列表 + 核取方塊 + 下拉選單操作」模式,涵蓋單筆刪除、批量刪除、批量顯示/隱藏(狀態切換),並採用父類別封裝通用 _delete()、_verify() 方法,減少控制器重複程式碼。

View 關鍵程式碼

列表資料列核取方塊

<td>
  <input type="checkbox" name="id[]" value="<?php echo $row->id ?>">
  <?php echo $row->id ?>
</td>

批量操作工具列

<div class="fixsel">
  <input type="checkbox" name="chkall" id="chkall" onclick="checkAll(this.form, 'id')" />
  <label for="chkall">全選</label>
  <select name="command">
    <option>選擇操作</option>
    <option value="adDelete">刪除</option>
    <option value="adVerify">顯示</option>
    <option value="adUnVerify">隱藏</option>
  </select>
  <input id="submit_maskall" class="button confirmSubmit" type="submit" value="提交" name="maskall" />
</div>

單筆刪除連結(GET)

<a href="<?php echo $this->createUrl('batch', ['command'=>'adDelete', 'id'=>$row->id]) ?>"
   class="confirmSubmit">刪除</a>

Controller 批量處理 Action

public function actionBatch() {
  // 區分 GET(單筆) / POST(批量)
  if (XUtils::method() === 'GET') {
    $command = trim($_GET['command']);
    $ids     = intval($_GET['id']);
  } elseif (XUtils::method() === 'POST') {
    $command = trim($_POST['command']);
    $ids     = $_POST['id'];
    is_array($ids) && $ids = implode(',', $ids); // 陣列轉逗號字串
  } else {
    XUtils::message('errorBack', '只支援 POST,GET 資料');
  }

  empty($ids) && XUtils::message('error', '未選擇記錄');

  switch ($command) {
    case 'adDelete':
      parent::_acl('ad_delete');
      parent::_adminiLogger(['catalog'=>'delete', 'intro'=>"刪除廣告,ID:$ids"]);
      parent::_delete(new Ad(), $ids, ['ad'], ['attach_file']);
      break;

    case 'adVerify':
      parent::_acl('ad_verify');
      parent::_adminiLogger(['catalog'=>'delete', 'intro'=>"廣告狀態變更為顯示,ID:$ids"]);
      parent::_verify(new Ad(), 'verify', $ids, ['ad']);
      break;

    case 'adUnVerify':
      parent::_acl('ad_verify');
      parent::_adminiLogger(['catalog'=>'delete', 'intro'=>"廣告狀態變更為隱藏,ID:$ids"]);
      parent::_verify(new Ad(), 'unVerify', $ids, ['ad']);
      break;

    default:
      throw new CHttpException(404, '錯誤的操作類型:' . $command);
  }
}

父類別通用方法

_delete():批量刪除 + 附件清理 + 快取刷新

protected function _delete($model = null, $id = '', $redirect = 'index', $attach = null, $pkField = 'id') {
  if ($attach) {
    // 刪除關聯檔案(如圖片)
    $data = $model->findAll($pkField . ' IN(:id)', [':id' => $id]);
    foreach ((array)$data as $row) {
      foreach ((array)$attach as $field) {
        if (!empty($row[$field])) @unlink($row[$field]);
      }
    }
  }
  $model->deleteAll(['condition' => 'id IN(' . $id . ')']);
  self::_refreshCache($model);
  $this->redirect($redirect);
}

_verify():批量狀態切換

protected function _verify($model = null, $type = 'verify', $id = '', $redirect = 'index', $cdField = 'status_is', $pkField = 'id') {
  $criteria = new CDbCriteria();
  $criteria->condition = $pkField . ' IN(' . $id . ')';
  $showStatus = $type === 'verify' ? 'Y' : 'N';
  $model->updateAll([$cdField => $showStatus], $criteria);
  self::_refreshCache($model);
  $this->redirect($redirect);
}

安全與最佳實踐提醒

  • SQL 注入防護:$id 經 intval() 或 implode() 後直接拼入 SQL,建議改用 CDbCriteria::addInCondition() 或參數綁定。
  • CSRF 驗證:批量操作表單務必包含 YII_CSRF_TOKEN。
  • 權限細分:_acl('ad_delete')、_acl('ad_verify') 分開控制刪除與狀態變更權限。
  • 操作日誌:_adminiLogger() 記錄操作人、時間、影響 ID,利於追蹤。
  • 前端確認:class="confirmSubmit" 搭配 JS confirm('確定執行?') 防止誤觸。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved