- Модуль: 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;
}