示例#1
0
 /**
  * 更新指定$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;
     }
 }