我在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背景,所以我可能在这里做错了。
答案 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()
方法将被调用,因此不会将任何记录保存到您的数据库中。