Да, вопрос интересный. Я довольно давно решил так:
// Добавить в rules() :
array('verifyCode', 'captcha', 'on'=>'insert'),
array('verifyCode', 'activeCaptcha', 'on'=>'active'), // Во время AJAX запроса не забудьте установить сценарий для модели
public function activeCaptcha()
{
$code = Yii::app()->controller->createAction('captcha')->verifyCode;
if ($code != $this->verifyCode)
$this->addError('verifyCode', 'Неправильный код проверки.');
}
Сейчас уже не вспомню результатов моих исследований исходного кода капчи, но пришел я к этому варианту, и он работает
Доработав валидатор activeCaptcha получил следующее:
public function activeCaptcha() {
$code = Yii::app()->controller->createAction('captcha')->getVerifyCode();
if ($code != $this->verifyCode)
$this->addError('verifyCode', 'Неправильный код проверки.');
if (!(isset($_POST['ajax']) && $_POST['ajax']==='user-form'))
Yii::app()->controller->createAction('captcha')->getVerifyCode(true);
}
Теперь при каждой валидации проверяется, совпадает ли код проверки с введенным пользователем,
а если запрос поступил от активной формы посредством AJAX, то код после этого не обновляется!
Итого: имеем капчу, которая может правильно работать в активных формах с AJAX валмдацией.