yii2 Ошибка проверки ajax в виджете, yii \ web \ Response - PullRequest
1 голос
/ 20 марта 2019

Я получаю сообщение об ошибке от yii \ web \ Response при использовании проверки ajax.

Объект класса yii \ web \ Response не может быть преобразован в строку

виджет:

    public function run()
{
    $model = new Participants();
    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
    if ($model->load(Yii::$app->request->post())) {
        $list = implode( ", ",$model->sections);
        $model->sections = $list;
        $model->save();
        Yii::$app->session->setFlash(Alert::TYPE_SUCCESS, [
            [
                'title' => 'Congratulations!',
                'text' => 'You are registered on the forum. Check out your email to get news about forum.',
                'confirmButtonText' => 'Done!',
            ]
        ]);
        return Yii::$app->controller->redirect(Yii::$app->request->referrer ?: Yii::$app->homeUrl);
    }

    return $this->render('header', [
        'model' => $model,
    ]);

}

вид виджета:

<?php $form = ActiveForm::begin();?>
...
<?= $form->field($model, 'email', ['enableAjaxValidation' => true])->textInput(['placeholder' => 'Email']); ?>

как я могу решить эту ошибку?PS yii версия - 2.0.17-dev

Ответы [ 2 ]

1 голос
/ 21 марта 2019

\yii\base\Widget::run() должен возвращать строку (все виджеты в основном)

Все, что вы должны сделать в методе run(), это вывод или рендеринг контента, и вы пытаетесь вернуть объект Response в виде return ActiveForm::validate($model); и return Yii::$app->controller->redirect(..)

я предлагаю вам переместить весь код, который должен обрабатывать отправку формы, в собственное действие

SiteController extends controller {


    public function actionRegisterParticipant {
        $model = new Participants();
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ActiveForm::validate($model);
        }
        if ($model->load(Yii::$app->request->post())) {
            $list = implode(", ", $model->sections);
            $model->sections = $list;
            $model->save();
            Yii::$app->session->setFlash(Alert::TYPE_SUCCESS, [
                [
                    'title'             => 'Congratulations!',
                    'text'              => 'You are registered on the forum. Check out your email to get news about forum.',
                    'confirmButtonText' => 'Done!',
                ]
            ]);
            return Yii::$app->controller->redirect(Yii::$app->request->referrer ?: Yii::$app->homeUrl);
        }
    // ...
}

и форма в представлении виджета всегда должна указывать на это действие:

<?php $form = ActiveForm::begin(['action' => 'site/register-participant']);?>
...
<?= $form->field($model, 'email', ['enableAjaxValidation' => true])->textInput(['placeholder' => 'Email']); ?>
0 голосов
/ 21 марта 2019

Виджет должен возвращать строку в результате, но return Yii::$app->controller->redirect() возвращает Response объект с настроенным перенаправлением.Если вы хотите перенаправить внутри виджета, вы должны использовать что-то вроде этого:

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
    Yii::$app->controller->asJson(ActiveForm::validate($model));
    Yii::$app->end();
}

// ...

Yii::$app->session->setFlash(/* ... */);
Yii::$app->controller->redirect(Yii::$app->request->referrer ?: Yii::$app->homeUrl);
Yii::$app->end();

Но это пахнет как плохой дизайн - виджет не должен отвечать за управление потоком приложения.Лучше обрабатывать пользовательский ввод в обычном действии / контроллере.

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