自定义验证规则不适用于CFormModel

时间:2013-10-29 14:43:34

标签: yii yii-events

我的前端是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 个答案:

答案 0 :(得分:1)

您的代码存在的问题是它不会返回truefalse

以下是我的一条帮助您的规则:

<?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 :(得分:0)

我遇到了同样的问题,终于解决了。希望该解决方案可以用于解决您的问题。

未调用自定义验证功能的原因是:

  1. 这是服务器端而不是客户端验证
  2. 当您单击“提交”按钮时,控制器功能首先接管该过程
  3. 如果您没有调用“$ model-&gt; validate()”
  4. ,则不会涉及自定义功能

    因此,解决方案实际上很简单:

    在控制器功能中添加“$ model-&gt; 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
        }
    }