/** * 更新指定$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; } }