Yii2 字段过滤器未显示在 GridView 上
Yii2 field filter not showing on GridView
我无法通过任何字段对 GridView 进行筛选,Grid 显示正常,但我的筛选部分显示为空白,这是 GridView 声明:
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute'=>'nombre_sucursal',
'value'=>'sucursal.nombre_sucursal',
'filter' => ArrayHelper::map(Sucursal::find()->asArray()->all(), 'id_sucursal', 'nombre_sucursal'),
'label'=>'Sucursal'
],
[
'attribute'=>'nombre_materia',
'value'=>'materia.nombre_materia',
'label'=>'Materia'
],
'fecha:datetime',
],
'export'=>false
]);?>
这是我的 searchModel 和 dataProvider 的声明:
$searchModel = new CalendarioSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
我的搜索模型是这样的:
class CalendarioSearch extends Model
{
/* your calculated attribute */
public $nombre_sucursal;
public $nombre_materia;
/* setup rules */
public function rules() {
return [
/* your other rules */
[['nombre_sucursal'], 'safe'],
[['nombre_materia'], 'safe']
];
}
public function search($params) {
$query = Calendario::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 20,
],
'sort' => [
'defaultOrder' => ['fecha'=>SORT_DESC],
'attributes' => [
'nombre_sucursal' => [
'asc' => [
'id_sucursal' => SORT_ASC,
'fecha' => SORT_DESC
],
'desc' => [
'id_sucursal' => SORT_DESC,
'fecha' => SORT_DESC
],
],
'nombre_materia' => [
'asc' => [
'id_materia' => SORT_ASC,
'fecha' => SORT_DESC
],
'desc' => [
'id_materia' => SORT_DESC,
'fecha' => SORT_DESC
],
],
'fecha' => [
'asc' => [
'fecha' => SORT_ASC,
],
'desc' => [
'fecha' => SORT_DESC,
],
],
],
]
]);
if (!($this->load($params) && $this->validate())) {
$query->joinWith(['sucursal']);
$query->joinWith(['materia']);
return $dataProvider;
}
$query->joinWith(['sucursal' => function ($q) {
$q->where('c_sucursal.id_sucursal LIKE "%' . $this->nombre_sucursal . '%"');
}]);
$query->joinWith(['materia' => function ($q) {
$q->where('c_materia.id_materia LIKE "%' . $this->nombre_materia . '%"');
}]);
return $dataProvider;
}
}
我关注的文档是this。
确保您在 CalendarioSearch 中声明了正确的规则函数,例如:
public function rules()
{
return [
[['id_materia' ], 'integer'],
[['nombre_sucursal', 'materia' ], 'safe'],
];
}
并确保您在过滤器中使用相同的名称 class ..
在你的过滤器中你使用的是 nombre_sucursal 但在你的 class 中你使用的是 $nombreSucursal;
我无法通过任何字段对 GridView 进行筛选,Grid 显示正常,但我的筛选部分显示为空白,这是 GridView 声明:
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute'=>'nombre_sucursal',
'value'=>'sucursal.nombre_sucursal',
'filter' => ArrayHelper::map(Sucursal::find()->asArray()->all(), 'id_sucursal', 'nombre_sucursal'),
'label'=>'Sucursal'
],
[
'attribute'=>'nombre_materia',
'value'=>'materia.nombre_materia',
'label'=>'Materia'
],
'fecha:datetime',
],
'export'=>false
]);?>
这是我的 searchModel 和 dataProvider 的声明:
$searchModel = new CalendarioSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
我的搜索模型是这样的:
class CalendarioSearch extends Model
{
/* your calculated attribute */
public $nombre_sucursal;
public $nombre_materia;
/* setup rules */
public function rules() {
return [
/* your other rules */
[['nombre_sucursal'], 'safe'],
[['nombre_materia'], 'safe']
];
}
public function search($params) {
$query = Calendario::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 20,
],
'sort' => [
'defaultOrder' => ['fecha'=>SORT_DESC],
'attributes' => [
'nombre_sucursal' => [
'asc' => [
'id_sucursal' => SORT_ASC,
'fecha' => SORT_DESC
],
'desc' => [
'id_sucursal' => SORT_DESC,
'fecha' => SORT_DESC
],
],
'nombre_materia' => [
'asc' => [
'id_materia' => SORT_ASC,
'fecha' => SORT_DESC
],
'desc' => [
'id_materia' => SORT_DESC,
'fecha' => SORT_DESC
],
],
'fecha' => [
'asc' => [
'fecha' => SORT_ASC,
],
'desc' => [
'fecha' => SORT_DESC,
],
],
],
]
]);
if (!($this->load($params) && $this->validate())) {
$query->joinWith(['sucursal']);
$query->joinWith(['materia']);
return $dataProvider;
}
$query->joinWith(['sucursal' => function ($q) {
$q->where('c_sucursal.id_sucursal LIKE "%' . $this->nombre_sucursal . '%"');
}]);
$query->joinWith(['materia' => function ($q) {
$q->where('c_materia.id_materia LIKE "%' . $this->nombre_materia . '%"');
}]);
return $dataProvider;
}
}
我关注的文档是this。
确保您在 CalendarioSearch 中声明了正确的规则函数,例如:
public function rules()
{
return [
[['id_materia' ], 'integer'],
[['nombre_sucursal', 'materia' ], 'safe'],
];
}
并确保您在过滤器中使用相同的名称 class ..
在你的过滤器中你使用的是 nombre_sucursal 但在你的 class 中你使用的是 $nombreSucursal;