考虑我有这样的事情:
class Dummy extends yii\base\Model {
public $a;
public $b;
public function rules() {
return [ ??? ];
}
}
如何同时考虑属性$ a和$ b来创建验证规则?想象一下,$ a或$ b或两者都应该有一个值。如果它们都没有设置,我想得到一个单独的验证错误,例如'要么a或b必须设置'。我认为when property在这里没有帮助(我可以创建每个属性的条件,分别检查其他属性,但这会产生两个验证错误。)
上面的例子很简单。但它可能要复杂得多,也要依赖其他东西。
由于Model::addError()需要一个属性,我似乎无法做到这一点。错误取决于属性。那么我怎样才能验证整个对象,例如找出模型对象是否可以使用其当前值保存。是否有任何类型的验证在属性验证之上?更高级别的验证?
答案 0 :(得分:0)
我相信您需要的是自定义验证规则:
public function rules()
{
return [
[['a', 'b', 'c'], 'myCustomRule'],
];
}
public function myCustomRule($attribute)
{
if(!$this->a && !$this->b && !$this->c) {
$this->addError($attribute, "One of these attributes is required: a, b, c");
}
}
答案 1 :(得分:0)
根据guide,可以将*
作为属性传递给addError($attribute, $error)。但是,由于消息未绑定到现有属性,因此消息需要与errorSummary()一起显示为ActiveForm的一部分。
模型中的规则
public function rules() {
return [
[['a', 'b'], 'validateAandB'],
];
}
验证方法:
public function validateAandB($attribute, $params) {
$this->addError('*', 'a and/or b should have a value.');
}
以表格形式:
<?php $form = ActiveForm::begin(); ?>
<?= $form->errorSummary($model) ?>
<?= $form->field($model, 'a') ?>
<?= $form->field($model, '') ?>
<?= Html::submitButton('Submit', ['class' => 'btn btn-success']) ?>
<?php ActiveForm::end(); ?>
实际上,不需要使用*
,任何字符串都可以。如果它是属性的名称,则会在输入和摘要附近显示验证错误,否则它仅显示在摘要中(摘要不显示属性的名称,只显示错误消息)。
注意,由于两个属性的验证发生,因此消息会被添加两次。但是,由于它是以相同的名称添加的(此处为:*
),默认情况下,只显示属性的第一条消息,它只会显示一次。