Yii2:使用OR无效的多个属性的自定义验证

时间:2014-06-18 11:17:03

标签: php yii2

我正在尝试编写一个规则来验证是否设置了attribute_a或attribute_b;

必须设置以下属性之一:licitatii_publicelicitatiile_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;
    }

}

?>

2 个答案:

答案 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

只需构建自己的验证器类。

好。在阅读了存在的验证器后,我相信这正是您所需要的。它有关于如何使用它的例子。