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

Yii CGridView 單欄位禁用排序設定技巧:sortable 屬性實戰應用

     編輯:PHP 綜合知識

快速設定

在欄位配置陣列中加入 `'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, // 因為是經過轉換的顯示值,無法直接資料庫排序
        ],
    ],
]);
?>

原理說明

  • `sortable => true` (預設):欄位標題變為超連結,點擊帶入 `sort=欄位名` 參數重新查詢
  • `sortable => false`:欄位標題保持純文字,不產生排序連結
  • 底層邏輯:`CGridColumn::renderHeaderCellContent()` 根據此屬性決定輸出連結或純文字

進階:動態控制排序權限

<?php
[
    'name' => 'sensitive_column',
    'sortable' => Yii::app()->user->checkAccess('admin.sortSensitive'), // 權限控制
    'visible' => Yii::app()->user->checkAccess('admin.viewSensitive'),
]
?>

相關屬性速查

屬性預設值說明
sortabletrue是否啟用排序
filternull過濾輸入框 (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',
    ],
]);
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved