Yii2 Kartik Gridview + Select2过滤器

时间:2018-11-30 04:47:19

标签: gridview yii2

我有一个Yii2应用程序,并且在我的一个索引视图(使用gii cli工具生成的默认crud的修改版本)中,我已经用Kartik替换了GridView小部件,同样设置一列以使用filterType中的GridView::FILTER_SELECT2

我的问题是,将数组传递给不带filterType的列时,我得到一个选择菜单,其中有一个空白选项可“清除”搜索过滤器:

[
    'attribute' => 'scale_id',
    'label' => 'Scale',
    'value' => function($model) {
        return empty($model->scale) ? null : $model->scale->name;
    },
    'filter' => ArrayHelper::map(Scale::find()->asArray()->all(), 'id', 'name'),
],

但是,通过将过滤器更改为Kartik的select2,则不会出现空选项,并且不会出现相同的行为:

[
    'attribute' => 'scale_id',
    'label' => 'Scale',
    'value' => function($model) {
        return empty($model->scale) ? null : $model->scale->name;
    },
    'filter' => ArrayHelper::map(Scale::find()->asArray()->all(), 'id', 'name'),
    'filterType' => GridView::FILTER_SELECT2,
],

我如何使用Kartik的select2过滤器实现相同的“除非更改,否则为空白”选择过滤器?

更新: 将promptallowClear结合使用可重新创建类似的功能,但仍不理想。初始显示如下: Initial View 但是,一旦选择了选项,关闭的x就不适合右边并覆盖文本,也没有提供下拉菜单中具有空白/空值的原始行为: Options Selected

这是我的GridView

代码
<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [

        'id',
        'description',
        'sku_number',
        [
            'attribute' => 'owner_id',
            'label' => 'Owner',
            'value' => function($model) {
                return $model->owner->name;
            },
            'filter' => ArrayHelper::map(Owner::find()->asArray()->all(), 'id', 'name'),
            'filterType' => GridView::FILTER_SELECT2,
            'filterWidgetOptions' => [
                'options' => ['prompt' => ''],
                'pluginOptions' => ['allowClear' => true],
            ],
        ],
        [
            'attribute' => 'product_id',
            'label' => 'Product',
            'value' => function($model) {
                return $model->product->name;
            },
            'filter' => ArrayHelper::map(Product::find()->asArray()->all(), 'id', 'name'),
            'filterType' => GridView::FILTER_SELECT2,
            'filterWidgetOptions' => [
                'options' => ['prompt' => ''],
                'pluginOptions' => ['allowClear' => true],
            ],
        ],
        [
            'attribute' => 'manufacturer_id',
            'label' => 'Manufacturer',
            'value' => function($model) {
                return $model->manufacturer->name;
            },
            'filter' => ArrayHelper::map(Manufacturer::find()->asArray()->all(), 'id', 'name'),
            'filterType' => GridView::FILTER_SELECT2,
            'filterWidgetOptions' => [
                'options' => ['prompt' => ''],
                'pluginOptions' => ['allowClear' => true],
            ],
        ],
        [
            'attribute' => 'scale_id',
            'label' => 'Scale',
            'value' => function($model) {
                return empty($model->scale) ? null : $model->scale->name;
            },
            'filter' => ArrayHelper::map(Scale::find()->asArray()->all(), 'id', 'name'),
            'filterType' => GridView::FILTER_SELECT2,
            'filterWidgetOptions' => [
                'options' => ['prompt' => ''],
                'pluginOptions' => ['allowClear' => true],
            ],
        ],

        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

2 个答案:

答案 0 :(得分:1)

将数据列更改为

suspend fun

请我们[ 'attribute' => 'scale_id', 'label' => 'Scale', 'value' => function($model) { return empty($model->scale) ? null : $model->scale->name; }, 'filter' => ArrayHelper::map(Scale::find()->asArray()->all(), 'id', 'name'), 'filterType' => GridView::FILTER_SELECT2, 'filterWidgetOptions' => [ 'options' => ['prompt' => ''] ] ], DataColumn

答案 1 :(得分:1)

您需要将"allowClear"=>true的{​​{1}}下的pluginOptions选项与Select2一起使用。

要调整列的大小,请尝试为"prompt"=>''使用filterInputOptions,并使用id调整其宽度,因为它们占用的空间超过了所需的空间,并且挤压了select2。

manufacturer_id

更新

确保[ 'attribute' => 'id', 'filterInputOptions' => ['class' => 'form-control', 'style' => 'width:50px'], ], [ 'attribute' => 'manufacturer_id', 'filterInputOptions' => ['class' => 'form-control', 'style' => 'width:50px'], ], [ 'attribute' => 'scale_id', 'filter' => ArrayHelper::map(Scale::find()->asArray()->all(), 'id', 'name'), 'filterType' => GridView::FILTER_SELECT2, 'filterWidgetOptions' => [ 'options' => ['prompt' => ''], 'pluginOptions' => [ 'allowClear' => true, 'width'=>'resolve' ], ], ], 的默认宽度更好。将GridView::FILTER_SELECT2设置为默认值即可解决。我已经为pluginOptions['width']参见here

更新了上面的代码

更新2

显然,它不能与scale_id一起使用,因为它会使select2宽度变得疯狂,并且您可能需要像resolve那样手动设置它