Я использую стандартную реализацию капчи расширенного фреймворка yii2. У меня проблема: я хочу менять свой код с картинки каждый раз, когда обновляю страницу, но когда я обновляю страницу, мой код с картинки не меняется.
Наиболее правильным решением будет создать свой собственный CaptchaAction
, что расширяет yii\captcha\CaptchaAction
и переопределить run()
метод следующим образом:
namespace app\actions; // Change to your own
class CaptchaAction extends yii\captcha\CaptchaAction {
public $autoRegenerate = true;
public function run()
{
if ($this->autoRegenerate && Yii::$app->request->getQueryParam(self::REFRESH_GET_VAR) === null) {
$this->setHttpHeaders();
Yii::$app->response->format = Response::FORMAT_RAW;
return $this->renderImage($this->getVerifyCode(true));
}
return parent::run();
}
}
потому что вы установили YII_ENV на TEST, как это defined('YII_ENV') or define('YII_ENV', 'test');
измените это на defined('YII_ENV') or define('YII_ENV', 'prod');
попробуй это
<script>
window.onload = hello;
function hello()
{
document.getElementById('loginform-captcha-image').click();
}
</script>
Я нашел грязный способ обойти это — просто вызвать click
событие, когда страница загружается. Добавьте этот код в самом конце вашего view
файл, после окончания формы;
$js = <<<JS
$('#loginform-captcha-image').trigger('click');
JS;
$this->registerJs($js, $this::POS_READY);
Это не очень красиво, но это работает, и я нашел единственный способ справиться с этой проблемой, которая также преследует мои собственные сайты.
В вашем контроллере просто unset
сеанс капчи:
session_start();
unset($_SESSION["__captcha/panel/panel-auth/captcha"]);
unset($_SESSION["__captcha/panel/panel-auth/captchacount"]);
Обновите свой CaptchaAction
как
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => null,
],
];
}
Читать Исправлен код проверки
ЕСЛИ fixedVerifyCode
если установлено, то капча совпадает со значением, установленным в fixedVerifyCode
// code from yii\captcha\CaptchaAction in Yii2
public function getVerifyCode($regenerate = false)
{
if ($this->fixedVerifyCode !== null) {
return $this->fixedVerifyCode;
}
$session = Yii::$app->getSession();
$session->open();
$name = $this->getSessionKey();
if ($session[$name] === null || $regenerate) {
$session[$name] = $this->generateVerifyCode();
$session[$name . 'count'] = 1;
}
return $session[$name];
}