• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
  • Класс: BitrixImOpenLinesChat
  • Вызов: Chat::updateFieldData
public function updateFieldData($fields)
{
	$result = new Result;
	$updateDate = [];

	if(!$this->isDataLoaded())
	{
		$result->addError(new Error(Loc::getMessage('IMOL_CHAT_ERROR_NOT_LOAD_DATA'), 'IMOL_CHAT_ERROR_NOT_LOAD_DATA', __METHOD__, ['chat' => $this->chat]));
	}

	if($result->isSuccess() && is_array($fields))
	{
		foreach ($fields as $fieldType => $fieldData)
		{
			if (in_array($fieldType, [self::FIELD_CRM, self::FIELD_SESSION, self::FIELD_LIVECHAT]) && !empty($fieldData))
			{
				if ($fieldType == self::FIELD_SESSION)
				{
					$data = self::getFieldData($fieldType);
					if (isset($fieldData['CRM']))
					{
						$data['CRM'] = $fieldData['CRM'];
					}
					if (isset($fieldData['CRM_ENTITY_TYPE']))
					{
						$data['CRM_ENTITY_TYPE'] = $fieldData['CRM_ENTITY_TYPE'];
					}
					if (isset($fieldData['CRM_ENTITY_ID']))
					{
						$data['CRM_ENTITY_ID'] = $fieldData['CRM_ENTITY_ID'];
					}
					if (isset($fieldData['PAUSE']))
					{
						$data['PAUSE'] = $fieldData['PAUSE'];
					}
					if (isset($fieldData['WAIT_ACTION']))
					{
						$data['WAIT_ACTION'] = $fieldData['WAIT_ACTION'];
					}
					if (isset($fieldData['ID']))
					{
						$data['ID'] = $fieldData['ID'];
					}
					if (isset($fieldData['DATE_CREATE']))
					{
						$data['DATE_CREATE'] = $fieldData['DATE_CREATE'] instanceof DateTime? $fieldData['DATE_CREATE']->getTimestamp(): intval($fieldData['DATE_CREATE']);
					}
					if (isset($fieldData['LINE_ID']) && intval($fieldData['LINE_ID']) > 0)
					{
						$data['LINE_ID'] = intval($fieldData['LINE_ID']);
					}
					if (isset($fieldData['BLOCK_DATE']))
					{
						$data['BLOCK_DATE'] = $fieldData['BLOCK_DATE'] instanceof DateTime? $fieldData['BLOCK_DATE']->getTimestamp(): (int)$fieldData['BLOCK_DATE'];
					}
					if (isset($fieldData['BLOCK_REASON']))
					{
						$data['BLOCK_REASON'] = $fieldData['BLOCK_REASON'];
					}

					$this->chat[self::getFieldName($fieldType)] = $data['CRM'].'|'
																.$data['CRM_ENTITY_TYPE'].'|'
																.$data['CRM_ENTITY_ID'].'|'
																.$data['PAUSE'].'|'
																.$data['WAIT_ACTION'].'|'
																.$data['ID'].'|'
																.$data['DATE_CREATE'].'|'
																.$data['LINE_ID'].'|'
																.$data['BLOCK_DATE'].'|'
																.$data['BLOCK_REASON'];

					$updateDate[self::getFieldName($fieldType)] = $this->chat[self::getFieldName($fieldType)];
				}
				else if ($fieldType == self::FIELD_CRM)
				{
					$strungData = '';
					$data = self::getFieldData($fieldType);
					if (isset($fieldData['LEAD']))
					{
						$data['LEAD'] = $fieldData['LEAD'];
					}
					if (isset($fieldData['COMPANY']))
					{
						$data['COMPANY'] = $fieldData['COMPANY'];
					}
					if (isset($fieldData['CONTACT']))
					{
						$data['CONTACT'] = $fieldData['CONTACT'];
					}
					if (isset($fieldData['DEAL']))
					{
						$data['DEAL'] = $fieldData['DEAL'];
					}

					foreach ($data as $type => $value)
					{
						if(!empty($strungData))
							$strungData .= '|';

						$strungData .= $type . '|' . $value;
					}

					if(!empty($strungData))
					{
						$updateDate[self::getFieldName($fieldType)] = $this->chat[self::getFieldName($fieldType)] = $strungData;
					}
				}
				elseif ($fieldType == self::FIELD_LIVECHAT)
				{
					$data = self::getFieldData($fieldType);
					if (isset($fieldData['READED']))
					{
						$data['READED'] = $fieldData['READED'];
					}
					if (isset($fieldData['READED_ID']))
					{
						$data['READED_ID'] = intval($fieldData['READED_ID']);
					}
					if (isset($fieldData['READED_TIME']))
					{
						$data['READED_TIME'] = $fieldData['READED_TIME'] instanceof DateTime? date('c', $fieldData['READED_TIME']->getTimestamp()): false;
					}
					if (isset($fieldData['SESSION_ID']))
					{
						$data['SESSION_ID'] = intval($fieldData['SESSION_ID']);
					}
					if (isset($fieldData['SHOW_FORM']))
					{
						$data['SHOW_FORM'] = $fieldData['SHOW_FORM'] == 'N'? 'N': 'Y';
					}
					if (isset($fieldData['WELCOME_FORM_NEEDED']))
					{
						$data['WELCOME_FORM_NEEDED'] = $fieldData['WELCOME_FORM_NEEDED'] === 'N'? 'N': 'Y';
					}
					if (isset($fieldData['WELCOME_TEXT_SENT']))
					{
						$data['WELCOME_TEXT_SENT'] = $fieldData['WELCOME_TEXT_SENT'] === 'N'? 'N': 'Y';
					}
					$this->chat[self::getFieldName($fieldType)] = $data['READED'].'|'
																.$data['READED_ID'].'|'
																.$data['READED_TIME'].'|'
																.$data['SESSION_ID'].'|'
																.$data['SHOW_FORM'].'|'
																.$data['WELCOME_FORM_NEEDED'].'|'
																.$data['WELCOME_TEXT_SENT'];
					$updateDate[self::getFieldName($fieldType)] = $this->chat[self::getFieldName($fieldType)];
				}
			}
		}
	}

	if($result->isSuccess() && empty($updateDate))
	{
		$result->addError(new Error(Loc::getMessage('IMOL_CRM_ERROR_NOT_GIVEN_CORRECT_DATA'), self::IMOL_CRM_ERROR_NOT_GIVEN_CORRECT_DATA, __METHOD__));
	}

	if($result->isSuccess())
	{
		$rawUpdate = ChatTable::update($this->chat['ID'], $updateDate);

		if(!$rawUpdate->isSuccess())
		{
			$result->addErrors($rawUpdate->getErrors());
		}
	}

	if($result->isSuccess())
	{
		$users = [];
		$relationList = RelationTable::getList([
			"select" => array("ID", "USER_ID", "EXTERNAL_AUTH_ID" => "USER.EXTERNAL_AUTH_ID"),
			"filter" => array(
				"=CHAT_ID" => $this->chat['ID']
			)
		]);
		while ($relation = $relationList->fetch())
		{
			if (
				!User::getInstance($relation['USER_ID'])->isBot() &&
				!User::getInstance($relation['USER_ID'])->isNetwork() &&
				(isset($fields[self::FIELD_LIVECHAT]) || !User::getInstance($relation['USER_ID'])->isConnector())
			)
			{
				CIMContactList::CleanChatCache($relation['USER_ID']);
				$users[] = $relation['USER_ID'];
			}
		}

		if (!empty($users))
		{
			if (isset($updateDate['NAME']))
			{
				$updateDate['NAME'] = htmlspecialcharsbx($updateDate['NAME']);
			}

			PullEvent::add($users, Array(
				'module_id' => 'im',
				'command' => 'chatUpdateParams',
				'params' => Array(
					'dialogId' => 'chat'.$this->chat['ID'],
					'chatId' => (int)$this->chat['ID'],
					'params' => array_change_key_case($updateDate)
				),
				'extra' => BitrixImCommon::getPullExtra()
			));
		}
	}

	return $result;
}