Добавляем reCAPTCHA API key
Для начала необходимо добавить reCAPTCHA API key, как это сделать, подробно описано здесь: Добавляем reCAPTCHA от Google на сайт. Опишу процесс вкратце. Открываем менеджер reCAPTCHA API по ссылке: https://www.google.com/recaptcha/admin, заполняем поля label и domains, после заполнения получим site key и secret key, которые нам понадобятся далее.
Yii framework, добавляем Google reCAPTCHA 2
Для добавления Google reCAPTCHA в Yii 1 воспользуемся расширением, скачать его можно с сайта кодер.укр или с github: github.com/dakiquang/yiiReCaptcha.
Распаковываем архив в папку /protected/extensions/yiiReCaptcha.
Подключаем расширение в основном файле настроек /protected/config/main.php в components:
<?php
return array(
//...
'components'=>array(
//...
'reCaptcha' => array(
'name' => 'reCaptcha',
'class' => 'ext.yiiReCaptcha.ReCaptcha',
'key' => '<Site key>',
'secret' => '<Secret key>',
),
),
);
Далее в моделе для которой необходимо использовать Google reCAPTCHA 2 добавляем публичную переменную $verifyCode и в метод rules добавляем правило обработки reCAPTCHA 2:
class ModelForm extends CFormModel {
//...
public $verifyCode;
public function rules() {
//...
return array(
array('verifyCode', 'required'),
array('verifyCode', 'ext.yiiReCaptcha.ReCaptchaValidator'),
);
}
}
В представлении с формой добавляем блок с reCAPTCHA 2 в нужное место:
<?php
$this->widget('ext.yiiReCaptcha.ReCaptcha', array(
'model' => $model,
'attribute' => 'verifyCode',
//'isSecureToken' => true, //для нескольких доменов
));
Пример интеграции reCAPTCHA 2 в форму
Разберем внедрение reCAPTCHA 2 в стандартную форму обратной связи. Качаем и распаковываем архив с расширением, добавляем расширение в файл настроек /protected/config/main.php, в итоге файл примет вид (основные изменения в строке 39-44):
<?php
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web Application',
'preload'=>array('log'),
'import'=>array(
'application.models.*',
'application.components.*',
),
'modules'=>array(
),
'components'=>array(
'user'=>array(
'allowAutoLogin'=>true,
),
'db'=>require(dirname(__FILE__).'/database.php'),
'errorHandler'=>array(
'errorAction'=>YII_DEBUG ? null : 'site/error',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
),
),
'reCaptcha' => array(
'name' => 'reCaptcha',
'class' => 'ext.yiiReCaptcha.ReCaptcha',
'key' => '6LcIzBQUAAAAAH4D5uZJp1K7LM1Pngivb3uwjGZE',
'secret' => '6LcIzBQUAAAAAOf-zvcg9pkclzSjNyym5tvL1lWA',
),
),
'params'=>array(
'adminEmail'=>'webmaster@example.com',
),
);
Редактируем модель формы обратной связи, в стандартной форме уже есть переменная для капчи, остается удалить или закомментировать старое правило валидации капчи и добавить новое. Файл /protected/models/ContactForm.php примет вид (строка 18-19):
<?php
class ContactForm extends CFormModel
{
public $name;
public $email;
public $subject;
public $body;
public $verifyCode;
public function rules()
{
return array(
array('name, email, subject, body', 'required'),
array('email', 'email'),
//array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),
array('verifyCode', 'required'),
array('verifyCode', 'ext.yiiReCaptcha.ReCaptchaValidator'),
);
}
public function attributeLabels()
{
return array(
'verifyCode'=>'Verification Code',
);
}
}
Добавляем в представление блок с reCAPTCHA 2 и удаляем блок со старой капчей. Файл /protected/views/site/contact.php (строка 58-63):
<?php
$this->pageTitle=Yii::app()->name . ' - Contact Us';
$this->breadcrumbs=array(
'Contact',
);
?>
<h1>Contact Us</h1>
<?php if(Yii::app()->user->hasFlash('contact')): ?>
<div class="flash-success">
<?php echo Yii::app()->user->getFlash('contact'); ?>
</div>
<?php else: ?>
<p>
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
</p>
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'contact-form',
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'name'); ?>
<?php echo $form->textField($model,'name'); ?>
<?php echo $form->error($model,'name'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'email'); ?>
<?php echo $form->textField($model,'email'); ?>
<?php echo $form->error($model,'email'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'subject'); ?>
<?php echo $form->textField($model,'subject',array('size'=>60,'maxlength'=>128)); ?>
<?php echo $form->error($model,'subject'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'body'); ?>
<?php echo $form->textArea($model,'body',array('rows'=>6, 'cols'=>50)); ?>
<?php echo $form->error($model,'body'); ?>
</div>
<?php
$this->widget('ext.yiiReCaptcha.ReCaptcha', array(
'model' => $model,
'attribute' => 'verifyCode',
));
?>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
<?php endif; ?>
Результат:
devreadwrite.com


Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Спасибо, все работает, есть еще один нюанс как вывести ошибку если пользователь не прошел каптчу, спасибо.
ОтветитьЕсли капча не прошла, то получите текст:
Please fix the following input errors:
- Verification Code cannot be blank.
- The verification code is incorrect.
Текст зависит от языка сайта.
А отдельно можно вывести так:
$model->getError('verifyCode')ОтветитьОтлично, все работает. Надо попробовать добавить еще во всплывающее окно, посмотреть что будет
ОтветитьЗдравствуйте, а подскажите, как можно провести валмдацию такой каптчи без модели?
ОтветитьДобрый вечер. Сделайте как описано здесь: Добавляем reCAPTCHA от Google на сайт
ОтветитьСделала все как в статье, капча появилась функционирует, но не работает, регистрация проходит без капчи. Кто что подскажет??
ОтветитьРазобрался)) спасибо. Автор Красава
ОтветитьПодскажите, пожалуйста, что Вы сделали? У меня тоже регистрация проходит без капчи.
Ответитьспасибо!
ОтветитьСпасибо, всё с первого раза заработало!
Ответитьа если у меня не модель а ajaxcontroller?
ОтветитьСупер
Ответить