2013-11-11 4 views
0

У меня есть стандартная модель LoginForm, в которой используется CAPTCHA для входа. Во всяком случае, на какой-то странице мне нужно войти без переписки. Для этого я добавил public $useCaptcha = true;. Когда это false, CAPTCHA не нужно. Я также добавил одно правило:Yii - rule allowEmpty для модели

array('verifyCode', 'captcha', 'allowEmpty'=>!Yii::app()->user->isGuest || !CCaptcha::checkRequirements() || !$this->useCaptcha) 

Но мое правило не работает. Это всегда возвращает false. В решении я использовать beforeValidation функцию:

protected function beforeValidate() 
{ 
    if(!$this->useCaptcha) 
    { 
     $this->getValidators()[4]->allowEmpty = true; 
    } 
    return true; 
} 

Но это не хорошее решение. Почему allowEmpty правило возвращается false?

+0

Вы использовали сценарии, например on => login empty => true – Gunnit

+0

@Gunnit, когда я использую 'array ('verifyCode', 'captcha', 'on' => 'useCaptcha')' вместо правила в верхней части - Я всегда получаю ошибку - «Код подтверждения неверен». Для заданного сценария я использую 'protected function beforeValidate() { if ($ this-> useCaptcha) { $ this-> setScenario ('useCaptcha'); } return true; } ' – f0rtis

+0

попробуйте взглянуть на это => http://www.yiiframework.com/forum/index.php/topic/21561-captcha-custom-validation/, я думаю, что это похоже на вашу проблему. – Gunnit

ответ

0

«public $ useCaptcha = true» - это класс переменной, вам нужно установить для него один валидатор!

Например. Добавьте это правило:

array('useCaptcha', 'safe', 'on'=>''), 

После этого вы сможете изменить значение «$ this-> useCpatcha».

Смежные вопросы