Почему в Yii2 каптча всегда выдает *Неправильный проверочный код* при model->save()?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
EVOSandru6
Сообщения: 605
Зарегистрирован: 2014.07.04, 13:33

Почему в Yii2 каптча всегда выдает *Неправильный проверочный код* при model->save()?

Сообщение EVOSandru6 »

Добрый день,

Есть такая проблема. Сделал Captcha для формы заказов аналогично как у контактов по умолчанию:

Модель:

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

class Orders extends ActiveRecord
{
       public $verifyCode;
      
        ...

      public function rules()
     {
         ['verifyCode', 'captcha', 'captchaAction' => Url::to(['/orders/default/captcha']), 'when'=>function($model) {
                return Yii::$app->user->isGuest;
            }],
     }
}
Контроллер:

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

namespace app\modules\orders\controllers\frontend;
...
class DefaultController extends Controller
{
     public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

public function actionCreate()
    {
        $model = new Orders();

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

            $model->type = Orders::TYPE_PRODUCT;

            if (!$model->validate()) {
                /*My::printArr($this->model->printErrors());
                die;*/
                Yii::$app->session->addFlash('danger', $model->printErrors());
                return $this->redirect([Yii::$app->request->referrer]);
            }

            if (!$model->save()) {
                // тут вываливается ошибка:

               //Array
               //(
               //    [verifyCode] => Array
               //        (
               //            [0] => Неправильный проверочный код.
               //        )
               //)

                MyHelper::printArr($model->getErrors());
                die();

                Yii::$app->session->addFlash('danger', $model->printErrors());
            }
            else {
                return $this->redirect(['view','id'=>$model->id]);
            }
            return $this->redirect(Url::home());
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }
}
Форма представления:

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

<?php $form = ActiveForm::begin([
     'id'=>$model->formName(),
 ]); ?>

...

<?if(Yii::$app->user->isGuest):?>
        <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
             'captchaAction' => Url::to(['/orders/default/captcha']),
             'template' => '>{image}{input}',
        ]) ?>
<?endif;?>

<?= Html::submitButton(Yii::t('app', 'create'),) ?>

<?php ActiveForm::end(); ?>

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

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

$model->save()
Подскажите пожалуйста, в че может быть причина?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему в Yii2 каптча всегда выдает *Неправильный проверочный код* при model->save()?

Сообщение Dominus »

Попробуйте так:
вместо

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

'captchaAction' => Url::to(['/orders/default/captcha']),
указать

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

'captchaAction' => Url::to('/orders/default/captcha'),
В виде и в правилах модели.

И еще проверьте правило маршрутизации в urlManager

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

'orders/captcha' => 'orders/default/captcha',
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Почему в Yii2 каптча всегда выдает *Неправильный проверочный код* при model->save()?

Сообщение urichalex »

Dominus писал(а): 2017.11.14, 11:31 Попробуйте так:
вместо

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

'captchaAction' => Url::to(['/orders/default/captcha']),
указать

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

'captchaAction' => Url::to('/orders/default/captcha'),
В виде и в правилах модели.

И еще проверьте правило маршрутизации в urlManager

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

'orders/captcha' => 'orders/default/captcha',
роут нужно указывать в массиве, иначе это обычный урл и, если изменятся правила роутинга, будет 404

Автор, аякс валидация включена у формы?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему в Yii2 каптча всегда выдает *Неправильный проверочный код* при model->save()?

Сообщение Dominus »

У меня была схожая ситуация с капчой в модуле.
Заменил

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

'captchaAction' => Url::to(['/orders/default/captcha']),
на

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

'captchaAction' => Url::to('/orders/default/captcha'),
И всё заработало.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Почему в Yii2 каптча всегда выдает *Неправильный проверочный код* при model->save()?

Сообщение urichalex »

Dominus писал(а): 2017.11.14, 16:10 У меня была схожая ситуация с капчой в модуле.
Заменил

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

'captchaAction' => Url::to(['/orders/default/captcha']),
на

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

'captchaAction' => Url::to('/orders/default/captcha'),
И всё заработало.
Значит криво настроены правила роутинга
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему в Yii2 каптча всегда выдает *Неправильный проверочный код* при model->save()?

Сообщение Dominus »

View:

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

<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
          'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
          'captchaAction' => Url::to('/main/default/captcha'),
          'imageOptions' => [
              'style' => 'display:block; border:none; cursor: pointer',
              'alt' => Module::t('module', 'Code'),
              'title' => Module::t('module', 'Click on the picture to change the code.'),
          ],
          'class' => 'form-control',
]) ?>
<?php ActiveForm::end(); ?>
Model:

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

//...
public function rules()
    {
        return [
            // name, email, subject and body are required
            [['name', 'email', 'subject', 'body'], 'required'],
            // email has to be a valid email address
            ['email', 'email'],
            // verifyCode needs to be entered correctly
            [['verifyCode'], 'required', 'on' => self::SCENARIO_GUEST],
            ['verifyCode', 'captcha', 'captchaAction' => Url::to('/main/default/captcha'), 'on' => self::SCENARIO_GUEST],
        ];
    }
//...
Controller:

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

public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
                'backColor' => 0xF1F1F1,
                'foreColor' => 0xEE7600,
            ],
        ];
    }
Правило:

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

    '' => 'main/default/index',
    'captcha' => 'main/default/captcha',
    '<_a:(about|contact)>' => 'main/default/<_a>',
При таком раскладе всё работает корректно.

Если указать в View

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

  //...
  'captchaAction' => Url::to(['/main/default/captcha']),
 //...
Картинка отображается, валидация проходит только 1 раз. При обновлении картинки и вводе кода, валидация не проходит.

Если так же указать в правилах модели

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

['verifyCode', 'captcha', 'captchaAction' => Url::to(['/main/default/captcha']), 'on' => self::SCENARIO_GUEST],
Вываливается ошибка

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

Exception (Invalid Configuration) 'yii\base\InvalidConfigException' with message 'Invalid CAPTCHA action ID: /captcha' 
Как то так.

https://github.com/yiisoft/yii2/issues/10910

В общем то я не стал заморачиваться и оставил так, как корректно работает.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить