我想向网格中的下拉过滤器添加一个聚合选项(示例中的“所有选项”),该选项涵盖所有其他选项,如下所示:
All options
Option1
Option2
Option3
...
我已经尝试过这种方法:
网格:
'filter' => ['All options', yii\helpers\ArrayHelper::map(app\models\RelatedModel::find()->all(), 'id', 'name'),]
型号搜索:
if ($this->RelatedModelId == 'All options') {
$query->andFilterWhere(['in', 'RelatedModelId', \yii\helpers\ArrayHelper::getColumn(RelatedModel::find()->all(), 'id')]);
} else {
$query->andFilterWhere(['RelatedModelId' => $this->RelatedModelId ,]);
};
它有效(也许不是世界上最美丽的解决方案,但目前对我来说还可以)。唯一让我不安的是下拉列表中的
0
(有时是 1,取决于我如何更改代码):
All options
0
Option1
Option2
Option3
...
我知道这是因为过滤器中的括号
[]
('filter' => [...]
),但目前这是我实现所需功能的唯一方法。我不知道如何让它在没有括号的情况下工作。有没有一种简单的方法(在某个地方添加一个额外的小选项)不显示这个0
,或者我必须做完全不同的事情?看起来像这样并不是什么大问题,但最好不要看到它。或者我可以把这个 All
放入 map
函数中吗?
'filter' => yii\helpers\ArrayHelper::map(array_merge(['All options', app\models\RelatedModel::find()->all()]), 'id', 'name'),
我也尝试过
array_merge()
但没有成功。
有什么想法吗?预先感谢!
这个:
'filter' => \yii\helpers\ArrayHelper::map(\app\models\RelatedModel::find()->all(), 'id', 'name'),
将已经呈现空选项(没有文本),用于重置此下拉列表中的选择。
对于搜索只需设置:
$this->andWhere(['your_field_id' => $this->your_field_id]);
在您的搜索模型中,您就可以开始了。
另外,不要忘记在
rules
部分中添加此属性作为安全属性:
public function rules()
{
return [
['your_field_id', 'safe'],
],
}
您可以在 CRUD 生成器中查看示例。
如果要自定义显示的文本,请将
prompt
选项附加到现有 yii\grid\DataColum $filterInputOptions:
'filterInputOptions' => ['class' => 'form-control', 'id' => null, 'prompt' => 'All'],
同时考虑到这一点,你就违反了 MVC 原则:
\yii\helpers\ArrayHelper::map(\app\models\RelatedModel::find()->all(), 'id', 'name'),
在控制器中调用它并作为参数传递以查看或包装在某些
getList()
方法中。