Как обработать ошибку от контроллера, используя PJAX в YII2?

#javascript #php #yii2 #pjax

#javascript #php #yii2 #pjax

Вопрос:

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

Код PJAX

  <?php Pjax::begin([
            'id' => 'createBucketPjax',
            'timeout' => 4000,
            'formSelector' => '#createBucketForm',
            'enablePushState' => false,
            'clientOptions' => [
                'skipOuterContainers' => true,
                'error' => new JsExpression("function(event) { 
                    alert('Anything');
                }"),
            ]
        ]); ?>
 

Код КОНТРОЛЛЕРА:

    if(!$fieldModel->save()){
                        $transaction->rollBack();
                        //Here I want to send error 
                        $error = $fieldModel->getErrorsString();
                        return [
                           'success' => false,'error' => $error
                               ];
                       
                    }else{
 return $this->renderAjax('create', [
                            'model' => $model
                        ]);
}
 

Я пробовал приведенные ниже варианты клиентов, но не работает

 'error' => new JsExpression("function(event) { 
                    alert('Please work');
                }"),
 

Также использовался javascript, но никакой помощи :-

  $(document).on('pjax:error', function(event) {
        console.log(event);
      })
 

Есть ли какой-либо способ, с помощью которого я могу отправить 404 с контроллера в yii2? Это действительно может решить мою проблему

Комментарии:

1. Ваш запрос на самом деле является ответом HTTP 200, поэтому ошибка не вызвана pjax:error

2. это то, чего я хочу достичь, даже если я создаю исключение, а HTTP отправляет 200 @ustmaestro

3. Как писал @Dexen, pjax работает с полной заменой содержимого, а не с ответами json

Ответ №1:

Из документов Yii2 Pjax.

В ответ на запрос AJAX, Pjax отправит клиенту обновленное содержимое тела (на основе запроса AJAX), которое заменит старое содержимое на новое. Затем URL-адрес браузера будет обновлен с помощью pushState. Весь процесс не требует перезагрузки макета или ресурсов (js, css)

Вы должны иметь дело с полным содержимым формы, а не с json.

Итак, ваш код должен выглядеть следующим образом (всегда возвращайте форму html обратно):

 if(!$model->save()){
   $transaction->rollBack();
}

return $this->renderAjax('create', [
   'model' => $model
]);
 

Комментарии:

1. Спасибо за разъяснение @Dexen действительно ценю.

2. На самом деле, когда я открываю модальный с помощью PJAX, то при возникновении любой ошибки он выводит HTML за пределы модального.