相关模型中的触发验证错误

时间:2015-04-05 20:45:06

标签: php validation yii

我在Yii中有一个包含另一个模型类型数组的模型。然后,我试图验证表格中没有填写重复的电子邮件,您可以同时填写n个人。

我目前的做法是触发"外部"的自定义验证。但是,在视图中无法访问该模型的模型,只有参与者的数组是,如果我然后在"外部"模型,它不会显示给用户。因此,我想为违反规则的第一个参赛者触发它,但我该怎么做呢?

我尝试此操作的代码到目前为止看起来像这样:

/*
 * Custom validation rule to hinder the same e-mail being used twice.
 */
public function noRepeatingEmails($attribute, $params)
{
  if (!isset($attribute)) return;

  $emails = array();
  foreach($this->$attribute as $user)
  {
    if (isset($user) && strlen(trim($user->email)) != 0)
    {
      $emailToAdd = strtolower(trim($user->email));
      if (in_array($emailToAdd, $emails))
      {
        $this->addError($user, '<my error message>');
        return;
      }
      else
      {
        $emails[] = $emailToAdd;
      }
    }      
  }
}

这只会导致代码500错误:

Illegal offset type

我认为这是因为它正在寻找财产&#34;用户&#34;在我的模型中,而不是向&#34; $ user&#34;添加错误。对象

我如何才能最好地完成这项工作?

我有一个.NET背景,所以我可能在这里做错了。

1 个答案:

答案 0 :(得分:1)

如果我从您的评论中理解正确,您希望在保存之前验证您的模型。为此,CActiveRecord提供了beforeSave()方法。您需要将此方法放在模型中:

protected function beforeSave()
    {
        if(parent::beforeSave())
        {
            if(/* Your validation goes here*/)
                return true;
            else
                return false
        }
        else
            return false;
    }

当此方法的结果为true时,将调用save()方法。否则,save()方法将被调用,因此不会将任何记录保存到您的数据库中。