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