Уникальная ошибка проверки Yii2: преобразование массива в строку

Я следовал точно так же, как указано на Документация Yii2, но я получаю ошибку преобразования массива в строку при проверке AJAX.

Сценарий: Включите проверку AJAX в форме регистрации, включая проверку на стороне сервера, например проверку уникальности электронной почты.

Внесенные изменения

use yii\widgets\ActiveForm;

<?php $form = ActiveForm::begin([
'id' => 'form-signup',
'enableAjaxValidation' => true,
]); ?>

Изменения, сделанные в контроллере

use yii\web\Response;
use yii\widgets\ActiveForm;

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}

** Виджет регистрации **

<?php
namespace frontend\components;

use Yii;
use frontend\models\SignupForm;
use common\models\User;
use yii\base\Widget;
use yii\web\Response;
use yii\widgets\ActiveForm;

/**
* SignUpFormWidget is a widget that provides user signup functionality.
*/
class SignUpFormWidget extends Widget
{
/**
* @var string the widget title. Defaults to 'Register'.
*/
public $title='Register';
/**
* @var boolean whether the widget is visible. Defaults to true.
*/
public $visible = true;

public function run()
{
if($this->visible) {
$model = new SignupForm();

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())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
}

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

ошибка

[error][yii\base\ErrorException:8] exception 'yii\base\ErrorException' with message 'Array to string conversion' \vendor\yiisoft\yii2\base\Widget.php:107

Я пытался использовать json_encode($error), но его страница перезагрузки, я не могу перезагрузить страницу, так как форма регистра находится в заголовке скрытого div. Я создал SignUpFormWidget, который расширяет Widget.

Подскажите пожалуйста, чего мне здесь не хватает?

2

Решение

Ваша ошибка в том, что Widget::run() метод ожидает возврата строки. ActiveFrom::validate() возвращает массив. Как предложено выше @DoubleH, вам нужно переписать свой код как

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {

Yii::$app->response->format = Response::FORMAT_JSON;
return yii\helpers\Json::encode(\yii\widgets\ActiveForm::validate($model));
}
3

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

Обновите код вашего контроллера как

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {

Yii::$app->response->format = Response::FORMAT_JSON;
return yii\helpers\Json::encode(\yii\widgets\ActiveForm::validate($model));
}
3

Вы используете это Yii::$app->response->format = Response::FORMAT_JSON;

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

1
По вопросам рекламы [email protected]