CGridView 的 CButtonColumn 提供三種內建按鈕,透過 updateButtonUrl、deleteButtonUrl、buttons 陣列可完全客製化連結、確認對話框、顯示條件。本文以實戰範例詳細解析各項配置技巧。
widget('zii.widgets.grid.CGridView', array(
'id' => 'mem-sub-grid',
'dataProvider' => $model,
'columns' => array(
'zpc_catname',
array(
'name' => 'inputtime',
'value' => 'date("Y-m-d H:i", $data->inputtime)',
'htmlOptions' => array('class' => 't_c'),
),
array(
'class' => 'CButtonColumn',
// 1. 更新按鈕自訂 URL
'updateButtonUrl' => 'Yii::app()->controller->createUrl("updateRole", array("id" => $data->primaryKey))',
// 2. 刪除確認對話框訊息
'deleteConfirmation' => '確定要刪除此筆資料嗎?',
// 3. 按鈕陣列深度客製化
'buttons' => array(
// 隱藏檢視按鈕
'view' => array('visible' => 'false'),
// 刪除按鈕自訂 URL
'delete' => array(
'url' => 'Yii::app()->controller->createUrl("deleteRole", array("id" => $data->primaryKey))',
// 可加入 'click' => 'function(){...}' 自訂 JS 確認邏輯
),
// 新增自訂按鈕範例
'assign' => array(
'label' => '指派權限',
'url' => 'Yii::app()->controller->createUrl("assignRole", array("id" => $data->primaryKey))',
'imageUrl' => Yii::app()->request->baseUrl . '/images/assign.png',
'options' => array('class' => 'btn-assign', 'target' => '_blank'),
'visible' => '$data->status == 1', // 僅啟用狀態顯示
),
),
),
),
)); ?>
eval() 執行,可用 $data 存取當前行模型、$row 行號。Yii::app()->controller->createUrl() 產生路由,自動處理 URL 管理規則。confirm() 參數。false 並自行在 buttons.delete.click 實作。'buttons' => array(
'buttonID' => array(
'label' => '按鈕文字', // 預設為 buttonID
'url' => 'JS 表達式回傳 URL', // 必填
'imageUrl' => '圖片路徑', // 可選,優先於 label
'options' => array( // HTML 屬性
'class' => 'btn-custom',
'target' => '_blank',
'title' => '提示文字',
),
'click' => 'JS 函數字串', // 覆蓋預設行為
'visible' => 'PHP 表達式', // true/false 或可評估字串
),
)
'delete' => array(
'url' => 'Yii::app()->controller->createUrl("ajaxDelete", array("id" => $data->primaryKey))',
'click' => 'function(e) {
e.preventDefault();
if (!confirm("確定刪除?")) return;
var $btn = $(this);
$.post($btn.attr("href"), function(res) {
if (res.success) {
$.fn.yiiGridView.update("mem-sub-grid");
} else {
alert(res.message);
}
}, "json");
}',
'visible' => '$data->deletable === true',
),
| 現象 | 原因 | 解決 |
|---|---|---|
| 按鈕 URL 為空或錯誤 | 字串中單雙引號未正確跳脫 | 外層用單引號,內層用雙引號;或使用 heredoc |
| deleteConfirmation 不彈出 | jQuery 未載入或版本衝突 | 檢查頁面是否載入 jquery.yii.js |
| 自訂按鈕不顯示 | visible 表達式語法錯誤 | 確保 $data 可用,字串中變數需正確引用 |
| updateButtonUrl 導向 404 | 路由規則不匹配 | 檢查 urlManager rules 與 controller/action 名稱 |
掌握 CButtonColumn 的三大客製化槓桿(updateButtonUrl、deleteConfirmation、buttons),能讓你在不寫自訂 Column 類別的情況下,滿足 90% 以上的按鈕交互需求。建議將常用按鈕模板封裝為 Helper 方法,專案間複用。