我正在尝试编写一个规则来验证是否设置了attribute_a或attribute_b;
必须设置以下属性之一:licitatii_publice
或licitatiile_atribuite
以下代码不起作用;
<?php
namespace common\models;
use yii\base\Model;
class AbonamentValidare extends Model {
public $licitatii_publice;
public $licitatiile_atribuite;
public $zone;
public $judete;
public $tari;
public static $targetAttribute = [];
public function rules() {
return [
[['zone'], 'required'],
[['licitatii_publice', 'licitatiile_atribuite', 'tari', 'judete'], 'safe'],
['licitatii_publice', 'validate_tip_licitatie', 'targetAttribute' => ['licitatii_publice', 'licitatiile_atribuite']],
];
}
function validate_tip_licitatie($attribute, $param) {
print_r($attribute);
$this->addError($attribute, 'eroarea');
}
public function attributeLabels() {
return array(
'licitatii_publice' => 'lp',
'licitatiile_atribite' => 'la',
'tari' => 'tari',
'judete' => 'judete',
'zone' => 'zone',
);
}
public function save() {
return false;
}
}
?>
答案 0 :(得分:5)
只想更新Yii2案例的答案
在Yii2中,验证器具有skipOnEmpty
属性,默认设置为true
。这意味着如果字段为空,则不会调用自定义验证器,这可能不是必需的行为,尤其是在这种情况下,其中一个属性是必需的。为了解决此问题,我们需要将skipOnEmpty
设置为false,如下所示。
[['licitatii_publice, licitatiile_atribuite'], 'validate_tip_licitatie', 'skipOnEmpty'=> false],
答案 1 :(得分:1)
我在这样的情况下所做的就是创建这样的验证器:
................
return [
[['zone'], 'required'],
[['licitatii_publice', 'licitatiile_atribuite', 'tari', 'judete'], 'safe'],
[['licitatii_publice, licitatiile_atribuite'], 'validate_tip_licitatie'],
];
............
function validate_tip_licitatie($attribute, $param) {
if(!$this->licitatii_publice && $this->licitatiile_atribuite)
$this->addError($attribute, 'eroarea');
}
以这种方式显示两个字段都有错误。
但是我已经在Yii1中完成了这个,但是从我读到的Yii2应该是相同的。逻辑是一样的。
如果您只想为1个属性显示错误,您可以随时使用
return [
[['zone'], 'required'],
[['licitatii_publice', 'licitatiile_atribuite', 'tari', 'judete'], 'safe'],
[['licitatii_publice'], 'validate_tip_licitatie'],
];
你想要做的是更加花哨:),我明白了。如果你真的想使用targetAttribute,你可能必须这样做 https://github.com/yiisoft/yii2/blob/master/framework/validators/ExistValidator.php
只需构建自己的验证器类。
好。在阅读了存在的验证器后,我相信这正是您所需要的。它有关于如何使用它的例子。