Капча

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Капча

Сообщение andreyrud »

Где прочитать как вообще работает капча? Нужно ли на сайте несколько разных капчей, если допустим нужно логин и подтверждение действий в других контроллерах или достаточно одной site/captcha? Как понять что происходит, если капча выдает "Неправильный проверочный код"?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Капча

Сообщение ElisDN »

Генерирует случайное число в привязке к маршруту site/captcha в captchaAction, сохраняет в сессию и рисует его в изрбражении. А потом её валидатор сравнивает введённое значение со значением из сессии.

Капча из одного контроллера будет всегда показывать один и тот же код во всех формах и изменится только когда её обновят кликом или отправкой формы. Следовательно, если пользователь откроет одновременно две формы с той же капчей и отправит одну, то вторая капча уже устареет. Так что если хотите сделать независимые капчи, то создавайте их в каждом контроллере отдельно.
andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Капча

Сообщение andreyrud »

Мне непонятен сам процесс валидации капчи. Что и как происходит и в какой последовательности.
Создал модель только с капчей:

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

class CaptchaForm extends Model
{
    public $captcha;

    public function rules()
    {
        return [
            ['captcha', 'required'],
            ['captcha', 'captcha'/*, 'captchaAction' => 'order/captcha'*/],
        ];
    }
} 
Создал контроллер с экшеном для капчи:

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

class OrderController extends \yii\web\Controller
{
    public function actionStep3()
    {
        $form = new CaptchaForm();
        if ($form->load(Yii::$app->request->post()) && $form->validate()) {
            return $this->render('final_step');
        }
        return $this->render('step3', ['model' => $form]);
    }

    public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
        ];
    }
} 
Создал форму для капчи в представлении. Там только сама капча и кнопка субмит:

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

    $form = ActiveForm::begin();
    echo $form->field($model, 'captcha')->widget(Captcha::className(), [
        'captchaAction' => 'order/captcha',
    ]);
    echo Html::submitButton("Done");
    $form->end();
Более ничего не делал.
При нажатии на субмит появляется сообщение "Неправильный проверочный код" и все. Я не вижу никакого запроса на сабмит формы, я не вижу никаких записей в логе по поводу валидации капчи и не понимаю как отслеживать сей процесс в случае если что-то идет не так.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Капча

Сообщение ElisDN »

А зачем Вы закомментировали captchaAction?

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

['captcha', 'captcha', 'captchaAction' => '/order/captcha'],
...
'captchaAction' => '/order/captcha', 
andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Капча

Сообщение andreyrud »

А зачем 2 раза указывать captchaAction? Мало того, а как в модели знать в каком таком контроллере ее используют? Ладно, у меня пример вырожденный и как бы все известно, а если CaptchaForm используется в 5 разных контроллерах? И как разрешить конфликт с этими контроллерами? Дело ли модели знать про контроллеры?

И потом, хотелось бы не просто исправить чтобы заработало, а понять что, зачем, почему и как отлаживать если что.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Капча

Сообщение ElisDN »

andreyrud писал(а):А зачем 2 раза указывать captchaAction?
Один для валидатора, второй для виджета. А если указать только в виджете, то виджет выведет капчу из order/captcha, а валидатор возьмёт по умолчанию из site/captcha. В качестве ключа в сессии у капчи используется именно маршрут вроде $_SESSION['__captcha/модуль/контроллер/действие'], поэтому если будет разный captchaAction, то из-за несовпадения ключей всегда получите "Неправильный проверочный код".
Последний раз редактировалось ElisDN 2015.05.08, 16:35, всего редактировалось 1 раз.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Капча

Сообщение ElisDN »

А если подходить с точки зрения правильности, то это да, весьма костыльный момент. Но всё равно валидатору как-то надо указать, с какой именно капчей работать. А в случае с несколькими контроллерами можно оставить всего одну site/captcha.
andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Капча

Сообщение andreyrud »

Кто-нибудь сталкивался со странным поведением капчи в Open Server?

Перелез на Open Server. Картинка с капчей периодически не отображается совсем. Файрфокс висит на "Ожидание ответа от ..." F5 повторяет ситуацию. Никаких следов происшествия нигде и ни в каких логах не обнаружил. ФайрБаг чист. Путем неизвестной комбинаций перезагрузок Файфокса, Open Server и Винды дошел до того, что капча появляется и работает...
Ответить