%PDF- %PDF-
| Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/calendar/classes/general/ |
| Current File : //proc/self/root/home/bitrix/www/bitrix/modules/calendar/classes/general/calendar_livefeed.php |
<?
IncludeModuleLangFile(__FILE__);
class CCalendarLiveFeed
{
public static function AddEvent(&$arSocNetFeaturesSettings)
{
$arSocNetFeaturesSettings['calendar']['subscribe_events'] = array(
'calendar' => array(
'ENTITIES' => array(
SONET_SUBSCRIBE_ENTITY_USER => array()
),
"FORUM_COMMENT_ENTITY" => "EV",
'OPERATION' => 'view',
'CLASS_FORMAT' => 'CCalendarLiveFeed',
'METHOD_FORMAT' => 'FormatEvent',
'HAS_CB' => 'Y',
'FULL_SET' => array("calendar", "calendar_comment"),
"COMMENT_EVENT" => array(
"MODULE_ID" => "calendar",
"EVENT_ID" => "calendar_comment",
"OPERATION" => "view",
"OPERATION_ADD" => "log_rights",
"ADD_CALLBACK" => array("CCalendarLiveFeed", "AddComment_Calendar"),
"UPDATE_CALLBACK" => array("CSocNetLogTools", "UpdateComment_Forum"),
"DELETE_CALLBACK" => array("CSocNetLogTools", "DeleteComment_Forum"),
"CLASS_FORMAT" => "CSocNetLogTools",
"METHOD_FORMAT" => "FormatComment_Forum",
"METHOD_GET_URL" => array("CCalendarLiveFeed", "GetCommentUrl"),
"RATING_TYPE_ID" => "FORUM_POST"
)
)
);
}
public static function FormatEvent($arFields, $arParams, $bMail = false)
{
global $APPLICATION, $CACHE_MANAGER;
$arResult = array(
"EVENT" => $arFields
);
if(defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->RegisterTag("CALENDAR_EVENT_".intval($arFields["SOURCE_ID"]));
$CACHE_MANAGER->RegisterTag("CALENDAR_EVENT_LIST");
}
if ($arFields['~PARAMS'] != "")
{
$arFields['~PARAMS'] = unserialize($arFields['~PARAMS']);
if (!is_array($arFields['~PARAMS']))
$arFields['~PARAMS'] = array();
}
$eventViewResult = $APPLICATION->IncludeComponent('bitrix:calendar.livefeed.view', '', array(
"EVENT_ID" => $arFields["SOURCE_ID"],
"USER_ID" => $arFields["USER_ID"],
"PATH_TO_USER" => $arParams["PATH_TO_USER"],
"MOBILE" => $arParams["MOBILE"],
"LIVEFEED_ENTRY_PARAMS" => $arFields['~PARAMS']
),
null,
array('HIDE_ICONS' => 'Y')
);
$arResult["EVENT_FORMATTED"] = Array(
"TITLE" => GetMessage("EC_EDEV_EVENT"),
"TITLE_24" => GetMessage("EC_EDEV_EVENT"),
"MESSAGE" => $eventViewResult['MESSAGE'],
"FOOTER_MESSAGE" => $eventViewResult['FOOTER_MESSAGE'],
"IS_IMPORTANT" => false,
"STYLE" => "calendar-confirm"
);
$eventId = $arFields["SOURCE_ID"];
if (!$eventId)
$eventId = 0;
$calendarUrl = CCalendar::GetPath('user', $arFields["USER_ID"]);
$arResult["EVENT_FORMATTED"]["URL"] = $calendarUrl.((strpos($calendarUrl, "?") === false) ? '?' : '&').'EVENT_ID='.$eventId;
$arRights = array();
$dbRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $arFields["ID"]));
while ($arRight = $dbRight->Fetch())
$arRights[] = $arRight["GROUP_CODE"];
$arResult["EVENT_FORMATTED"]["DESTINATION"] = CSocNetLogTools::FormatDestinationFromRights($arRights, array_merge($arParams, array("CREATED_BY" => $arFields["USER_ID"])));
if (isset($eventViewResult['CACHED_JS_PATH']))
$arResult['CACHED_JS_PATH'] = $eventViewResult['CACHED_JS_PATH'];
$arResult['ENTITY']['FORMATTED']["NAME"] = "ENTITY FORMATTED NAME";
$arResult['ENTITY']['FORMATTED']["URL"] = $arResult["EVENT_FORMATTED"]["URL"];
$arResult['AVATAR_SRC'] = CSocNetLog::FormatEvent_CreateAvatar($arFields, $arParams, 'CREATED_BY');
$arFieldsTooltip = array(
'ID' => $arFields['USER_ID'],
'NAME' => $arFields['~CREATED_BY_NAME'],
'LAST_NAME' => $arFields['~CREATED_BY_LAST_NAME'],
'SECOND_NAME' => $arFields['~CREATED_BY_SECOND_NAME'],
'LOGIN' => $arFields['~CREATED_BY_LOGIN'],
);
$arResult['CREATED_BY']['TOOLTIP_FIELDS'] = CSocNetLog::FormatEvent_FillTooltip($arFieldsTooltip, $arParams);
return $arResult;
}
public static function OnSonetLogEntryMenuCreate($arLogEvent)
{
if (
is_array($arLogEvent["FIELDS_FORMATTED"])
&& is_array($arLogEvent["FIELDS_FORMATTED"]["EVENT"])
&& array_key_exists("EVENT_ID", $arLogEvent["FIELDS_FORMATTED"]["EVENT"])
&& $arLogEvent["FIELDS_FORMATTED"]["EVENT"]["EVENT_ID"] == "calendar"
)
{
global $USER;
if ($USER->GetId() == $arLogEvent["FIELDS_FORMATTED"]["EVENT"]['USER_ID'])
{
$eventId = $arLogEvent["FIELDS_FORMATTED"]["EVENT"]["SOURCE_ID"];
$editUrl = CCalendar::GetPath('user', $arLogEvent["FIELDS_FORMATTED"]["EVENT"]['USER_ID']);
$editUrl = $editUrl.((strpos($editUrl, "?") === false) ? '?' : '&').'EVENT_ID=EDIT'.$eventId;
return array(
array(
'text' => GetMessage("EC_T_EDIT"),
'href' => $editUrl
),
array(
'text' => GetMessage("EC_T_DELETE"),
'onclick' => 'if(window.oViewEventManager[\''.$eventId.'\']){window.oViewEventManager[\''.$eventId.'\'].DeleteEvent();};'
)
);
}
else
{
return false;
}
}
else
return false;
}
// Sync comments from lifefeed to calendar event
public static function AddComment_Calendar($arFields)
{
if (!\Bitrix\Main\Loader::includeModule("forum"))
return false;
$ufFileID = array();
$ufDocID = array();
$dbResult = CSocNetLog::GetList(
array(),
array("ID" => $arFields["LOG_ID"]),
false,
false,
array("ID", "SOURCE_ID", "PARAMS")
);
if ($arLog = $dbResult->Fetch())
{
if ($arLog['PARAMS'] != "")
{
$arLog['PARAMS'] = unserialize($arLog['PARAMS']);
if (!is_array($arLog['PARAMS']))
$arLog['PARAMS'] = array();
}
$calendarEvent = CCalendarEvent::GetById($arLog["SOURCE_ID"]);
if ($calendarEvent)
{
$calendarSettings = CCalendar::GetSettings();
$forumID = $calendarSettings["forum_id"];
if (isset($arLog['PARAMS']['COMMENT_XML_ID']) && $arLog['PARAMS']['COMMENT_XML_ID'])
{
$commentXmlId = $arLog['PARAMS']['COMMENT_XML_ID'];
}
else
{
$commentXmlId = CCalendarEvent::GetEventCommentXmlId($calendarEvent);
$arLog['PARAMS']['COMMENT_XML_ID'] = $commentXmlId;
CSocNetLog::Update($arFields["LOG_ID"], array(
"PARAMS" => serialize($arLog['PARAMS'])
));
}
if ($forumID)
{
$dbTopic = CForumTopic::GetList(null, array(
"FORUM_ID" => $forumID,
"XML_ID" => $commentXmlId
));
if ($dbTopic && ($arTopic = $dbTopic->Fetch()))
$topicID = $arTopic["ID"];
else
$topicID = 0;
$currentUserId = CCalendar::GetCurUserId();
$strPermission = ($currentUserId == $calendarEvent["OWNER_ID"] ? "Y" : "M");
$arFieldsMessage = array(
"POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
"USE_SMILES" => "Y",
"PERMISSION_EXTERNAL" => "Q",
"PERMISSION" => $strPermission,
"APPROVED" => "Y"
);
if ($topicID === 0)
{
$arFieldsMessage["TITLE"] = "EVENT_".$arLog["SOURCE_ID"];
$arFieldsMessage["TOPIC_XML_ID"] = "EVENT_".$arLog["SOURCE_ID"];
}
$arTmp = false;
$GLOBALS["USER_FIELD_MANAGER"]->EditFormAddFields("SONET_COMMENT", $arTmp);
if (is_array($arTmp))
{
if (array_key_exists("UF_SONET_COM_DOC", $arTmp))
$GLOBALS["UF_FORUM_MESSAGE_DOC"] = $arTmp["UF_SONET_COM_DOC"];
elseif (array_key_exists("UF_SONET_COM_FILE", $arTmp))
{
$arFieldsMessage["FILES"] = array();
foreach($arTmp["UF_SONET_COM_FILE"] as $file_id)
$arFieldsMessage["FILES"][] = array("FILE_ID" => $file_id);
}
}
$messageID = ForumAddMessage(($topicID > 0 ? "REPLY" : "NEW"), $forumID, $topicID, 0, $arFieldsMessage, $sError, $sNote);
// get UF DOC value and FILE_ID there
if ($messageID > 0)
{
$messageUrl = self::GetCommentUrl(array(
"ENTRY_ID" => $calendarEvent["ID"],
"ENTRY_USER_ID" => $calendarEvent["OWNER_ID"],
"COMMENT_ID" => $messageID
));
$dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageID));
while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch())
$ufFileID[] = $arAddedMessageFiles["FILE_ID"];
$ufDocID = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageID, LANGUAGE_ID);
}
}
}
}
if (!$messageID)
$sError = GetMessage("EC_LF_ADD_COMMENT_SOURCE_ERROR");
return array(
"SOURCE_ID" => $messageID,
"MESSAGE" => ($arFieldsMessage ? $arFieldsMessage["POST_MESSAGE"] : false),
"RATING_TYPE_ID" => "FORUM_POST",
"RATING_ENTITY_ID" => $messageID,
"ERROR" => $sError,
"NOTES" => $sNote,
"UF" => array(
"FILE" => $ufFileID,
"DOC" => $ufDocID
),
"URL" => $messageUrl
);
}
public static function GetCommentUrl($arFields = array())
{
$messageUrl = '';
if (
is_array($arFields)
&& !empty($arFields["ENTRY_ID"])
&& !empty($arFields["ENTRY_USER_ID"])
)
{
$messageUrl = CCalendar::GetPath("user", $arFields["ENTRY_USER_ID"]);
$messageUrl = $messageUrl.((strpos($messageUrl, "?") === false) ? "?" : "&")."EVENT_ID=".$arFields["ENTRY_ID"]."&MID=#ID#";
if (!empty($arFields["COMMENT_ID"]))
{
$messageUrl = str_replace('#ID#', intval($arFields["COMMENT_ID"]), $messageUrl);
}
}
return $messageUrl;
}
public static function OnAfterSonetLogEntryAddComment($arSonetLogComment)
{
if ($arSonetLogComment["EVENT_ID"] != "calendar_comment")
return;
$dbLog = CSocNetLog::GetList(
array(),
array(
"ID" => $arSonetLogComment["LOG_ID"],
"EVENT_ID" => "calendar"
),
false,
false,
array("ID", "SOURCE_ID", "PARAMS")
);
if (
($arLog = $dbLog->Fetch())
&& (intval($arLog["SOURCE_ID"]) > 0)
)
{
CCalendarNotify::NotifyComment(
$arLog["SOURCE_ID"],
array(
"LOG" => $arLog,
"LOG_ID" => $arLog["ID"],
"USER_ID" => $arSonetLogComment["USER_ID"],
"MESSAGE" => $arSonetLogComment["MESSAGE"],
"URL" => $arSonetLogComment["URL"]
)
);
}
}
public static function OnForumCommentIMNotify($entityType, $eventId, $comment)
{
if (
$entityType != "EV"
|| !\Bitrix\Main\Loader::includeModule("im")
)
{
return;
}
if (
isset($comment["MESSAGE_ID"])
&& intval($comment["MESSAGE_ID"]) > 0
&& ($calendarEvent = CCalendarEvent::GetById($eventId))
)
{
$comment["URL"] = CCalendar::GetPath("user", $calendarEvent["OWNER_ID"], true);
$comment["URL"] .= ((strpos($comment["URL"], "?") === false) ? "?" : "&")."EVENT_ID=".$calendarEvent["ID"]."&MID=".intval($comment["MESSAGE_ID"]);
}
CCalendarNotify::NotifyComment($eventId, $comment);
}
public static function OnAfterCommentAddBefore($entityType, $eventId, $arData)
{
global $DB;
if ($entityType != "EV")
return;
$res = array();
$logId = false;
$commentXmlId = $arData['PARAMS']['XML_ID'];
$parentRes = false;
// Simple events have simple id's like "EVENT_".$eventId, for them
// we don't want to create second socnet log entry (mantis: 82011)
if ($commentXmlId !== "EVENT_".$eventId)
{
$dbRes = CSocNetLog::GetList(array("ID" => "DESC"), array("EVENT_ID" => "calendar", "SOURCE_ID" => $eventId), false, false, array("ID", "ENTITY_ID", "USER_ID", "TITLE", "MESSAGE", "SOURCE_ID", "PARAMS"));
$createNewSocnetLogEntry = true;
while($arRes = $dbRes->Fetch())
{
if($arRes['PARAMS'] != "")
{
$arRes['PARAMS'] = unserialize($arRes['PARAMS']);
if(!is_array($arRes['PARAMS']))
$arRes['PARAMS'] = array();
}
if(isset($arRes['PARAMS']['COMMENT_XML_ID']) && $arRes['PARAMS']['COMMENT_XML_ID'] === $commentXmlId)
{
$logId = $arRes['ID'];
$createNewSocnetLogEntry = false;
}
else
{
$parentRes = $arRes;
}
}
if ($createNewSocnetLogEntry && $parentRes)
{
$arSoFields = Array(
"ENTITY_TYPE" => SONET_SUBSCRIBE_ENTITY_USER,
"ENTITY_ID" => $parentRes["ENTITY_ID"],
"EVENT_ID" => "calendar",
"USER_ID" => $parentRes["USER_ID"],
"SITE_ID" => SITE_ID,
"TITLE_TEMPLATE" => "#TITLE#",
"TITLE" => $parentRes["TITLE"],
"MESSAGE" => $parentRes["MESSAGE"],
"TEXT_MESSAGE" => '',
"SOURCE_ID" => $parentRes["SOURCE_ID"],
"ENABLE_COMMENTS" => "Y",
"CALLBACK_FUNC" => false,
"=LOG_DATE" =>$DB->CurrentTimeFunction(),
"PARAMS" => serialize(array(
"COMMENT_XML_ID" => $commentXmlId
))
);
$logId = CSocNetLog::Add($arSoFields, false);
$arCodes = array();
$rsRights = CSocNetLogRights::GetList(array(), array("LOG_ID" => $parentRes["ID"]));
while ($arRights = $rsRights->Fetch())
{
$arCodes[] = $arRights['GROUP_CODE'];
}
CSocNetLogRights::Add($logId, $arCodes);
}
}
if ($logId)
$res['LOG_ENTRY_ID'] = $logId;
return $res;
}
public static function OnAfterCommentAddAfter($entityType, $eventID, $arData, $logID = false)
{
if ($entityType != "EV")
return;
if (intval($logID) <= 0)
return;
CCalendarLiveFeed::SetCommentFileRights($arData, $logID);
}
public static function OnAfterCommentUpdateAfter($entityType, $eventID, $arData, $logID = false)
{
if ($entityType != "EV")
return;
if (intval($logID) <= 0)
return;
if (
!is_array($arData)
|| !array_key_exists("ACTION", $arData)
|| $arData["ACTION"] != "EDIT"
)
return;
CCalendarLiveFeed::SetCommentFileRights($arData, $logID);
}
public static function SetCommentFileRights($arData, $logID)
{
if (intval($logID) <= 0)
return;
$arAccessCodes = array();
$dbRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $logID));
while ($arRight = $dbRight->Fetch())
$arAccessCodes[] = $arRight["GROUP_CODE"];
$arFilesIds = $arData["PARAMS"]["UF_FORUM_MESSAGE_DOC"];
$UF = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("FORUM_MESSAGE", $arData["MESSAGE_ID"], LANGUAGE_ID);
CCalendar::UpdateUFRights($arFilesIds, $arAccessCodes, $UF["UF_FORUM_MESSAGE_DOC"]);
}
public static function EditCalendarEventEntry($arFields = array(), $arUFFields = array(), $arAccessCodes = array(), $params = array())
{
global $DB;
if (!$arFields['SKIP_TIME'])
{
$arFields['DATE_FROM'] .= ' '.$arFields['TIME_FROM'];
$arFields['DATE_TO'] .= ' '.$arFields['TIME_TO'];
}
// Timezone
if (!$arFields['TZ_FROM'] && isset($arFields['DEFAULT_TZ']))
{
$arFields['TZ_FROM'] = $arFields['DEFAULT_TZ'];
}
if (!$arFields['TZ_TO'] && isset($arFields['DEFAULT_TZ']))
{
$arFields['TZ_TO'] = $arFields['DEFAULT_TZ'];
}
if (isset($arFields['DEFAULT_TZ']) && $arFields['DEFAULT_TZ'] != '')
{
CCalendar::SaveUserTimezoneName($params["userId"], $arFields['DEFAULT_TZ']);
}
if ($arFields['SECTION'])
$arFields['SECTIONS'] = array($arFields['SECTION']);
$arFields["OWNER_ID"] = $params["userId"];
$arFields["CAL_TYPE"] = $params["type"];
// Add author for new event
if (!$arFields["ID"])
$arAccessCodes[] = 'U'.$params["userId"];
$arAccessCodes = array_unique($arAccessCodes);
$arAttendees = CCalendar::GetDestinationUsers($arAccessCodes);
if (trim($arFields["NAME"]) === '')
$arFields["NAME"] = GetMessage('EC_DEFAULT_EVENT_NAME');
$arFields['IS_MEETING'] = !empty($arAttendees) && $arAttendees != array($params["userId"]);
if (isset($arFields['RRULE']) && !empty($arFields['RRULE']))
{
if (is_array($arFields['RRULE']['BYDAY']))
$arFields['RRULE']['BYDAY'] = implode(',', $arFields['RRULE']['BYDAY']);
}
if ($arFields['IS_MEETING'])
{
$arFields['ATTENDEES_CODES'] = $arAccessCodes;
$arFields['ATTENDEES'] = $arAttendees;
$arFields['MEETING_HOST'] = $params["userId"];
$arFields['MEETING'] = array(
'HOST_NAME' => CCalendar::GetUserName($params["userId"]),
'TEXT' => '',
'OPEN' => false,
'NOTIFY' => true,
'REINVITE' => false
);
}
else
{
$arFields['ATTENDEES'] = false;
}
$eventId = CCalendar::SaveEvent(
array(
'arFields' => $arFields,
'autoDetectSection' => true
)
);
if ($eventId > 0)
{
if (count($arUFFields) > 0)
CCalendarEvent::UpdateUserFields($eventId, $arUFFields);
foreach($arAccessCodes as $key => $value)
if ($value == "UA")
{
unset($arAccessCodes[$key]);
$arAccessCodes[] = "G2";
break;
}
if ($arFields['IS_MEETING'] && !empty($arUFFields['UF_WEBDAV_CAL_EVENT']))
{
$UF = $GLOBALS['USER_FIELD_MANAGER']->GetUserFields("CALENDAR_EVENT", $eventId, LANGUAGE_ID);
CCalendar::UpdateUFRights($arUFFields['UF_WEBDAV_CAL_EVENT'], $arAccessCodes, $UF['UF_WEBDAV_CAL_EVENT']);
}
$arSoFields = Array(
"ENTITY_TYPE" => SONET_SUBSCRIBE_ENTITY_USER,
"ENTITY_ID" => $params["userId"],
"USER_ID" => $params["userId"],
"=LOG_DATE" => $DB->CurrentTimeFunction(),
"TITLE_TEMPLATE" => "#TITLE#",
"TITLE" => $arFields["NAME"],
"MESSAGE" => '',
"TEXT_MESSAGE" => ''
);
$dbRes = CSocNetLog::GetList(
array("ID" => "DESC"),
array(
"EVENT_ID" => "calendar",
"SOURCE_ID" => $eventId
),
false,
false,
array("ID")
);
$arCodes = array();
foreach($arAccessCodes as $value)
{
if (substr($value, 0, 2) === 'SG')
$arCodes[] = $value.'_K';
$arCodes[] = $value;
}
$arCodes = array_unique($arCodes);
if ($arRes = $dbRes->Fetch())
{
CSocNetLog::Update($arRes["ID"], $arSoFields);
CSocNetLogRights::DeleteByLogID($arRes["ID"]);
CSocNetLogRights::Add($arRes["ID"], $arCodes);
}
else
{
$arSoFields = array_merge($arSoFields, array(
"EVENT_ID" => "calendar",
"SITE_ID" => SITE_ID,
"SOURCE_ID" => $eventId,
"ENABLE_COMMENTS" => "Y",
"CALLBACK_FUNC" => false
));
$logID = CSocNetLog::Add($arSoFields, false);
CSocNetLogRights::Add($logID, $arCodes);
}
}
}
// Called after creation or edition of calendar event
public static function OnEditCalendarEventEntry($params)
{
global $DB;
$eventId = intval($params['eventId']);
$currentEvent = CCalendarEvent::GetList(
array(
'arFilter' => array(
"PARENT_ID" => $eventId,
"IS_MEETING" => 1,
"DELETED" => "N"
),
'parseRecursion' => false,
'fetchAttendees' => true,
'fetchMeetings' => true,
'checkPermissions' => false,
'setDefaultLimit' => false
));
if ($currentEvent && count($currentEvent) > 0)
{
$currentEvent = $currentEvent[0];
}
$arFields = $params['arFields'];
$attendeesCodes = $params['attendeesCodes'];
$folowersList = array();
$unfolowersList = array();
if ($currentEvent['IS_MEETING'] && is_array($currentEvent['~ATTENDEES']))
{
foreach($currentEvent['~ATTENDEES'] as $att)
{
if ($att['STATUS'] !== 'N')
{
$folowersList[] = $att['USER_ID'];
}
else
{
$unfolowersList[] = $att['USER_ID'];
}
}
}
if (isset($attendeesCodes) && !is_array($attendeesCodes))
$attendeesCodes = explode(',', $attendeesCodes);
if (!is_array($attendeesCodes))
$attendeesCodes = array();
$newlogId = false;
if ($eventId > 0)
{
$arSoFields = Array(
"ENTITY_ID" => $arFields["CREATED_BY"],
"USER_ID" => $arFields["CREATED_BY"],
"=LOG_DATE" =>$DB->CurrentTimeFunction(),
"TITLE_TEMPLATE" => "#TITLE#",
"TITLE" => $arFields["NAME"],
"MESSAGE" => "",
"TEXT_MESSAGE" => ""
);
$arAccessCodes = array();
foreach($attendeesCodes as $value)
{
if ($value == "UA")
$arAccessCodes[] = "G2";
else
$arAccessCodes[] = $value;
}
$dbRes = CSocNetLog::GetList(
array("ID" => "DESC"),
array(
"EVENT_ID" => "calendar",
"SOURCE_ID" => $eventId
),
false,
false,
array("ID")
);
$arCodes = array();
foreach($arAccessCodes as $value)
{
if (substr($value, 0, 1) === 'U')
{
$attendeeId = intval(substr($value, 1));
if (in_array($attendeeId, $folowersList))
{
$arCodes[] = $value;
}
}
else
{
if (substr($value, 0, 2) === 'SG')
$arCodes[] = $value.'_K';
$arCodes[] = $value;
}
}
if ($arFields['IS_MEETING'] && $arFields['MEETING_HOST'] && !in_array('U'.$arFields['MEETING_HOST'], $arCodes))
{
$arCodes[] = 'U'.$arFields['MEETING_HOST'];
}
$arCodes = array_unique($arCodes);
if ($arRes = $dbRes->Fetch())
{
if (
isset($arRes["ID"])
&& intval($arRes["ID"]) > 0
)
{
CSocNetLog::Update($arRes["ID"], $arSoFields);
CSocNetLogRights::DeleteByLogID($arRes["ID"]);
CSocNetLogRights::Add($arRes["ID"], $arCodes);
foreach($unfolowersList as $value)
{
CSocNetLogFollow::Set(intval($value), "L".$arRes["ID"], 'N');
}
}
}
else
{
$arSoFields = array_merge($arSoFields, array(
"ENTITY_TYPE" => SONET_SUBSCRIBE_ENTITY_USER,
"EVENT_ID" => "calendar",
"SITE_ID" => SITE_ID,
"SOURCE_ID" => $eventId,
"ENABLE_COMMENTS" => "Y",
"CALLBACK_FUNC" => false
));
$newlogId = CSocNetLog::Add($arSoFields, false);
CSocNetLogRights::Add($newlogId, $arCodes);
foreach($unfolowersList as $value)
{
CSocNetLogFollow::Set(intval($value), "L".$newlogId, 'N');
}
}
// Find if we already have socialnetwork livefeed entry for this event
if ($newlogId && $arFields['RECURRENCE_ID'] > 0)
{
$commentXmlId = false;
if ($arFields['RELATIONS'])
{
if(!isset($arFields['~RELATIONS']) || !is_array($arFields['~RELATIONS']))
{
$arFields['~RELATIONS'] = unserialize($arFields['RELATIONS']);
}
if (is_array($arFields['~RELATIONS']) && array_key_exists('COMMENT_XML_ID', $arFields['~RELATIONS']) && $arFields['~RELATIONS']['COMMENT_XML_ID'])
{
$commentXmlId = $arFields['~RELATIONS']['COMMENT_XML_ID'];
}
}
$dbRes = CSocNetLog::GetList(
array("ID" => "DESC"),
array(
"EVENT_ID" => "calendar",
"SOURCE_ID" => $arFields['RECURRENCE_ID']
),
false,
false,
array("ID", "SOURCE_ID", "PARAMS", "COMMENTS_COUNT")
);
$event = CCalendarEvent::GetById($arFields['RECURRENCE_ID']);
$rrule = CCalendarEvent::ParseRRULE($event['RRULE']);
$until = $rrule['~UNTIL'];
while ($arRes = $dbRes->Fetch())
{
if ($arRes['PARAMS'] != "")
{
$arRes['PARAMS'] = unserialize($arRes['PARAMS']);
if (!is_array($arRes['PARAMS']))
$arRes['PARAMS'] = array();
}
if (isset($arRes['PARAMS']['COMMENT_XML_ID']))
{
if ($commentXmlId && $arRes['PARAMS']['COMMENT_XML_ID'] === $commentXmlId)
{
// Move comments from old entry to new one
CSocNetLogComments::BatchUpdateLogId($arRes['ID'], $newlogId);
// Delete old entry
CSocNetLog::Delete($arRes['ID']);
// Update comments count for new entry
// And put COMMENT_XML_ID from old antry to preserve syncrinization
CSocNetLog::Update($newlogId, array(
"COMMENTS_COUNT" => intval($arRes['COMMENTS_COUNT']),
"PARAMS" => serialize(array(
"COMMENT_XML_ID" => $commentXmlId
))
));
}
else
{
$instanceDate = CCalendarEvent::ExtractDateFromCommentXmlId($arRes['PARAMS']['COMMENT_XML_ID']);
if ($instanceDate && $until)
{
$untilTs = CCalendar::Timestamp($until);
$instanceDateTs = CCalendar::Timestamp($instanceDate);
if ($instanceDateTs >= $untilTs)
{
CSocNetLog::Update($arRes['ID'], array(
"SOURCE_ID" => $eventId
));
}
}
}
}
}
}
}
}
// Do delete from socialnetwork live feed here
public static function OnDeleteCalendarEventEntry($eventId)
{
if (\Bitrix\Main\Loader::includeModule("socialnetwork"))
{
$dbRes = CSocNetLog::GetList(
array("ID" => "DESC"),
array(
"EVENT_ID" => "calendar",
"SOURCE_ID" => $eventId
),
false,
false,
array("ID")
);
while ($arRes = $dbRes->Fetch())
{
CSocNetLog::Delete($arRes["ID"]);
}
}
}
public static function FixForumCommentURL($arData)
{
if(
in_array($arData["MODULE_ID"], array("forum", "FORUM"))
&& $arData['ENTITY_TYPE_ID'] === 'FORUM_POST'
&& intval($arData['PARAM1']) > 0
&& preg_match('/^EVENT_([0-9]+)/', $arData["TITLE"], $match)
)
{
$arCalendarSettings = CCalendar::GetSettings();
$forumID = $arCalendarSettings["forum_id"];
$eventID = intval($match[1]);
if (
intval($arData['PARAM1']) == $forumID
&& $eventID > 0
&& !empty($arCalendarSettings["pathes"])
&& ($arCalendarEvent = CCalendarEvent::GetById($eventID))
&& strlen($arCalendarEvent["CAL_TYPE"]) > 0
&& in_array($arCalendarEvent["CAL_TYPE"], array("user", "group"))
&& intval($arCalendarEvent["OWNER_ID"]) > 0
)
{
foreach ($arData['LID'] as $siteId => $value)
{
$messageUrl = false;
if (
array_key_exists($siteId, $arCalendarSettings["pathes"])
&& is_array($arCalendarSettings["pathes"][$siteId])
&& !empty($arCalendarSettings["pathes"][$siteId])
)
{
if ($arCalendarEvent["CAL_TYPE"] == "user")
{
if (
array_key_exists("path_to_user_calendar", $arCalendarSettings["pathes"][$siteId])
&& !empty($arCalendarSettings["pathes"][$siteId]["path_to_user_calendar"])
)
{
$messageUrl = CComponentEngine::MakePathFromTemplate(
$arCalendarSettings["pathes"][$siteId]["path_to_user_calendar"],
array(
"user_id" => $arCalendarEvent['OWNER_ID'],
)
);
}
}
else
{
if (
array_key_exists("path_to_group_calendar", $arCalendarSettings["pathes"][$siteId])
&& !empty($arCalendarSettings["pathes"][$siteId]["path_to_group_calendar"])
)
{
$messageUrl = CComponentEngine::MakePathFromTemplate(
$arCalendarSettings["pathes"][$siteId]["path_to_group_calendar"],
array(
"group_id" => $arCalendarEvent['OWNER_ID'],
)
);
}
}
}
$arData['LID'][$siteId] = ($messageUrl ? $messageUrl."?EVENT_ID=".$arCalendarEvent["ID"]."&MID=".$arData['ENTITY_ID']."#message".$arData['ENTITY_ID'] : "");
}
return $arData;
}
return array(
"TITLE" => "",
"BODY" => ""
);
}
}
public static function OnChangeMeetingStatusEventEntry($params)
{
$codesList = array();
$unfolowersList = array();
if(isset($params['event']))
{
if ($params['event']['IS_MEETING'] && is_array($params['event']['~ATTENDEES']))
{
foreach($params['event']['~ATTENDEES'] as $att)
{
if ($att['USER_ID'] == $params['userId'] && $params['status'] === 'N'
||
($att['USER_ID'] !== $params['userId'] && $att['STATUS'] === 'N')
)
{
$unfolowersList[] = $att['USER_ID'];
}
}
}
foreach($params['event']['ATTENDEES_CODES'] as $code)
{
if (substr($code, 0, 1) === 'U')
{
$attendeeId = intval(substr($code, 1));
if (!in_array($attendeeId, $unfolowersList))
{
$codesList[] = $code;
}
}
else
{
if(substr($code, 0, 2) === 'SG')
{
$codesList[] = $code.'_K';
}
$codesList[] = $code;
}
}
}
if(($params['status'] == 'N' || $params['status'] == 'Y') && intval($params['userId']))
{
$dbRes = CSocNetLog::GetList(array("ID" => "DESC"), array("EVENT_ID" => "calendar", "SOURCE_ID" => $params['eventId']), false, false, array("ID"));
while($logEntry = $dbRes->Fetch())
{
CSocNetLogRights::DeleteByLogID($logEntry['ID']);
foreach($unfolowersList as $value)
{
CSocNetLogFollow::Set(intval($value), "L".$logEntry['ID'], 'N');
}
CSocNetLogFollow::Set(intval($params['userId']), "L".$logEntry['ID'], $params['status']);
if (
$params['status'] == 'Y'
&& method_exists('\Bitrix\Socialnetwork\ComponentHelper','userLogSubscribe')
)
{
\Bitrix\Socialnetwork\ComponentHelper::userLogSubscribe(array(
'logId' => $logEntry['ID'],
'userId' => $value,
'typeList' => array(
'COUNTER_COMMENT_PUSH'
)
));
}
if (!empty($codesList))
{
CSocNetLogRights::Add($logEntry['ID'], $codesList);
}
}
}
}
}
?>