Yii2 Pjax Удалить не работает

Я пытаюсь сделать Ajax GridView, используя Pjax с кнопкой удаления. Удаление идет без Ajax. Я новичок в Yii2, поэтому любая помощь будет оценена. Спасибо.

index.php

<?php Pjax::begin(['id' => 'countries']) ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn'],

'id',
'title',['class' => 'yii\grid\ActionColumn',
'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',
]);
},
]
],
],
]); ?>
<?php Pjax::end() ?>

контроллер

public function actionDelete($id)
{
$model = new Category();
$this->findModel($id)->delete();
$dataProvider = new ActiveDataProvider([
'query' => Category::find(),
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
'model' => $model,
]);
}

Это открытая функция actionIndex () в контроллер

public function actionIndex()
{
$model = new Category();

$dataProvider = new ActiveDataProvider([
'query' => Category::find(),
]);

if ($model->load(Yii::$app->request->post()) && $model->save())
{
$model = new Category();
}
return $this->render('index', [
'dataProvider' => $dataProvider,
'model' => $model,
]);
}

6

Решение

data-method а также data-confirm не позволяйте вам создавать ajax-запрос через pjax, вы должны реализовать свой собственный диалог подтверждения и удалить фильтр команд POST, или вы можете реализовать свой собственный плагин ajax с диалогом подтверждения и указанием http-метода.

Кроме того, я думаю, должен быть способ расширить плагин pjax диалогом подтверждения, но Yii2 не предоставляет этого по умолчанию.

3

Другие решения

<?php Pjax::begin(['id' => 'model-grid']);
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
//...
[
'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' => 'Delete',
'data-pjax' => '#model-grid',
]);
},
],
],
],
]);
Pjax::end(); ?>

В контроллере

public function actionDelete($id)
{
$this->findModel($id)->delete();
$searchModel = new ModelSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
3

Пожалуйста, попробуйте изменить actionDelete ()

public function actionDelete($id)
{
$this->findModel($id)->delete();
return \yii\web\Response::redirect(['index'] , 302 , false);
// return $this->redirect(['index']);
}

потому что Controller-> redirect () не может отключить ajaxCheck, вам нужно использовать Response для этого.

Я создал ту же проблему в https://github.com/yiisoft/yii2/issues/11058.

2

прежде всего удалите «data-verify» и «data-method» => «post». Пьякс не собирается работать.
Если вы хотите реализовать поле подтверждения с кнопкой действия, вот что я бы сделал в моем файле index.php вида …

<?php  Pjax::begin(['id' => 'pjax-container']);
echo GridView::widget([
'test' => function ($url, $dataProvider) {
return Html::a('Test',
['/site/test'],
['title'=>'Test',
'onclick' => "if (confirm('ok?')) {
$.ajax('/site/test', {
type: 'POST'
}).done(function(data) {
$.pjax.reload({container: '#pjax-container'});
});
}
return false;
",
]);
},
])
Pjax::end();
?>

и в моем контроллере

public function actionTest()
{

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

Таким образом, вы получите подтверждение и т. Д. При желании вы можете использовать стороннее подтверждение начальной загрузки и т. Д., И оно будет работать нормально.

2

Можно использовать так:

ввиду:

'delete' => function ($url, $model, $key) {
$options = [
'title' => Yii::t('common', 'delete'),
'aria-label' => Yii::t('common', 'delete'),
'data-pjax' => 'w0',//id
'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'),
'data-method' => 'post',
'class' => 'btn btn-xs btn-danger'
];
return Html:: a('<i class="fa fa-fw fa-trash"></i>', [
'delete',
'id' => $model -> id
], $options);
}

в контроллере:

$this -> findModel($id) -> delete ();
$searchModel = new AdminSearch();
//get the referer url
$url = Yii::$app -> request -> referrer;
$arr = parse_url($url, PHP_URL_QUERY);
parse_str($arr, $output);//get the $_GET array
$dataProvider = $searchModel -> search($output);
return $this -> render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
1

Первое добавление Pjax::end(); в конце сетки
затем укажите:

    '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' => '0' потому что это отключает ссылку pjax.

Для более подробной информации проверьте это ссылка на сайт

Ваш контроллер должен быть:

public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
0

Не установлен data-method а также data-confirm так как Pjax не поддерживается это.

После удаления оба все еще не рабочие, да из-за кода ниже, ваш контроллер не позволяет Pjax получить запрос.

return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'], // **remove this**
],
],
];

Вам нужно использовать Pjax Post Method
Примените это в вашем Pjax

'clientOptions' => ['method' => 'POST']
0
По вопросам рекламы [email protected]