GridView 行作为链接,Yii2 中的操作列项除外

2021-12-24 00:00:00 php yii2 gridview

当我使用以下代码时,它会覆盖操作列删除/更新链接.

When i use the below code it overrides the action-column delete/update links.

'rowOptions' => function ($model, $key, $index, $grid) {
    return [
        'id'      => $model['id'], 
        'onclick' => 'location.href="' 
            . Yii::$app->urlManager->createUrl('accountinfo/update') 
            .'?id="+(this.id);',
    ];
},

由于我有很多列,最好在一个地方指定链接 url,而不是在每一列中使用以下代码:

As I have many columns it would be good to specify link url in one place instead of using the below code in each column:

 'value' => function ($data) {
                return Html::url('site/index');
            }

那么有没有什么最好的方法可以在 GridView 中为除操作列之外的整行提供链接?

So is there any best way to give link for whole row in GridView except action column?

完整的网格视图

GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel'  => $searchModel,
    'rowOptions'   => function ($model, $index, $widget, $grid) {
        if ($widget == 1)
            return [
                'id' => $model['id'], 
                'onclick' => 'location.href="'
                    . Yii::$app->urlManager->createUrl('accountinfo/update') 
                    . '?id="+(this.id);'
            ];
    },
    'columns'      => [
        ['class' => 'yiigridSerialColumn'],

        // 'id',
        'f_name',
        'l_name',
        'address',
        'country',
        'state',
        'city',
        'pincode',
        [
            'attribute' => 'status',
            'value'     => function ($model, $key, $index, $column) {
                return $model->status == '1' ? 'Enabled' : 'Disabled';
            },
            'filter'    => [1 => 'Enabled', 0 => 'Disabled'],
        ],
        'card',
        'note',
        'balance',
        'is_new',
        [
            'attribute' => 'is_new',
            'value'     => function ($model, $key, $index, $column) {
                return $model->is_new == '1' ? 'Yes' : 'No';
            },
            'filter'    => [1 => 'Yes', 0 => 'No'],
        ],
        [
            'class'    => 'yiigridActionColumn',
            'template' => '{update}  {delete}',
        ],
    ],
]);

推荐答案

你可以试试这个.只要用户单击未被另一个元素覆盖的 td 元素,它就会使整行可点击.因此,操作列也是可点击行的一部分,但不是字形.

You could try this. It will make the whole row clickable as long as the user clicks on a td element that is not covered from another element. So also the action column is part of the clickable row, however, not the glyphicons.

<?= GridView::widget([

    ...

    'rowOptions'   => function ($model, $key, $index, $grid) {
        return ['data-id' => $model->id];
    },

    ...

]); ?>

<?php
$this->registerJs("

    $('td').click(function (e) {
        var id = $(this).closest('tr').data('id');
        if(e.target == this)
            location.href = '" . Url::to(['accountinfo/update']) . "?id=' + id;
    });

");

另请参阅 event.target 的文档:

目标属性可以是为事件注册的元素或它的后代.将 event.target 与这是为了确定事件是否因事件而被处理冒泡.这个属性在事件委托中非常有用,当事件泡沫.

The target property can be the element that registered for the event or a descendant of it. It is often useful to compare event.target to this in order to determine if the event is being handled due to event bubbling. This property is very useful in event delegation, when events bubble.

相关文章