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

person игорь88    schedule 03.04.2015    source источник
comment
Вы указали Pjax::end(); В приведенном выше коде он отсутствует после gridview.   -  person Chinmay Waghmare    schedule 04.04.2015
comment
Мое решение работает как шарм.... я лично использовал в своем проекте   -  person shivani parmar    schedule 19.05.2016


Ответы (7)


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

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

person xskif    schedule 15.05.2015

<?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,
    ]);
}
person Булат Камалов    schedule 10.11.2016

Пожалуйста, попробуйте изменить 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< /а>.

person Pigo Chu    schedule 10.03.2016
comment
+1 также за запрос функции на GitHub! Этот метод также хорошо работает с data-confirm и data-method=post. - person Gianpaolo Scrigna; 12.04.2018

прежде всего удалите «подтверждение данных» и «метод данных» => «сообщение». pjax не будет работать. Если вы хотите реализовать окно подтверждения с кнопкой действия, вот что я бы сделал в моем представлении в файле 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']);
    }
}

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

person Vikalp Veer    schedule 18.08.2016

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

с учетом:

'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,
]);
person vishun    schedule 04.07.2017

Сначала добавьте 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']);
}
person Chinmay Waghmare    schedule 04.04.2015
comment
Обновлено. Измените код контроллера и проверьте. - person Chinmay Waghmare; 04.04.2015
comment
проверил, но все равно, думаю из-за этого return $this-›redirect(['index']); в контроллере - person игорь88; 04.04.2015
comment
У меня та же проблема, удаление отправляет обычный запрос, а не запрос AJAX. - person Michael Nguyen; 25.06.2015
comment
data-confirm в настоящее время отключает запрос pjax, см. эту проблему github.com/yiisoft/yii2/issues/8582 - person BHoft; 15.07.2015
comment
так что вы не можете удалить в gridview с помощью pjax, если вы используете подтверждение данных? - person Bloodhound; 16.01.2016

Не устанавливайте data-method и data-confirm, потому что Pjax это не поддерживает.

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

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

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

'clientOptions' => ['method' => 'POST']
person shivani parmar    schedule 19.05.2016