我想在网格中的下拉过滤器中添加聚合选项(示例中的“所有选项”),其中包含所有其他选项,并且看起来像这样:
All options
Option1
Option2
Option3
...
我试过这种方式:
格:
'filter' => ['All options', yii\helpers\ArrayHelper::map(app\models\RelatedModel::find()->all(), 'id', 'name'),]
ModelSearch:
if ($this->RelatedModelId == 'All options') {
$query->andFilterWhere(['in', 'RelatedModelId', \yii\helpers\ArrayHelper::getColumn(RelatedModel::find()->all(), 'id')]);
} else {
$query->andFilterWhere(['RelatedModelId' => $this->RelatedModelId ,]);
};
它有效(也许不是世界上最美丽的解决方案,但目前对我来说没问题)。唯一让我感到不安的是这个0
(或者有时候,根据我如何更改代码的方式):下拉列表:
All options
0
Option1
Option2
Option3
...
我知道这是因为过滤器([]
)中的括号'filter' => [...]
,但目前这是我能够实现所需功能的唯一方法。我不知道如何让它在括号中工作。是否有一种简单的方法(可以添加一个额外的小选项somwhow,某些地方可能)不显示这个0
或者我是否必须完全不同?看起来这不是一个很大的问题,但最好不要看到它。或者我可以将此All
放入map
函数吗?
'filter' => yii\helpers\ArrayHelper::map(array_merge(['All options', app\models\RelatedModel::find()->all()]), 'id', 'name'),
我也试过array_merge()
但没有成功。
有什么想法吗?提前谢谢!
答案 0 :(得分:1)
此:
'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()
方法。