yii2 captcha не проходит валидацию

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
vano.mig
Сообщения: 73
Зарегистрирован: 2016.11.21, 10:25

yii2 captcha не проходит валидацию

Сообщение vano.mig »

Помогите новичку!
Много читал на форуме, но без результата..
Каптча при регистрации все время пишет ошибку... ($_POST['verifyCode']) !=(__captcha);
Подскажите где ошибка

Код: Выделить всё

<?php
namespace mdm\admin\models\form;

use Yii;
use mdm\admin\models\User;
use yii\base\Model;

/**
 * Signup form
 */
class Signup extends Model
{
    public $username;
    public $email;
    public $password;
    public $password_repeat;
    public $question;
    public $answer;
    public $verifyCode;
    public $hash;
    public $active;
    public $access;

    /**
     * @inheritdoc
     */

    public function attributeLabels() {
        return [
            'username' => 'Логин *',
            'email' => 'Email *',
            'password' => 'Введите пароль *',
            'password_repeat' => 'Введите пароль еще раз *',
            'question' => 'Секретный вопрос *',
            'answer' => 'Ответ на вопрос *',
            'verifyCode'=>'Введите буквы с картинки *',
        ];
    }

    public function rules()
    {
        return [
            ['username', 'filter', 'filter' => 'trim'],
            
            ['username', 'unique', 'targetClass' => 'mdm\admin\models\User', 'message' => 'Данный логин уже используется.'],
            ['username', 'string', 'min' => 5, 'max' => 30],

            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            ['email', 'unique', 'targetClass' => 'mdm\admin\models\User', 'message' => 'Данный email уже используется.'],

            [['username', 'email', 'password', 'password_repeat', 'question', 'answer',], 'required', 'message' =>'Заполните поле'],
            ['email', 'email'],
            [['password'],'string', 'length' => [6,30]],
            [['password_repeat'], 'compare', 'compareAttribute'=>'password', 'message'=>'Пароли не совпадают'],
            [['answer'], 'string','length' => [5,30]],
            ['verifyCode', 'required'],
            ['verifyCode', 'captcha']
        ];
    }

    /**
     * Signs user up.
     *
     * @return User|null the saved model or null if saving fails
     */
    public function signup()
    {
        if ($this->validate()) {
            $user = new User();
            $user->username = $this->username;
            $user->email = $this->email;
            $user->setPassword($this->password);
            $user->question = $this->question;
            $user->answer = $this->answer;
            $user->generateAuthKey();
            $user->status = 0;
            if ($user->save()) {
                $userRole = Yii::$app->authManager->getRole('user');
                Yii::$app->authManager->assign($userRole, $user->getId());
                return $user;
            }
        }
        
        return null;
    }
}

Код: Выделить всё

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm as Login;
use app\models\ContactForm;
use app\models\Pages;
use app\models\Products;
use app\models\ProductsImage;
use app\models\Signup;
use app\models\Coment;
use app\models\Orders;
use app\models\User;
use mdm\admin\models\form\PasswordResetRequest;
use mdm\admin\models\form\ResetPassword;
use mdm\admin\models\form\ChangePassword;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\NotFoundHttpException;
use yii\web\ForbiddenHttpException;
use yii\helpers\Url;

class SiteController extends AppController
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

    public function actionAjax() {
        if(Yii::$app->request->post('login')) {
            $login = Yii::$app->request->post('login');
            $title = 'username';
        } elseif (Yii::$app->request->post('email')) {
            $login = Yii::$app->request->post('email');
            $title = 'email';
        };
        //debug($login);
        if ($login) {
            $res = User::find()->asArray()->where("$title = '$login'")->all();
            if (empty($res)) {
                $login = "";
            } else {
                $login;
            }
            echo json_encode($login);
           // return $login;
        }

    }

    /*public function actionInactive() {
        return $this->render('lock');
    }*/

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

    public function actionAjaxcoment() {
        if(Yii::$app->request->post()) {
            //return print_r(Yii::$app->request->post());
            $com = new Coment();
            $com->user = $_POST['user'];
            $com->body = $_POST['body'];
            $com->product_id = $_POST['product_id'];
            if ($com->save()) {
                $data = array();
                $query = Coment::find()->asArray()->orderBy(['id'=>SORT_DESC])->limit(1)->all();
                if ($query) {
                    foreach ($query as $com) {
                        $data['user'] = "<div class=\"col-sm-12 coment\">".
                                        "<div class=\"user-com\">".$com['user']."</div>".
                                        "<div class=\"data-com\">".$com['data']."</div>".
                                        "<div class=\"body-com\">".$com['body']."</div>".
                                    "</div>";
                    }
                    echo json_encode($data);
                }
            }
        }
    }

    public function actionAllcoments() {
        if(Yii::$app->request->post()) {
                $id = $_POST['id'];
                $query = Coment::find()->asArray()->where("product_id = $id")->orderBy(['id'=>SORT_DESC])->all();
                //$query = Coment::find()->asArray()->where("product_id = $id")->orderBy(['id'=>SORT_DESC])->all();
                if ($query) {
                    if ($query) {
                        $data = array();
                    foreach ($query as $com) {
                        $data['com'] .= "<div class=\"col-sm-12 coment\">".
                                            "<div class=\"user-com\">".$com['user']."</div>".
                                            "<div class=\"data-com\">".$com['data']."</div>".
                                            "<div class=\"body-com\">".$com['body']."</div>".
                                        "</div>";
                    } echo json_encode($data);
                }
                    /*$count = count($query);
                    $i = 1;
                    foreach ($query as $com) {
                        $coment = "<div class=\"user-com\">".$com['user']."</div>".
                        "<div class=\"data-com\">".$com['data']."</div>".
                         "<div class=\"body-com\">".$com['body']."</div>";
                    $data['com'] = $coment;
                    if ($i == ($count-6)) {
                        break;
                    }
                    $i++;
                    echo json_encode($data);
                    }*/
                }
            }
        }

    public function actionIndex()
    {  
        $model = new Pages();
        $query = Pages::find()->asArray()->where("title = 'Главная'")->all();
        //debug($query);
        $model = new Products();
        $result = Products::find()->asArray()->with('products')->orderBy(['id'=>SORT_DESC])->limit(21)->all();
        //debug($result);
        $this->setMeta("Lorea | ".$query[0]['title'], $query[0]['keywords'], $query[0]['description']);
        return $this->render('index', compact('query', 'result'));
    }

    //login
    public function actionLogin()
    {
        $this->setMeta("Lorea | Авторизация");
        if (!Yii::$app->getUser()->isGuest) {
            return $this->goHome();
        }

        $model = new Login();
        if ($model->load(Yii::$app->getRequest()->post()) && $model->login()) { 
            $_SESSION['login'] = $_POST['LoginForm']['username'];
            return $this->goBack();
        } else {
            //print_r(Yii::$app->getRequest()->post());
            return $this->render('login', [
                    'model' => $model,
            ]);
        }
    }

    public function actionLogout()
    {
        Yii::$app->getUser()->logout();
        return $this->goHome();
    }
    
    //signup
    public function actionSignup()
    {
        //$this->layout = 'sign';
        $model = new Signup();
        $this->setMeta('Lorea | Регистрация');
        //if ($model->load(Yii::$app->getRequest()->post())) {
           // if ($user = $model->signup()) {
             //   return $this->goHome();
          //  }
       // }
       // print_r(Yii::$app->getRequest()->post());
        if (!empty(Yii::$app->request->post('Signup'))) {
            $session = Yii::$app->session;
                        $session->open();
            //debug(Yii::$app->request->post('SignUp')['check']);
            //if (Yii::$app->request->post('Signup')['check'] == 1) {
                $_SESSION['reg'] = Yii::$app->request->post('Signup');
                //debug(Yii::$app->request->post('SignUp'));
                //print_r(Yii::$app->getRequest()->post());
                $model->attributes = Yii::$app->request->post('Signup');
                //$model->login = $res['login'];
                if ($model->validate()) {
                    //$model->signup();
                    //unset($_POST['captcha']);
                    //debug($model); die;
                    if ($model->signup()) {
                        echo 'OK'; die;
                        //print_r($_SESSION);
                        Yii::$app->session->setFlash('success', 'Поздравляем! Вы успешно зарегистрировались. На Ваш Email адрес отправлено сообщение. Для активации акаунта пожалуйста перейдите по ссылке, указанной в письме');
                        Yii::$app->mailer->compose('registration', ['session' => $session])->setFrom(['ika.reply@gmail.com' => 'LOREA'])->setTo($_SESSION['reg']['email'])->setSubject('Поздравляем! Вы успешно зарегистрировались.')->send();
                        $session->remove('reg');
                        //return $this->refresh();
                        return $this->goHome();


                    } else {
                        Yii::$app->session->setFlash('error', 'Ошибка регистрации!');
                    }
                   // return $this->goHome();
                }
           // }
        }
        return $this->render('signup', compact('model'));
    }

    public function actionRequestPasswordReset()
    {
        //$this->layout = 'sign';
        $this->setMeta("Lorea | Восстановление пароля");
        $model = new PasswordResetRequest();
        if ($model->load(Yii::$app->getRequest()->post()) && $model->validate()) {
            if ($model->sendEmail()) {
                Yii::$app->getSession()->setFlash('success', 'Письмо отправлено на указанный Email. Перейдите в почту для восстановления пароля.'/*'Check your email for further instructions.'*/);

                return $this->goHome();
            } else {
                Yii::$app->getSession()->setFlash('error', 'Извините, на указанный Email невозможно отправить письмо.'/*'Sorry, we are unable to reset password for email provided.'*/);
            }
        }

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

    /**
     * Reset password
     * @return string
     */
    public function actionResetPassword($token)
    {
        //$this->layout = 'sign';
        $this->setMeta("Lorea | Восстановление пароля");
        try {
            $model = new ResetPassword($token);
        } catch (InvalidParamException $e) {
            throw new BadRequestHttpException($e->getMessage());
        }

        if ($model->load(Yii::$app->getRequest()->post()) && $model->validate() && $model->resetPassword()) {
            Yii::$app->getSession()->setFlash('success', 'Новый пароль успешно сохранен');

            return $this->goHome();
        }

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

    /**
     * Reset password
     * @return string
     */
    public function actionChangePassword()
    {
        $this->setMeta("Lorea | Восстановление пароля");
        $model = new ChangePassword();
        if ($model->load(Yii::$app->getRequest()->post()) && $model->change()) {
            return $this->goHome();
        }

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

    protected function findModel($id)
    {
        if (($model = User::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('Данного пользователя не сущевствует');
           // throw new NotFoundHttpException('The requested page does not exist.');
        }
    }

    public function actionActive() {
        if (!Yii::$app->request->get('hash') && !Yii::$app->request->get('hash') != "") {
            throw new NotFoundHttpException('Данного пользователя не сущевствует');
        }
        $id = Yii::$app->request->get('hash');
        $query = User::find()->where("auth_key = '$id'")->one();
        if (!$query) {
            throw new NotFoundHttpException('Отсутствуют данные для активации пользователя');
        }
        if ($query->status == User::STATUS_INACTIVE) {
            $query->status = User::STATUS_ACTIVE;
            if ($query->save()) {
                Yii::$app->getSession()->setFlash('success', 'Поздравляем! Вы успешно активированы.');
                return $this->goHome();
            } else {
                $errors = $user->firstErrors;
                throw new UserException(reset($errors));
            }
        } 
    }

    /*public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        }
        return $this->render('login', [
            'model' => $model,
        ]);
    }

    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }*/

    /*public function actionRegistration() {
        $model = new SignUP();
        $this->setMeta('IKA | Регистрация');
        if (!empty(Yii::$app->request->post('SignUp'))) {
            $session = Yii::$app->session;
                        $session->open();
            //debug(Yii::$app->request->post('SignUp')['check']);
            if (Yii::$app->request->post('SignUp')['check'] == 1) {
                $_SESSION['reg'] = Yii::$app->request->post('SignUp');
                //debug(Yii::$app->request->post('SignUp'));
                $model->attributes = Yii::$app->request->post('SignUp');
                //$model->login = $res['login'];
                if ($model->validate()) {
                    $model->SignUp();
                    if ($model) {
                        Yii::$app->session->setFlash('success', 'Поздравляем! Вы успешно зарегистрировались. На Ваш Email адрес отправлено сообщение. Для активации акаунта пожалуйста перейдите по ссылке, указанной в письме');
                        Yii::$app->mailer->compose('registration', ['session' => $session])->setFrom(['ika.reply@gmail.com' => 'IKA'])->setTo($_SESSION['reg']['email'])->setSubject('Поздравляем! Вы успешно зарегистрировались.')->send();
                        $session->remove('reg');
                        //return $this->refresh();
                        return $this->goHome();


                    } else {
                        Yii::$app->session->setFlash('error', 'Ошибка регистрации!');
                    }
                   // return $this->goHome();
                }
            }
        }
        return $this->render('registration', compact('model'));
    }*/


    /*public function actionContact()
    {
        $model = new ContactForm();
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');

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

    public function actionAbout()
    {
        return $this->render('about');
    }*/

    public function actionCab() {
        if (!\Yii::$app->user->can('User')) {
            throw new ForbiddenHttpException('У Вас нет прав доступа к данной странице!');
        }
        $this->setMeta("Lorea | Личный кабинет");
        $session = Yii::$app->session;
        $session->open();
        $this->layout = 'cab';
        $id = $_SESSION['login'];
        $query = Orders::find()->where("login = '$id'")->with('orderProd')->asArray()->all();

        return $this->render('cab', compact('query'));
    }

    public function actionComents() {
        if (!\Yii::$app->user->can('User')) {
            throw new ForbiddenHttpException('У Вас нет прав доступа к данной странице!');
        }
        $this->setMeta("Lorea | Личный кабинет");
        $session = Yii::$app->session;
        $session->open();
        $this->layout = 'cab';
        $id = $_SESSION['login'];
        $query = Coment::find()->where("user = '$id'")->asArray()->all();
        return $this->render('coments', compact('query'));
    }
    public function actionView() {
        if (!\Yii::$app->user->can('User')) {
            throw new ForbiddenHttpException('У Вас нет прав доступа к данной странице!');
        }
        $this->setMeta("Lorea | Личный кабинет");
        $session = Yii::$app->session;
        $session->open();
        $this->layout = 'cab';
        $id = $_SESSION['__id'];
        $model = User::findOne($id);
        if (Yii::$app->request->post('User')) {
            //print_r($_POST['User']);
            $login = $_POST['User']['username'];
            //echo $login;
            $email = $_POST['User']['email'];
            $model->username = $login;
            $model->email = $email;
            if ( $model->save()) {
                Yii::$app->session->setFlash('success', "Данные успешно изменены");
                return $this->redirect('view');
            } else {
                Yii::$app->session->setFlash('error', "Ошибка изменения данных");
               return $this->render('view', compact($model));
            }
        }
        //$query = $model->find()->where("id = '$id'")->all();
        //debug($query);
        return $this->render('view', compact('model'));
    }
}

Код: Выделить всё

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\helpers\Url;

/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model \mdm\admin\models\form\Signup */
?>
<div class="container reg">
<h3>Регистрация пользователя</h3>
<div class="reg-text">Поля обозначеные * обязательны для заполнения!</div>
   <?php $form = ActiveForm::begin(['class'=>'horizontal']); ?>
<?= $form->field($model, 'username')->input(['autofocus'=>true])?>
<?= $form->field($model, 'email')->input('email') ?>
<?= $form->field($model, 'password')->passwordInput()?>
<?= $form->field($model, 'password_repeat')->passwordInput()?>
<?= $form->field($model, 'question')->dropDownList(['prompt' => 'Выберите вопрос', 'Любимое блюдо', 'Имя животного', 'Девичья фамилия матери', 'Любимый вид спорта', 'Марка автомобиля']);?>
<?= $form->field($model, 'answer')?>
<?= $form->field($model, 'verifyCode')->widget(\yii\captcha\Captcha::classname(), [
	//'validateOnSubmit' => false,
    // configure additional widget properties here
]) ?>
<div class="form-grop">
	<?= Html::submitButton('Регистрация', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>      
</div>
Medic84
Сообщения: 61
Зарегистрирован: 2017.01.28, 17:48

Re: yii2 captcha не проходит валидацию

Сообщение Medic84 »

Слишком большой код чтобы в нем разбираться. Но смущает строка:

Код: Выделить всё

'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
И я не вижу где указан action для капчи? В случае если дефолтный контроллер у Вас не site

Код: Выделить всё

'captchaAction'=>'site/captcha',
В общем не понятно. Сайт в продакшене или в тестовом режиме, и какой дефолтный контроллер Вы используете.
Ответить