【问题标题】:Trigger validation error in related model在相关模型中触发验证错误
【发布时间】:2015-04-05 20:45:06
【问题描述】:

我在 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

我认为这是因为它在我的模型中寻找属性“user”,而不是向“$user”对象添加错误。

我怎样才能最好地做到这一点?

我有 .NET 背景,所以我可能在这里加载错误。

【问题讨论】:

  • 检查 yii unique 验证规则。 array('email', 'unique', 'message'=&gt;'{attribute} already exist.')
  • @harmed:我不是要针对数据库模型进行验证,而是在保存之前验证当前模型。用户可以一次注册多个参赛者,每个参赛者都有自己的电子邮件,这就是我要验证的内容,并显示验证错误消息。
  • “保存前”并不完全正确。在将数据保存到用户会话并继续下一步之前。保存到数据库发生在后面的步骤。

标签: php validation yii


【解决方案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() 方法,因此不会将任何记录保存到您的数据库中。

【讨论】:

  • 我已经设置了数据库约束来防止它发生,但是我想在前面的步骤中通知用户他们的输入无效。当前步骤仅将数据保存到会话中。
猜你喜欢
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多