public function rules()
{
return array(
// array('username, email', 'required'), // Remove these fields from required!!
array('email', 'email'),
array('username, email', 'my_equired'), // do it below any validation of username and email field
);
}
public function my_required($attribute_name, $params)
{
if (empty($this->username)
&& empty($this->email)
) {
$this->addError($attribute_name, Yii::t('user', 'At least 1 of the field must be filled up properly'));
return false;
}
return true;
}
class CustomModel extends CFormModel
{
public $username;
public $email;
private $_addOtherOneOfTwoValidationError = true;
public function rules()
{
return array(
array('username, email', 'requiredOneOfTwo'),
);
}
public function requiredOneOfTwo($attribute, $params)
{
if(empty($this->username) && empty($this->email))
{
// if error is not already added to model, add it!
if($this->_addOtherOneOfTwoValidationError)
{
$this->addErrors(array('Please enter your username or emailId.'));
// after first error adding, make error addition impossible
$this->_addOtherOneOfTwoValidationError = false;
}
return false;
}
return true;
}
}
protected function customRules()
{
return [
[['name', 'surname', 'phone'], 'compositeRequired', 'skipOnEmpty' => false,],
];
}
public function compositeRequired($attribute_name, $params)
{
if (empty($this->name)
&& empty($this->surname)
&& empty($this->phone)
) {
$this->addError($attribute_name, Yii::t('error', 'At least 1 of the field must be filled up properly'));
return false;
}
return true;
}
9条答案
按热度按时间nfs0ujit1#
我今天也在尝试解决同样的问题。我得到的是下面的代码。
一般的想法是将“required”验证移到自定义的my_required()方法中,该方法可以检查是否有任何字段被填充。
我看到这篇文章是从2011年,但我找不到任何其他的解决方案。我希望它能为您或其他在未来的工作。
请慢用
neskvpey2#
类似这样的东西更通用,可以重用。
q0qdq0h23#
一二
在建模中:
dffbzjpn4#
我不认为有一个预定义的规则,将工作在这种情况下,但它会很容易定义自己的用户名和密码字段的规则是“如果空($username . $password){ return error }”-您可能需要检查的最小长度或其他字段级别的要求。
hiz5n14c5#
这对我很有效:
zpqajqem6#
您可以使用模型类内的私有属性来防止两次显示错误(不要将错误分配给模型的属性,而只添加到模型而不指定它):
9gm1akwq7#
别忘了“skipOnEmpty”属性。它花了我几个小时。
axkjgtzd8#
益一
当然,它可以优化,但可能会帮助某些人
w1e3prcc9#
一