• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_message_param.php
  • Класс: CIMMessageParam
  • Вызов: CIMMessageParam::Set
static function Set($messageId, $params = Array())
{
	$messageId = intval($messageId);
	if(!(is_array($params) || is_null($params)) || $messageId <= 0)
		return false;

	if (is_null($params) || count($params) <= 0)
	{
		return self::DeleteAll($messageId);
	}

	$default = self::GetDefault();

	$arToDelete = array();
	foreach ($params as $key => $val)
	{
		if (isset($default[$key]) && $default[$key] == $val)
		{
			$arToDelete[$key] = array(
				"=MESSAGE_ID" => $messageId,
				"=PARAM_NAME" => $key,
			);
		}
	}

	$arToInsert = array();
	foreach($params as $k1 => $v1)
	{
		$name = mb_substr(trim($k1), 0, 100);
		if($name <> '')
		{
			if(is_object($v1) && $v1 instanceof BitrixImBotKeyboard)
			{
				$v1 = array($v1);
			}
			else
			{
				if(is_object($v1) && $v1 instanceof BitrixImBotContextMenu)
				{
					$v1 = array($v1);
				}
				else
				{
					if(is_object($v1) && $v1 instanceof CIMMessageParamAttach)
					{
						$v1 = array($v1);
					}
					else
					{
						if(is_object($v1) && $v1 instanceof BitrixMainTypeDateTime)
						{
							$v1 = array($v1->getTimestamp());
						}
						else
						{
							if(is_array($v1) && BitrixMainTypeCollection::isAssociative($v1))
							{
								$v1 = array($v1);
							}
							else
							{
								if(!is_array($v1))
								{
									$v1 = array($v1);
								}
							}
						}
					}
				}
			}

			if(empty($v1))
			{
				$arToDelete[$name] = array(
					"=MESSAGE_ID" => $messageId,
					"=PARAM_NAME" => $name,
				);
			}
			else
			{
				foreach($v1 as $v2)
				{
					if(is_array($v2))
					{
						$value = BitrixImCommon::jsonEncode($v2);
						if($value <> '' && mb_strlen($value) < 60000)
						{
							$key = md5($name.$value);
							$arToInsert[$key] = array(
								"MESSAGE_ID" => $messageId,
								"PARAM_NAME" => $name,
								"PARAM_VALUE" => isset($v2['ID'])? $v2['ID'] : time(),
								"PARAM_JSON" => $value,
							);
						}
					}
					else
					{
						if(is_object($v2) && ($v2 instanceof BitrixImBotKeyboard || $v2 instanceof BitrixImBotContextMenu))
						{
							$value = $v2->getJson();
							if($value <> '')
							{
								$key = md5($name.$value);
								$arToInsert[$key] = array(
									"MESSAGE_ID" => $messageId,
									"PARAM_NAME" => $name,
									"PARAM_VALUE" => "",
									"PARAM_JSON" => $value,
								);
							}
						}
						else
						{
							if(is_object($v2) && $v2 instanceof CIMMessageParamAttach)
							{
								$value = $v2->GetJSON();
								$valueArray = $v2->GetArray();
								if($value <> '')
								{
									$description = $valueArray['DESCRIPTION'];
									if (mb_strlen($description) > 100)
									{
										$description = mb_substr($description, 0, 97) . '...';
									}
									$key = md5($name.$value);
									$arToInsert[$key] = array(
										"MESSAGE_ID" => $messageId,
										"PARAM_NAME" => $name,
										"PARAM_VALUE" => $description,
										"PARAM_JSON" => $value,
									);
								}
							}
							else
							{
								$value = mb_substr(trim($v2), 0, 100);
								if($value <> '')
								{
									$key = md5($name.$value);
									$arToInsert[$key] = array(
										"MESSAGE_ID" => $messageId,
										"PARAM_NAME" => $name,
										"PARAM_VALUE" => $value,
									);
								}
							}
						}
					}
				}
			}
		}
	}

	if(!empty($arToInsert))
	{
		$messageParameters = IMModelMessageParamTable::getList(array(
			'select' => array('ID', 'PARAM_NAME', 'PARAM_VALUE', 'PARAM_JSON'),
			'filter' => array(
				'=MESSAGE_ID' => $messageId,
			),
		));
		while($ar = $messageParameters->fetch())
		{
			if ($ar['PARAM_JSON'] <> '')
			{
				$key = md5($ar["PARAM_NAME"].$ar["PARAM_JSON"]);
			}
			else
			{
				$key = md5($ar["PARAM_NAME"].$ar["PARAM_VALUE"]);
			}
			if(array_key_exists($key, $arToInsert))
			{
				unset($arToInsert[$key]);
			}
			else if (isset($params[$ar["PARAM_NAME"]]))
			{
				IMModelMessageParamTable::delete($ar['ID']);
			}
		}
	}

	foreach($arToInsert as $parameterInfo)
	{
		if (in_array($parameterInfo["PARAM_NAME"], Array('KEYBOARD', 'MENU', 'ATTACH', 'NAME',	'IMOL_VOTE_TEXT', 'IMOL_VOTE_LIKE', 'IMOL_VOTE_DISLIKE')))
		{
			$parameterInfo['PARAM_VALUE'] = BitrixImText::encodeEmoji($parameterInfo['PARAM_VALUE']);
		}

		if (isset($parameterInfo['PARAM_VALUE']) && mb_strlen($parameterInfo['PARAM_VALUE']) > 100)
		{
			$parameterInfo['PARAM_VALUE'] = mb_substr($parameterInfo['PARAM_VALUE'], 0, 97) . '...';
		}

		IMModelMessageParamTable::add($parameterInfo);
	}

	foreach($arToDelete as $filter)
	{
		$messageParameters = IMModelMessageParamTable::getList(array(
			'select' => array('ID'),
			'filter' => $filter,
		));
		while ($parameterInfo = $messageParameters->fetch())
		{
			IMModelMessageParamTable::delete($parameterInfo['ID']);
		}
	}

	self::UpdateTimestamp($messageId);

	return true;
}