Example #1
0
 /**
  * 修改联系人
  * @param Contact $contact
  * @param string $mode
  */
 public function edit($gid, Contact $contact, $mode = 'default')
 {
     return $this->group_contact_mapper->update($gid, $contact, $mode);
 }
Example #2
0
 /**
  * 修改联系人,返回结果和最后一次修改时间
  * @param int $user_id 用户ID
  * @param int $id 联系人ID
  * @param array $data 联系人数组
  * @param string $mode    修改模式 default、overwrite、special
  * @return array FAIL 修改失败 SUCCESS 修改成功 CONFLICT 冲突 MERGE_SUCCESS 合并成功
  */
 public function edit($user_id, $id, $data, $mode = 'default')
 {
     $contact = Contact_Helper::array_to_contact($data, $this->get_country_code($user_id));
     $contact->set_user_id($user_id)->set_id($id)->set_source($this->get_source_name());
     $old_contact = $this->get($user_id, $id);
     $result = FAIL;
     //联系人不存在或在回收站中
     if ($old_contact === FALSE) {
         $result = CONFLICT;
     } else {
         $to_update = FALSE;
         $is_append = FALSE;
         switch ($mode) {
             case 'overwrite':
                 //覆盖模式,检查联系人是否变更
                 $status = $old_contact->compare($contact);
                 if ($status) {
                     $result = NO_MODIFY_MERGE_SUCCESS;
                 } else {
                     $to_update = TRUE;
                 }
                 break;
             case 'special':
                 //检查联系人是否变更
                 $status = $old_contact->compare_special($contact);
                 if ($status) {
                     $result = NO_MODIFY_MERGE_SUCCESS;
                 } else {
                     $to_update = TRUE;
                 }
                 break;
             default:
                 $status = $old_contact->compare($contact);
                 if ($status) {
                     $result = NO_MODIFY_MERGE_SUCCESS;
                 } else {
                     $modified_at = $old_contact->get_modified_at() ? $old_contact->get_modified_at() : $old_contact->get_created_at();
                     if ($modified_at == $contact->get_modified_at()) {
                         $to_update = TRUE;
                     } else {
                         $status = $old_contact->merge($contact, $is_append);
                         if ($status === FALSE) {
                             $result = CONFLICT;
                         } elseif ($is_append == FALSE) {
                             $result = NO_MODIFY_MERGE_SUCCESS;
                         } else {
                             //合并成功设置更新来源
                             $old_contact->set_source($contact->get_source());
                             $to_update = TRUE;
                         }
                     }
                 }
                 break;
         }
         if ($to_update === TRUE) {
             //保存快照,同时放入回收站
             if ($this->save_snapshot($user_id) and $this->contact_mapper->move_update_contact_to_recycle($user_id, $id, $this->source)) {
                 //切换默认模式到覆盖模式
                 $mode = $mode === 'default' ? 'overwrite' : $mode;
                 if (!$is_append) {
                     $result = $this->contact_mapper->update($contact, $mode);
                 } else {
                     $result = $this->contact_mapper->update($old_contact, 'overwrite');
                 }
             }
         }
         //清除联系人列表缓存
         if ($result == SUCCESS or $result == MERGE_SUCCESS) {
             $this->prepare_task($user_id, array(), (array) $id);
         } elseif ($result == NO_MODIFY_MERGE_SUCCESS) {
             $contact->set_created_at($old_contact->get_created_at())->set_modified_at($old_contact->get_modified_at());
         }
     }
     return array('result' => $result, 'modified_at' => $contact->get_modified_at());
 }