Yii2 网格过滤器下拉列表附加选项 arrayHelper

问题描述 投票:0回答:1

我想向网格中的下拉过滤器添加一个聚合选项(示例中的“所有选项”),该选项涵盖所有其他选项,如下所示:

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()
但没有成功。

有什么想法吗?预先感谢!

php arrays filter drop-down-menu yii2
1个回答
2
投票

这个:

'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()
方法中。

© www.soinside.com 2019 - 2024. All rights reserved.