GridView 內建的欄位篩選預設為文字輸入框,若欄位值為固定枚舉(如狀態、類別),改為下拉選單能大幅提升使用體驗並減少輸入錯誤。本文示範在 Model 封裝選項、GridView 設定 filter 與 value、SearchModel 加入查詢條件的完整流程。
['0' => '否', '1' => '是'],
'is_delete' => ['0' => '顯示', '1' => '刪除'],
'status' => ['0' => '草稿', '1' => '發布', '2' => '下架'],
];
if ($value !== null) {
return $list[$column][$value] ?? '';
}
return $list[$column] ?? [];
}
}
?>
$dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'is_hot',
'value' => fn($model) => Article::dropdown('is_hot', $model->is_hot),
'filter' => Article::dropdown('is_hot'),
],
[
'attribute' => 'is_delete',
'value' => fn($model) => Article::dropdown('is_delete', $model->is_delete),
'filter' => Article::dropdown('is_delete'),
],
// 更多欄位...
],
]);
?>
$query, 'pagination' => ['pageSize' => 20]]);
$this->load($params);
if (!$this->validate()) return $dataProvider;
// 文字模糊搜尋
$query->andFilterWhere(['like', 'title', $this->title]);
// 枚舉精確搜尋
$query->andFilterWhere(['is_hot' => $this->is_hot]);
$query->andFilterWhere(['is_delete' => $this->is_delete]);
return $dataProvider;
}
}
?>
若選項需由資料庫維護(如分類表),可改用 ArrayHelper::map():
asArray()->all(), 'id', 'name');
}
// GridView
['attribute' => 'cate_id', 'filter' => Article::categoryDropdown(), 'value' => 'cate.name'],
?>
| 現象 | 可能原因 | 解決方式 |
|---|---|---|
| 下拉選單不顯示 | filter 回傳非陣列 | 確認 dropdown() 回傳格式為 ['value' => 'label'] |
| 搜尋無效果 | SearchModel 未載入參數 | 檢查 $this->load($params) 並驗證規則 |
| PJAX 重整後選單消失 | JS 事件未重新綁定 | 使用 Pjax::end() 並確保 GridView 在 PJAX 容器內 |