Пользовательское правило проверки не работает для CFormModel
Мой фронтенд Php Yii. Я пытаюсь создать пользовательское правило проверки, которое проверяет, существует ли имя пользователя в базе данных.
У меня нет прямого доступа к базе данных. Я должен использовать RestClient для связи с базой данных. Моя проблема в том, что пользовательское правило проверки не работает с моей CFormModel.
Вот мой код:
public function rules()
{
return array(
array('name', 'length', 'max' => 255),
array('nickname','match','pattern'=> '/^([a-zA-Z0-9_-])+$/' )
array('nickname','alreadyexists'),
);
}
public function alreadyexists($attribute, $params)
{
$result = ProviderUtil::CheckProviderByNickName($this->nickname);
if($result==-1)
{
$this->addError($attribute,
'This Provider handler already exists. Please try with a different one.');
}
Это, кажется, не работает вообще, я также попробовал это:
public function alreadyexists($attribute, $params)
{
$this->addError($attribute,
'This Provider handler already exists. Please try with a different one.');
}
Даже тогда это не похоже на работу. Что я здесь не так делаю?
2 ответа
Проблема с вашим кодом в том, что он не возвращается true
или же false
,
Вот одно из моих правил, чтобы помочь вам:
<?php
....
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('title, link', 'required'),
array('title, link', 'length', 'max' => 45),
array('description', 'length', 'max' => 200),
array('sections','atleast_three'),
);
}
public function atleast_three()
{
if(count($this->sections) < 3)
{
$this->addError('sections','chose 3 at least.');
return false;
}
return true;
}
...
?>
Я встретил ту же самую проблему и наконец решил ее. Надеемся, что решение может быть полезным для решения вашей проблемы.
Причины, по которым настраиваемая функция проверки не вызывается:
- это проверка на стороне сервера, а не на стороне клиента
- когда вы нажимаете кнопку "отправить", функция контроллера сначала берет на себя процесс
- настроенная функция не будет задействована, если вы не вызвали "$model->validate()"
Поэтому решение на самом деле простое:
Добавьте "$model->validate()" в функцию контроллера. Вот мой код:
"Valid.php":
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'alloc-form',
'enableClientValidation'=>true,
'clientOptions'=>array('validateOnSubmit'=>true,),
)); ?>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'valid_field'); ?>
<?php echo $form->textField($model,'valid_field'); ?>
<?php echo $form->error($model,'valid_field'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget(); ?>
"ValidForm.php":
class ValidForm extends CFormModel
{
public $valid_field;
public function rules()
{
return array(
array('valid_field', 'customValidation'),
);
}
public function customValidation($attribute,$params)
{
$this->addError($attribute,'bla');
}
}
"SiteController.php"
public function actionValid()
{
$model = new ValidForm;
if(isset($_POST['AllocationForm']))
{
// "customValidation" function won't be called unless this part is added
if($model->validate())
{
// do something
}
// do something
}
}