3.1.2 - 严重 - 未处理
问题:在Model.class中save/add/addAll/delete中关于_before有逻辑不一致的问题,add里的_before是正确的,save里有顺序错误,addAll/delete里没有_before
public function save($data='',$options=array()) {
if(empty($data)) {
// 没有传递数据,获取当前数据对象的值
if(!empty($this->data)) {
$data = $this->data;
// 重置数据
$this->data = array();
}else{
$this->error = L('_DATA_TYPE_INVALID_');
return false;
}
}
// 数据处理
$data = $this->_facade($data);
// 分析表达式
$options = $this->_parseOptions($options);
if(false === $this->_before_update($data,$options)) {
return false;
}
if(!isset($options['where']) ) {
// 如果存在主键数据 则自动作为更新条件
if(isset($data[$this->getPk()])) {
$pk = $this->getPk();
$where[$pk] = $data[$pk];
$options['where'] = $where;
$pkValue = $data[$pk];
unset($data[$pk]);
}else{
// 如果没有任何更新条件则不执行
$this->error = L('_OPERATION_WRONG_');
return false;
}
}
$result = $this->db->update($data,$options);
if(false !== $result) {
if(isset($pkValue)) $data[$pk] = $pkValue;
$this->_after_update($data,$options);
}
return $result;
}
这里的:
if(false === $this->_before_update($data,$options)) {
return false;
}
应该是在
$result = $this->db->update($data,$options);
之前,这样,拦截才有意义。比如,我要加入是否附加的条件,如果加了,按现在的逻辑,主键就没有用了,会出错。
补充:
selete相关的函数也应该加上_before回调,而不是用处理where时的过滤,这样开发时就可以针对不同的操作使用不同的业务逻辑了。
