/** * 更新指定$offset的修改数据并设置到$data相应的key中 * * @param string $offset * @param array $data * @param boolean $is_all_data 是否取得完整数据 * @param boolean $renew_original_field_data 是否仅更新原始数据 */ protected function _renew_offset_changed_value(&$data, $offset, $is_all_data = false, $renew_original_field_data = false) { $config = $this->_get_offset_config($offset); if (!$config) { return; } # 虚拟字段 if ($config['is_virtual_field']) { return; } if (!isset($config['field_name'])) { return; } $field_name = $config['field_name']; if (isset($data[$field_name])) { # 已经有数据了 return; } if (!$renew_original_field_data && isset($config['read_only']) && $config['read_only']) { # 只读数据 if ($is_all_data) { $data[$field_name] = $this->_original_field_data[$field_name]; } else { return; } } $tmp_data = $this->_offset_data[$offset]; # 只有是对象的数据才处理 if (is_object($tmp_data)) { # 调用是否修改过数据的回调方法 if (true == $is_all_data) { $is_change = true; } elseif (isset($config['object']['callback']['is_change'])) { $run = $config['object']['callback']['is_change']; $is_change = $tmp_data->{$run}(); } elseif ($tmp_data instanceof OOP_ORM_Data) { $is_change = $tmp_data->__orm_callback_data_is_change_(); } else { $is_change = true; } # 没有修改 if (!$is_change) { return; } $tmp_data = OOP_ORM_Parse::get_object_field_data($tmp_data, isset($config['object']['callback']['get_data']) ? $config['object']['callback']['get_data'] : null); if (false === $tmp_data) { return; } } if (isset($config['_all_sub_offset'])) { # 含有子节点数据 foreach ($config['_all_sub_offset'] as $sub_offset) { $sub_config = $this->_get_offset_config($sub_offset); if (!$sub_config || !isset($sub_config['_sub_key_name'])) { continue; } if (isset($this->_offset_data[$sub_offset])) { $sub_data = $this->_offset_data[$sub_offset]; if (is_object($sub_data)) { # 数据是一个对象 $sub_data = OOP_ORM_Parse::get_object_field_data($sub_data, isset($sub_config['object']['callback']['get_data']) ? $sub_config['object']['callback']['get_data'] : null); } # 将子节点数据合并进来 OOP_ORM_Parse::set_sub_offset_data($tmp_data, $sub_data, explode('.', $sub_config['_sub_key_name'])); } } } # 序列化数据 if (isset($config['format'])) { $tmp_data = OOP_ORM_Parse::format_data($tmp_data, $config['format']); } if ($renew_original_field_data) { $this->_original_field_data[$field_name] = $tmp_data; } elseif (true == $is_all_data || $tmp_data !== $this->_original_field_data[$field_name]) { # 如果需要完整数据,或者数据发生修改 $data[$field_name] = $tmp_data; } }
/** * 设置根节点数据 * * @param array $sub_field * @param fixed $data * @param fixed $value * @return boolean 数据是否修改 */ public static function set_sub_offset_data(&$data, $value, array $sub_field) { $first_field = array_shift($sub_field); if ($sub_field) { if (is_object($data)) { return OOP_ORM_Parse::set_sub_offset_data($data->{$first_field}, $value, $sub_field); } else { if (!is_array($data)) { $data = array(); } return OOP_ORM_Parse::set_sub_offset_data($data[$first_field], $value, $sub_field); } } else { if (is_object($data)) { $old_data = $data->{$first_field}; $data->{$first_field} = $value; $status = $old_data === $data->{$first_field} ? false : true; } else { if (!is_array($data)) { $data = array(); } $status = $value === $data[$first_field] ? false : true; $data[$first_field] = $value; } return $status; } }