Доброго времени суток! Намучался с капчёй, не знаю что и делать! Каждый раз, когда отправляю форму, выдаёт ошибку капча не верная. Заглянул в сессию, и увидел, что капча, хранящаяся там уже другая.
Одна надежда на Вас! Заранее благодарен)
Контроллер:
Код: Выделить всё
public function actions()
{
return [
'error' => [
'class' => 'yiiwebErrorAction',
],
'captcha' => [
'class' => 'yiicaptchaCaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
public function actionContact()
{
$feedBack = new Feedback();
if ($feedBack->load(Yii::$app->request->post())) {
if(!$feedBack->validate())
{
return $this->render('error');;
}
if (!$feedBack->save()) {
return $this->render('error');
} else {
$feedBack->contact(Yii::$app->params['emailto']);
return $this->goHome();
}
}
$content = Page::find()->where('page_id = 6')->one();
return $this->render('contact', [
'feedBack' => $feedBack,
'content' => $content
]);
}
Модель:
Код: Выделить всё
class Feedback extends yiidbActiveRecord
{
public $verifyCode;
public static function tableName()
{
return 'feedback'; // TODO: Change the autogenerated stub
}
public function rules()
{
return [
// login and password are both required
[['feedback_name'], 'string', 'min' => 8, 'max' => 60],
[['feedback_email'], 'email'],
[['feedback_phone'], 'match', 'pattern' => '/^([+]{0,1})-{0,}[0-9 ]{6,30}/'],
[['feedback_text'], 'string', 'min' => 10, 'max' => 1000],
[['feedback_name', 'feedback_email', 'feedback_phone', 'feedback_text'], 'required'],
// ['verifyCode', 'string'],
['verifyCode', 'captcha']
];
}
/* Определяем названия полей */
public function attributeLabels()
{
return [
'verifyCode' => 'Подтвердите код',
'feedback_name' => 'Имя',
'feedback_email' => 'Электронный адрес',
'feedback_phone' => 'Номер телефона',
'feedback_text' => 'Сообщение',
];
}
public function contact($emailto)
{
if(Yii::$app->mailer->compose()
->setFrom(Yii::$app->params['adminEmail']) /* от кого */
->setTo($this->feedback_email) /* куда */
->setSubject('Админ') /* имя отправителя */
->setTextBody('Добрый день! Ваше сообщение принято!')->setCharset('UTF-8') /* текст сообщения */
->send() /* функция отправки письма */
){
return true;
} else {
return false;
}
}
Ошибка с капчей в контактной форме-как исправить?
07.10.2018, 15:05. Показов 2218. Ответов 3
Использую шаблон basik в Yii2 для интернет-магазина. В cart/view уже настроена отправка почты при заказе товара, все работает, письма доходят, но нужно ещё сделать отправку сообщений в ссылке ‘Контакты» , и здесь ошибки(
Error Exception (Invalid Configuration) ‘yiibaseInvalidConfigException’ with message ‘Invalid CAPTCHA action ID: index/captcha’
in D:sitesyii2.locvendoryiisoftyii2captchaCapt chaValidator.php:81
| PHP | ||
|
Stack trace:
#0 D:sitesyii2.locvendoryiisoftyii2captchaCapt chaValidator.php(100): yiicaptchaCaptchaValidator->createCaptchaAction()
#1 D:sitesyii2.locvendoryiisoftyii2captchaCapt chaValidator.php(90): yiicaptchaCaptchaValidator->getClientOptions(Object(appmodelsContactForm) , ‘verifyCode’)
#2 D:sitesyii2.locvendoryiisoftyii2widgetsActi veField.php(819): yiicaptchaCaptchaValidator->clientValidateAttribute(Object(appmodelsContact Form), ‘verifyCode’, Object(yiiwebView))
#3 D:sitesyii2.locvendoryiisoftyii2widgetsActi veField.php(230): yiiwidgetsActiveField->getClientOptions()
#4 D:sitesyii2.locvendoryiisoftyii2widgetsActi veField.php(220): yiiwidgetsActiveField->begin()
#5 D:sitesyii2.locvendoryiisoftyii2-bootstrapsrcActiveField.php(187): yiiwidgetsActiveField->render(‘
public static function convertExceptionToError($exception)
{
trigger_error(static::convertExceptionToString($ex ception), E_USER_ERROR);
}
in D:sitesyii2.locviewsindexcontact.php at line 45 – yiiwidgetsActiveField::__toString()
стр. 45 ‘captchaAction’ => ‘/index/captcha’,
| PHP | ||
|
in D:sitesyii2.locvendoryiisoftyii2baseView.ph p at line 336 – require(‘D:sitesyii2.locviewsindexcontact.php ‘)
стр. 336 require $file_;
in D:sitesyii2.locvendoryiisoftyii2baseView.ph p at line 254 – yiibaseView::renderPhpFile(‘D:sitesyii2.locvi ewsindexco…’, [‘model’ => appmodelsContactForm])
стр 254 $output renderer-> render ($ this, $ viewFile, $ params);
in D:sitesyii2.locvendoryiisoftyii2baseControl ler.php at line 384 – yiibaseView::render(‘contact’, [‘model’ => appmodelsContactForm], appcontrollersIndexController)
| PHP | ||
|
in D:sitesyii2.loccontrollersIndexController.php at line 37 – yiibaseController::render(‘contact’, [‘model’ => appmodelsContactForm])
| PHP | ||
|
SiteController
| PHP | ||
|
IndexController
| PHP | ||
|
Model ContactForm.php
| PHP | ||
|
Вид папка index/ contact.php
| PHP | ||
|
config/web
| PHP | ||
|
Params.php
| PHP | ||
|
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
В Yii для работы с капчей уже имеется несколько специальных классов. Поэтому можно использовать действие captcha, которое указывает на класс yiicaptchaCaptchaAction, подключив его в контроллере
class SiteController extends Controller
{
// ...
public function actions()
{
return [
// ...
'captcha' => [
'class' => 'yiicaptchaCaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
// ...
}
Теперь по url site/captcha у нас будет работать класс yiicaptchaCaptchaAction. fixedVerifyCode устанавливает код капчи для тестового режима работы.
Затем в модели формы добавляем публичное свойство для хранения значения из поля ввода кода капчи пользователем, и правило валидации этого поля
class ContactForm extends Model{
// ...
public $verifyCode;
// ...
public function rules()
{
return [
// ...
['verifyCode', 'captcha'],
];
}
// ...
}
И в виде формы добавляем само это поле для кода проверки
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
// ...
<?= $form->field($model, 'verifyCode')->widget(Captcha::className()) ?>
// ...
<?php ActiveForm::end(); ?>
Следует заметить, что сегодня есть роботы, распознающие текст с картинок, и поэтому стоит улучшить защиту. Если делать сложнее и запутаннее картинку с кодом, то это не понравится пользователям, которые будут сами ошибаться при вводе символов и цифр и им будет сложно распознавать изображение.
Хорошим выходом может быть простая математическая задача, которую решит реальный человек. Для этого есть удобное расширение hreitsma/yii2-simplemath-captcha
- Главная
- Блог
- Добавляем капчу на форму. Настройка Captcha.
Я использую стандартную реализацию капчи расширенного фреймворка yii2. У меня проблема: я хочу менять свой код с картинки каждый раз, когда обновляю страницу, но когда я обновляю страницу, мой код с картинки не меняется.
3
Решение
Наиболее правильным решением будет создать свой собственный CaptchaAction, что расширяет yiicaptchaCaptchaAction и переопределить run() метод следующим образом:
namespace appactions; // Change to your own
class CaptchaAction extends yiicaptchaCaptchaAction {
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();
}
}
2
Другие решения
потому что вы установили YII_ENV на TEST, как это defined('YII_ENV') or define('YII_ENV', 'test'); измените это на defined('YII_ENV') or define('YII_ENV', 'prod');
1
попробуй это
<script>
window.onload = hello;
function hello()
{
document.getElementById('loginform-captcha-image').click();
}
</script>
1
Я нашел грязный способ обойти это — просто вызвать click событие, когда страница загружается. Добавьте этот код в самом конце вашего view файл, после окончания формы;
$js = <<<JS
$('#loginform-captcha-image').trigger('click');
JS;
$this->registerJs($js, $this::POS_READY);
Это не очень красиво, но это работает, и я нашел единственный способ справиться с этой проблемой, которая также преследует мои собственные сайты.
0
В вашем контроллере просто unset сеанс капчи:
session_start();
unset($_SESSION["__captcha/panel/panel-auth/captcha"]);
unset($_SESSION["__captcha/panel/panel-auth/captchacount"]);
0
Обновите свой CaptchaAction как
public function actions()
{
return [
'error' => [
'class' => 'yiiwebErrorAction',
],
'captcha' => [
'class' => 'yiicaptchaCaptchaAction',
'fixedVerifyCode' => null,
],
];
}
Читать Исправлен код проверки
ЕСЛИ fixedVerifyCode если установлено, то капча совпадает со значением, установленным в fixedVerifyCode
// code from yiicaptchaCaptchaAction 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];
}
-1

