Ошибка YII2 при ajax валидации форм

338
24 марта 2018, 17:26

Всем привет, коллеги помогите разобраться с ошибкой при валидации формы приходит ответ вместе с ошибкой , чтото связанно с ошибками но не могу понять куда копать ?

{"signupform-email":["\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u00abEmail\u00bb."],"signupform-password":["\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u00abPassword\u00bb."],"signupform-recaptcha":["\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434."]}<pre>An Error occurred while handling another error:

yii\web\HeadersAlreadySentException: Headers already sent in D:\Openserver7\domains\coba\investproject.loc\frontend\controllers\SiteController.php on line 323. in D:\Openserver7\domains\coba\investproject.loc\vendor\yiisoft\yii2\web\Response.php:366 Stack trace:

0 D:\Openserver7\domains\coba\investproject.loc\vendor\yiisoft\yii2\web\Response.php(339): yii\web\Response->sendHeaders()

1 D:\Openserver7\domains\coba\investproject.loc\vendor\yiisoft\yii2\web\ErrorHandler.php(135): yii\web\Response->send()

2 D:\Openserver7\domains\coba\investproject.loc\vendor\yiisoft\yii2\base\ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\HeadersAlreadySentException))

3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\HeadersAlreadySentException))

4 {main} Previous exception: yii\web\HeadersAlreadySentException: Headers already sent in D:\Openserver7\domains\coba\investproject.loc\frontend\controllers\SiteController.php on line 323. in D:\Openserver7\domains\coba\investproject.loc\vendor\yiisoft\yii2\web\Response.php:366 Stack trace:

0 D:\Openserver7\domains\coba\investproject.loc\vendor\yiisoft\yii2\web\Response.php(339): yii\web\Response->sendHeaders()

Модель

 <?php
namespace frontend\models;
use common\models\Profile;
use yii\base\Model;
use common\models\User;
use yii\helpers\Html;
/**
 * Signup form
 */
class SignupForm extends Model
{
    public $username;
    public $email;
    public $password;
    public $password_repeat;
    public $subscribe = true;
    public $ip;
    public $reCaptcha;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
                ['username', 'trim'],
                ['username', 'required'],
                ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Это имя пользователя уже занято.'],
                ['username', 'string', 'min' => 2, 'max' => 255],
               // ['username', 'validateUsername'],
                ['email', 'trim'],
                ['email', 'required'],
                ['email', 'email'],
                ['email', 'string', 'max' => 255],
                ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Еmail уже существует.'],
                ['password', 'required'],
                [['password','password_repeat'], 'string', 'min' => 6],
                ['password_repeat', 'compare', 'compareAttribute'=>'password', 'skipOnEmpty' => false, 'message'=>"Должен совпадать с паролем"],
                //['password_repeat', 'validatePasswordRepeat'],
                ['ip', 'string'],
                [['reCaptcha'], \himiklab\yii2\recaptcha\ReCaptchaValidator::className(), 'secret' => \Yii::$app->params['reCaptcha']['secret'], 'uncheckedMessage' => 'Please confirm that you are not a bot.']
            ];
    }
    public function attributeLabels()
    {
        return [
            'subscribe' => 'Подписаться на Емейл рассылку',
        ];
    }
    /**
     * Signs user up.
     *
     * @return User|null the saved model or null if saving fails
     */
    public function signup()
    {
        if (!$this->validate()) {
            return null;
        }
        $user = new User();
        $user->username = $this->username;
        $user->ip = Html::encode($this->ip);
        $user->email = $this->email;
        $user->status = User::STATUS_NOT_ACTIVE;
        $user->updated_at = $user->created_at =  date('Y:m:d H:i:s');
        $user->setPassword($this->password);
        $user->generateAuthKey();
        $user->generateRegisterToken();
        if($user->save()){
            //Создаем профиль пользователя
            $profile = new Profile();
            $profile->user_id = $user->id;
            $profile->subscription_email  = $this->subscribe;
            $profile->save();
        }
        return $this->_sendEmail($user);
    }
    public function validateUsername($attribute, $params)
    {
        if (!preg_match('/^[a-z]\w*$/i', $this->username)) {
            $this->addError($attribute, \Yii::t('appn', \Yii::t('appn', 'Ошибка валидации поля Имя.Используйте латинские символы,цыфры.Запрещена кирилица, пробелы и символы *(!)@"&?%')));
        }
    }
    /**
     * @param $email - принимаем значение емайл
     * @return string
     * Генерируем имя пользователя , если такой существует пробуем присвоитьт номера , или оставляем под USE
     */
    protected function getUserName($email)
    {
        $user = User::findOne(['username'=>explode("@", $email)[0]]);
        if(!$user){
            return explode("@", $email)[0];
        }
        $username_rend = rand(1,10);
        $user = User::findOne(['username'=> explode("@", $email)[0].'_'.(string)$username_rend]);
        if(!$user){
            return explode("@", $email)[0].'_'.(string)$username_rend;
        }
        return 'User_'.(string)rand(1,10000);
    }

    private function _sendEmail($user)
    {
        $auth = \Yii::$app->authManager;
        $authorRole = $auth->getRole('user');
        $auth->assign($authorRole, $user->getId());
        $message = \Yii::$app
                    ->mailer
                    ->compose(
                        ['html' => 'userConfirmRegister-html'],
                        ['user' => $user]
                    )
                    ->setFrom([\Yii::$app->params['supportEmail']])
                    ->setTo($user->email)
                    ->setSubject(\Yii::t('appn', 'Подтверждение регистрации'))
                    ->send();
         if(!$message){
             return false;
         }
         return true;
        }
}

Контроллер

public function actionSignUp()
    {
        if (!\Yii::$app->user->isGuest) {
            Yii::$app->session->setFlash('warning', 'Вы уже зарегистрировались');
            return $this->redirect('/');
        }
        $model = new SignupForm();
        // ajax validation
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            echo json_encode(ActiveForm::validate($model));
            Yii::$app->end();
        }

        if ($model->load(Yii::$app->request->post())) {
            if($model->signup() != null){
                Yii::$app->session->setFlash('success', Yii::t('appu', 'Для окончания регистрации перейдите по ссылке, которая была отправлена на указанный E-mail.').
                    Yii::t('appu', ' Если письмо не пришло проверьте папку спам.'));
                return $this->redirect('/');
            }else{
                Yii::$app->session->setFlash('error', 'Пользователь с таким логином или Е-mail уже существует, попробуйте другой Е-mail или воспользоваться восстановлением <a href="/site/request-password-reset">пароля</a>');
                return $this->redirect('/sign-up');
            }
            /*
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }*/
        }
        return $this->render('signup', [
            'model' => $model,
        ]);
    }
Answer 1

Для начала замените

echo json_encode(ActiveForm::validate($model));
Yii::$app->end();

на

return ActiveForm::validate($model);
Answer 2

немного изменил код валидации, всем удачи

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { 
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
 return ActiveForm::validate($model);
 } 
READ ALSO
Проблема с ссылками на Opencart

Проблема с ссылками на Opencart

catalog/view/theme/journal2/css/j-strapcss?j2v=2

194
Отправка данных выбранного блока в БД без перезагрузки страницы

Отправка данных выбранного блока в БД без перезагрузки страницы

Всем приветЦиклом foreach подгружаю из базы данных посты как на примере: "пост 1" "пост 2" "пост 3" и тд

191