Привет, столкнулся с некоторой проблемой обновления капчи в случае моей конфигурации приложения.
Во view вывожу капчу таким образом:
<?= $form->field($model, 'verifyCode', ['errorOptions' => ['class' => 'error']])
->widget(Captcha::className(), [
'captchaAction' => '/cabinet/captcha/',
'options' => [
'class' => 'text',
'placeholder' => 'Код с картинки',
],
) ?>
Указание пути к экшену капчи у меня находится в основном контроллере Site
class SiteController extends Controller
{
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
}
Чтоб в него попадать по урл /cabinet/captcha/ прописано правило роутинга
'<controller:(cabinet)>/<action:(contacts|captcha)>/' => 'site/<action>',
Собственно при посещении урла /cabinet/contacts/ капча успешно отображается, загружаясь по урл /cabinet/captcha/?v=66bb40d1b29ac
Но по нажатию на капчу она пытается обновиться, делая xhr запрос на урл /cabinet/captcha/?refresh=1&_=1455112401198 и получаем ответ
{hash1: 635, hash2: 635, url: "/site/captcha/?v=56bb412c5a86e"}
и src картинки подменяется на /site/captcha/?v=56bb412c5a86e вместо ожидаемого /cabinet/captcha/?v=56bb412c5a86e, картинка капчи крашится, приходится обновлять страницу
Дело в том что на моем сайте фреймворку передается управление только в двух "директориях", это /cabinet/* и /blog/, соответственно у меня нет возможности обработать /site/
Проблема как я понимаю кроется в коде CaptchaAction, а именно ‘url’ => Url::to([$this->id, ‘v’ => uniqid()]),
public function run()
{
if (Yii::$app->request->getQueryParam(self::REFRESH_GET_VAR) !== null) {
// AJAX request for regenerating code
$code = $this->getVerifyCode(true);
Yii::$app->response->format = Response::FORMAT_JSON;
return [
'hash1' => $this->generateValidationHash($code),
'hash2' => $this->generateValidationHash(strtolower($code)),
// we add a random 'v' parameter so that FireFox can refresh the image
// when src attribute of image tag is changed
'url' => Url::to([$this->id, 'v' => uniqid()]),
];
} else {
$this->setHttpHeaders();
Yii::$app->response->format = Response::FORMAT_RAW;
return $this->renderImage($this->getVerifyCode());
}
}
Обновление капчи не учитывает мою настройку виджета
'captchaAction' => '/cabinet/captcha/',
и просто использует id текущего экшена
Можно ли настройками виджета или приложения исправить данную оплошность, не переопределяя CaptchaAction? И можно ли такое поведение считать "недоработкой" капчи?