0

plz我有一些我不想在其代码中更改的规则函数(来自数据库的BaseModel)并且我在模型中创建了其他规则函数,我想更改它

基础的“不要改变”

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

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

    }

我想更改从基本模型继承的模型中的其他功能,这是它的代码

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);
4

3 回答 3

0

它可能不起作用的原因是无论顺序如何,规则'max'=>10仍然存在。rules()替换规则对我有用。

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

编辑

要使用“键”替换规则'start_date, end_date, type_id',您需要递归数组搜索

public function rules(){
    $rules=parent::rules();
    $index=0;//index of the rule
    outer: foreach($rules as $rule){
        if(array_search('start_date, end_date, type_id',$rule)!==false)
             break outer;
        $index++;
    }
    $rules[$index]=array('start_date, end_date, type_id', 'length', 'max'=>16);
    return $rules;
}

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

于 2013-01-27T22:27:01.630 回答
0

刚刚完成了同样的任务,创建了一个合并辅助函数:

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);

}
于 2017-11-22T16:30:22.087 回答
0

一种方法是给你的规则一个键。

文档

Note: It is handy to give names to rules i.e.

public function rules()
{
    return [
        // ...
        'password' => [['password'], 'string', 'max' => 60],
    ];
}

You can use it in a child model:

public function rules()
{
    $rules = parent::rules();
    unset($rules['password']);
    return $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' 中的 'one' 属性...其他属性必须在从父级“取消设置”后重新应用(显然 :))。

例如:- 仅更改 type_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);

}
于 2021-06-09T01:29:58.017 回答