Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 覆盖yii中的重复验证规则_Php_Yii - Fatal编程技术网

Php 覆盖yii中的重复验证规则

Php 覆盖yii中的重复验证规则,php,yii,Php,Yii,plz我有一些我不想在代码中更改的规则函数(数据库中的BaseModel) 我让其他规则在模型中起作用,我想在其中改变 最基本的一个“不想改变” 我想改变模型中继承自基础模型的其他函数 这是它的代码 public function rules() { $rules = array( array('start_date, end_date, type_id', 'length', 'max'=>16), );

plz我有一些我不想在代码中更改的规则函数(数据库中的BaseModel) 我让其他规则在模型中起作用,我想在其中改变

最基本的一个“不想改变”

我想改变模型中继承自基础模型的其他函数 这是它的代码

public function rules()
    {
        $rules = array(
                    array('start_date, end_date, type_id', 'length', 'max'=>16),
        );
        return array_merge($rules,parent::rules());

    }
问题是它使用的最大值是10,而不是16 我想要16个 即使我最后一句话

    return array_merge(parent::rules(),$rules);

它可能不起作用的原因是
'max'=>10
的规则仍然存在于
rules()
中,而与顺序无关。替换规则对我来说很有效

public function rules(){
    $rules=parent::rules();
    $rules[1]=array('start_date, end_date, type_id', 'length', 'max'=>16);
    return $rules;
}
编辑

要使用“开始日期、结束日期”替换规则,请键入“\u id”作为“键”,您需要一个递归:


这将检查现有规则,如果不存在,则将该规则添加为
$rules
的最后一个元素。如果有人编辑基类中的第一个元素,例如向规则添加新属性/字段,则此操作无效。

刚刚完成相同的任务,创建了一个合并帮助器函数:

public function mergeRules($parent, $rules)
{
    // creating curent rules map
    $rulesMap = [];
    foreach ($rules as $rule) {
        $validator = $rule[1];
        $attributes = array_map('trim', explode(',', $rule[0]));
        if (!isset($rulesMap[$validator])) {
            $rulesMap[$validator] = [];
        }
        $rulesMap[$validator] = CMap::mergeArray($rulesMap[$validator], $attributes);
    }

    // checking for attributes in parent rules against created rule map
    if (!empty($rulesMap)) {
        foreach ($parent as $i => $rule) {
            $validator = $rule[1];
            if (empty($rulesMap[$validator])) {
                continue;
            }
            $attributes = array_map('trim', explode(',', $rule[0]));
            foreach ($attributes as $k => $attribute) {
                if (in_array($attribute, $rulesMap[$validator])) {
                    unset($attributes[$k]);
                }
            }
            // unset if we got inherited rule of same validator
            if (empty($attributes)) {
                unset($parent[$i]);
            } else {
                $parent[$i][0] = implode(', ', $attributes);
            }
        }
    }

    return array_merge($parent, $rules);
}
然后在rules()函数中调用:

public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.

    $rules = array(
        blablabla...
    );

    return $this->mergeRules(parent::rules(), $rules);

}

一种方法是给你的规则一把钥匙

在您的情况下,您可以在父类中执行此操作:-

public function rules() {
        return array(
            'requiredArray' => array('start_date, end_date, info, type_id', 'required'),

            'maxLengthArray' => array('start_date, end_date, type_id', 'length', 'max'=>10),

    }
在你的孩子班上:-

public function rules()
{
    $parent = parent::rules();
    $rules = array(
        'maxLengthArray' => array('start_date, end_date, type_id', 'length', 'max'=>16)
    );
    unset($parent['maxLengthArray']);
    
    return array_merge($parent,$rules);

}
编辑:

请记住,如果只想更新“maxLengthArray”中的“一个”属性。。。在父级“unset”之后,必须重新应用其他项(显然:)

例如:- 仅更改类型id长度。。。孩子看起来像:-

public function rules()
{
    $parent = parent::rules();
    $rules = array(
        'maxLengthArray' => array('start_date, end_date', 'length', 'max'=>10),
        'typeIdLength' => array('type_id', 'length', 'max'=>16),

    );
    unset($parent['maxLengthArray']);

    return array_merge($parent,$rules);

}

谢谢,但我希望替换基于键(开始日期、结束日期、键入id),而不是它们的id(1),因为在代码中之后可能会更改,这可能吗?
public function rules() {
        return array(
            'requiredArray' => array('start_date, end_date, info, type_id', 'required'),

            'maxLengthArray' => array('start_date, end_date, type_id', 'length', 'max'=>10),

    }
public function rules()
{
    $parent = parent::rules();
    $rules = array(
        'maxLengthArray' => array('start_date, end_date, type_id', 'length', 'max'=>16)
    );
    unset($parent['maxLengthArray']);
    
    return array_merge($parent,$rules);

}
public function rules()
{
    $parent = parent::rules();
    $rules = array(
        'maxLengthArray' => array('start_date, end_date', 'length', 'max'=>10),
        'typeIdLength' => array('type_id', 'length', 'max'=>16),

    );
    unset($parent['maxLengthArray']);

    return array_merge($parent,$rules);

}