@EVOSandru6

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

Добрый день,

Есть такая проблема. Сделал 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()

Подскажите пожалуйста, в че может быть причина?
  • Вопрос задан
  • 1004 просмотра
Решения вопроса 2
Из за двойной валидации
if (!$model->validate()) {
if (!$model->save()) {
Ответ написан
slo_nik
@slo_nik Куратор тега Yii
Доброе утро.
У Вас в правилах валидации что-то не то, это первое.
А второе - слишком намудрили в действии create. Не совсем понятно, что Вы присваиваете в $model->type, да и с остальным...
Возможно надо отталкиваться от следующего:
public function actionCreate()
{

   if($model->load(Yii::$app->request->post() && $model->save()){
       // заполняете flash сообщение и делаете редирект
   }
   else{
      return $this->render('create', ['model' => $model')
   }

}

Попробуйте пока так, без "гостя", будет ли работать captcha или нет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы