Пользовательское правило проверки не работает для 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;
    }

...

?>

Я встретил ту же самую проблему и наконец решил ее. Надеемся, что решение может быть полезным для решения вашей проблемы.

Причины, по которым настраиваемая функция проверки не вызывается:

  1. это проверка на стороне сервера, а не на стороне клиента
  2. когда вы нажимаете кнопку "отправить", функция контроллера сначала берет на себя процесс
  3. настроенная функция не будет задействована, если вы не вызвали "$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
    }
}
Другие вопросы по тегам