%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/calendar/classes/general/ |
Current File : //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); } } } } } ?>