2

我的前端是 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.');

}

即使那样,它似乎也不起作用。我在这里做错了什么?

4

2 回答 2

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;
    }

...

?>
于 2013-10-29T14:59:53.327 回答
0

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

没有调用自定义验证函数的原因是:

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

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

在控制器函数中添加“$model->validate()”。这是我的代码:

“有效的.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');
    }
}

“站点控制器.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
    }
}
于 2014-06-17T07:03:39.287 回答