Строка GridView как ссылка, кроме элементов столбца действия в Yii2

когда я использую приведенный ниже код, он переопределяет ссылки удаления/обновления столбца действий.

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

поскольку у меня много столбцов, было бы хорошо указать url-адрес ссылки в одном месте вместо использования кода ниже в каждом столбце:

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

Итак, есть ли лучший способ дать ссылку для всей строки в GridView, кроме столбца действий?

изменить: Полный GridView В

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}',
        ],
    ],
]);

6 ответов


вы можете попробовать это. Это сделает всю строку кликабельной, пока пользователь нажимает на элемент td, который не покрывается другим элементом. Поэтому также столбце "действие" является частью кликабельные строки, однако, не технологии 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;
    });

");

Смотрите также документацию для событие.цель:

целевым свойством может быть элемент, зарегистрированный для события или его потомок. Часто бывает полезно сравнить событие.цель это порядок определения, обрабатывается ли событие из-за события пузырящийся. Это свойство очень полезно при делегировании событий, когда события бурлят.


Я рекомендую использовать ниже javascript, чтобы предотвратить запуск событий в Столбцах фильтра.

<?php
$this->registerJs("
    $('td').click(function (e) {
        var id = $(this).closest('tr').data('id');
        if (e.target == this && id)
            location.href = '" . Url::to(['thread/view']) . "?id=' + id;
    });
");

или

<?php
$this->registerJs("
    $('tbody td').css('cursor', 'pointer');
    $('tbody td').click(function (e) {
        var id = $(this).closest('tr').data('id');
        if (e.target == this)
            location.href = '" . Url::to(['thread/view']) . "?id=' + id;
    });
");

[
    'attribute'=>'website',
    'format' => 'raw',
    'value'=>function ($data) {
    $wsite = Agents::find()
             ->all();
    return Html::a(Html::encode($wsite[0]->website), $wsite[0]->website);
     },
    'label'=>'Website',
    'vAlign'=>'middle',
    'width'=>'150px',             
],

пользователей 'filterPosition'=>' ',

<?=
                    GridView::widget([
                        'dataProvider' => $dataProvider,
                        'filterModel' => $searchModel,
                        'resizableColumns' => true,
                        'containerOptions' => ['style' => 'overflow: auto'], // only set when $responsive = false
                        'headerRowOptions' => ['class' => 'kartik-sheet-style'],
                        'filterRowOptions' => ['class' => 'kartik-sheet-style'],
                        'pjax' => true,
                        'hover' => true,
                        'export' => false,
                        'columns' => $gridColumns,
                        'filterPosition'=>' ',
                    ]);
                    ?>

 GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $filterModel,
        'rowOptions' => function ($m, $key, $index, $grid) {
            return ['data-href' => 'book-vgift/girl-vgift?to=' . $m->user_id];
        },
        'columns' => [
            [

файл JavaScript

$('table tr[data-href]').click(function () {

    if ($(this).data('href') !== undefined) {
        window.location.href = $(this).data('href');
    }

});

ничего не работало для меня из этих решений, кроме:

echo GridView::widget([
   ...
   'rowOptions' => function ($model, $key, $index, $grid) {
        return [
            'style' => "cursor: pointer",
            'myurl' => ['/route','id'=>$model->id],
        ];
    }
    ...

и часть Javascript:

$this->registerJs("
    $('tbody tr[myurl]').click(function (e) {
        if ($(e.target).is('td')) {
            window.location.href = $(this).attr('myurl');
        } 
    });
");

не теперь, почему другие решения не работают, но, возможно, это решение помогает кому-то, прежде чем тратить время на часы - как в моем случае : - (