Ajax удаление GridView

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
elementfani
Сообщения: 24
Зарегистрирован: 2012.07.18, 15:10

Ajax удаление GridView

Сообщение elementfani »

Вьюха

Код: Выделить всё

<?php Pjax::begin(); ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            [
                'attribute' => 'id',
                'headerOptions' => [
                    'width' => 70,
                ],
            ],
            [
                'attribute' => 'name',
                'filter' => false,
            ],
            [
                'class' => 'yii\grid\ActionColumn',
                'template' => '{update} {delete}',
                'contentOptions' => ['class' => 'action-column'],
            ],
        ],
    ]); ?>

<?php Pjax::end(); ?>
Контроллер

Код: Выделить всё

class DefaultController extends BaseAdminController
{
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post'],
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        $searchModel = new ModelSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['index']);
    }

    protected function findModel($id)
    {
        if (($model = Model::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
} 
Когда нажимаю на кнопку удаления в таблице - страница перегружается.
Как сделать AJAX удаление, как было по умолчанию в Yii1 ?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Ajax удаление GridView

Сообщение futbolim »

У Вас actionDelete принимает только POST.
Где у кнопки data-method?
Короче, попробуйте

Код: Выделить всё

'contentOptions' => ['class' => 'action-column', 'data-method' => 'post'],
 
elementfani
Сообщения: 24
Зарегистрирован: 2012.07.18, 15:10

Re: Ajax удаление GridView

Сообщение elementfani »

futbolim писал(а):У Вас actionDelete принимает только POST.
Где у кнопки data-method?
По умолчанию ActionColumn добавляет data-method="post"

Код: Выделить всё

<a href="/model/default/delete?id=8" title="Delete" data-confirm="Are you sure you want to delete this item?" data-method="post" data-pjax="0"><span class="glyphicon glyphicon-trash"></span></a> 
Сейчас заметил, что data-pjax="0". Изменил на data-pjax="1", но результат тот же, страница все равно перегружается.

Код: Выделить всё

[
    'class' => 'yii\grid\ActionColumn',
    'template' => '{update} {delete}',
    'contentOptions' => ['class' => 'action-column'],
    'buttons' => [
        'delete' => function ($url, $model, $key) {
            return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [
                'title' => Yii::t('yii', 'Delete'),
                'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'),
                'data-method' => 'post',
                'data-pjax' => '1',
            ]);
        },
    ],
],
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ajax удаление GridView

Сообщение ElisDN »

Это из-за редиректа в actionDelete.
elementfani
Сообщения: 24
Зарегистрирован: 2012.07.18, 15:10

Re: Ajax удаление GridView

Сообщение elementfani »

ElisDN писал(а):Это из-за редиректа в actionDelete.
Этого оказалось мало.

Разобрал по строкам jquery.pjax.js и выяснил, что actionDelete должен возвращать новую таблицу.
С data-confirm ссылка вообще не работает, поэтому убрал.

В итоге получилось:

Код: Выделить всё

<?php Pjax::begin(['id' => 'model-grid', 'enablePushState' => false]); ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            [
                'attribute' => 'id',
                'headerOptions' => [
                    'width' => 70,
                ],
            ],
            [
                'attribute' => 'name',
                'filter' => false,
            ],
            [
                'class' => 'yii\grid\ActionColumn',
                'template' => '{update} {delete}',
                'contentOptions' => ['class' => 'action-column'],
                'buttons' => [
                    'delete' => function ($url, $model, $key) {
                        return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [
                            'title' => Yii::t('yii', 'Delete'),
                            'data-pjax' => '#model-grid',
                        ]);
                    },
                ],
            ],
        ],
    ]); ?>

<?php Pjax::end(); ?>
Контроллер

Код: Выделить всё

public function actionIndex()
{
    return $this->renderList();
}


public function actionDelete($id)
{
    $this->findModel($id)->delete();

    if (Yii::$app->request->isAjax)
        return $this->renderList();
    else
        return $this->redirect(['index']);
}


protected function renderList()
{
    $searchModel = new ModelSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    $dataProvider->sort->route = Url::toRoute(['index']);

    $method = Yii::$app->request->isAjax ? 'renderAjax' : 'render';

    return $this->$method('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}
trollldemiurg
Сообщения: 9
Зарегистрирован: 2017.06.20, 13:56

Re: Ajax удаление GridView

Сообщение trollldemiurg »

Тоже замахался. Вот так работает:

Код: Выделить всё

'buttons' => [
                            'delete' => function ($url, $model, $key) {
                                    return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [
                                        'title' => Yii::t('yii', 'Delete'),
                                        'data-pjax' => '#model-grid',
                                    ]);
                                },
                            ],
С подтверждением - нет. На пагинации тоже самое. Если бутстрап третий , то работает. На четвертом удаление и пагинация не работают. Причем не именно пагинация, а "показать все" и "постраничный" вид не переключается.
Ответить