Добавляем CAPTCHA к форме

В Yii есть специальный виджет CCaptcha, позволяющий добавить проверочную
картинку-тест на страницу.

Покажем настройку CAPTCHA на примере стандартного блога:
PostController::actionShow выводит форму добавления комментария используя модель
Comment. Отображение для формы хранится в _form.php.

В отображение формы _form.php добавляем:

<?if(CCaptcha::checkRequirements() && Yii::app()->user->isGuest):?>
    <?=CHtml::activeLabelEx($model, 'verifyCode')?>
    <?$this->widget('CCaptcha')?>
    <?=CHtml::activeTextField($model, 'verifyCode')?>
<?endif?>

Здесь $model — модель, которая используется в форме. Авторизованным пользователям
картинку с кодом не показываем.

В модель добавляем:

class Comment extends CActiveRecord {
    // результат проверки
    public $verifyCode;
    
    function rules(){
        return array(
            array(
                'verifyCode',
                'captcha',
                // авторизованным пользователям код можно не вводить
                'allowEmpty'=>!Yii::app()->user->isGuest || !CCaptcha::checkRequirements(),
            ),
        );
    }
    
    function attributeLabels(){
        return array(
            'verifyCode' => 'Код проверки',
        );
    }
}

В контроллер, который выводит форму, добавляем:

class PostController extends CController {
    public function filters() {
        return array(
            'accessControl',
        );
    }
    
    public function accessRules() {
        return array(
            // если используется проверка прав, не забывайте разрешить доступ к
            // действию, отвечающему за генерацию изображения
            array('allow',
                'actions'=>array('captcha'),
                'users'=>array('*'),
            ),
            array('deny',
                'users'=>array('*'),
            ),
        );
    }

    public function actions(){
        return array(
            'captcha'=>array(
                'class'=>'CCaptchaAction',
            ),
        );
    }
}

Стоит изучить