在欄位配置陣列中加入 `'sortable' => false` 即可禁用該欄排序:
<?php
$this->widget('zii.widgets.grid.CGridView', [
'dataProvider' => $dataProvider,
'columns' => [
// 複選框列通常不需排序
[
'class' => 'CCheckBoxColumn',
'selectableRows' => 2,
'value' => '$data->id',
],
// 標題欄:允許排序 (預設)
[
'header' => '標題',
'name' => 'title',
// 'sortable' => true, // 預設即為 true
],
// 操作欄:禁用排序
[
'class' => 'CButtonColumn',
'sortable' => false, // 關鍵設定
],
// 自訂欄位:禁用排序
[
'name' => 'status',
'value' => 'Status::getLabel($data->status)',
'sortable' => false, // 因為是經過轉換的顯示值,無法直接資料庫排序
],
],
]);
?>
<?php
[
'name' => 'sensitive_column',
'sortable' => Yii::app()->user->checkAccess('admin.sortSensitive'), // 權限控制
'visible' => Yii::app()->user->checkAccess('admin.viewSensitive'),
]
?>
| 屬性 | 預設值 | 說明 |
|---|---|---|
| sortable | true | 是否啟用排序 |
| filter | null | 過濾輸入框 (true=文字框, 陣列=下拉選單, false=無) |
| htmlOptions | [] | 儲存格 <td> 屬性 |
| headerHtmlOptions | [] | 表頭 <th> 屬性 |
| footerHtmlOptions | [] | 表尾 <td> 屬性 |
❌ 以為設定 `sortable => false` 就能阻止用戶手動修改 URL 參數排序
✅ 這只是 UI 層面隱藏排序連結,資料提供者 (`CActiveDataProvider`) 仍會處理 `sort` 參數。真正禁用需在 `CSort` 設定 `attributes` 白名單。
<?php
// 徹底禁用特定欄位排序 (在 Controller/DataProvider 設定)
$dataProvider = new CActiveDataProvider('Post', [
'sort' => [
'attributes' => [
'title', 'create_time', 'author_id', // 只允許這些欄位排序
// 'status' 故意省略 → 無法排序
],
'defaultOrder' => 'create_time DESC',
],
]);
?>