• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/handlers.php
  • Класс: CIntranetEventHandlers
  • Вызов: CIntranetEventHandlers::UpdateActivityIBlock
static function UpdateActivityIBlock(&$arFields)
{
	global $DB, $USER;

	if ($arFields['RESULT'])
	{
		// absence
		$iblock = COption::GetOptionInt('intranet', 'iblock_absence');
		if (!$iblock)
		{
			$iblock = array();
			$dbRes = CSite::GetList();
			while ($arRes = $dbRes->Fetch())
			{
				if ($ib = COption::GetOptionInt('intranet', 'iblock_absence', false, $arRes['ID']))
					$iblock[] = $ib;
			}
		}
		else
		{
			$iblock = array($iblock);
		}

		if (count($iblock) > 0)
		{
			foreach ($iblock as $ib)
			{
				if ($arFields['IBLOCK_ID'] == $ib)
				{
					static $PROPERTY_USER = 0;

					if ($PROPERTY_USER <= 0)
					{
						$dbRes = CIBlockProperty::GetByID('USER', $arFields['IBLOCK_ID']);
						if ($arRes = $dbRes->Fetch())
							$PROPERTY_USER = $arRes['ID'];
					}

					if ($PROPERTY_USER > 0)
					{
//							$arPropertyValue = array_values($arFields['PROPERTY_VALUES']);
//							$USER_ID = $arPropertyValue[0];
						$USER_ID = $arFields['PROPERTY_VALUES']['USER'] ?? 0;
						$dbRes = CUser::GetByID($USER_ID);
						if ($arUser = $dbRes->Fetch())
							CIBlockElement::SetPropertyValues($arFields['ID'], $arFields['IBLOCK_ID'], $arUser['ACTIVE'], 'USER_ACTIVE');
					}
				}
			}
		}
		// -- absence

		// news
		if ((int)$arFields["IBLOCK_ID"] > 0)
		{
			if (
				(string)CIBlock::GetArrayByID($arFields["IBLOCK_ID"], 'IBLOCK_TYPE_ID') == "news"
				&& CModule::IncludeModule("socialnetwork")
			)
			{
				CSocNetAllowed::GetAllowedEntityTypes();

				$dbLog = CSocNetLog::GetList(array("ID" => "DESC"), array("EVENT_ID" => "news", "SOURCE_ID" => $arFields["ID"]));
				if ($arLog = $dbLog->Fetch())
				{
					if (
						$arFields["ACTIVE"] == "Y"
						&&
						(
							$arFields["PREVIEW_TEXT"] <> ''
							|| $arFields["DETAIL_TEXT"] <> ''
						)
						&&
						(
							!array_key_exists("WF", $arFields)
							|| $arFields["WF"] == "N"
							|| (
								$arFields["WF_STATUS_ID"] == 1
								&& (
									$arFields["WF_PARENT_ELEMENT_ID"] == $arFields["ID"]
									|| empty($arFields["WF_PARENT_ELEMENT_ID"])
								)
							)
						)
					)
					{
						$arSoFields = Array(
							"=LOG_DATE" => (
								$arFields["ACTIVE_FROM"] <> ''
								?
									(
										MakeTimeStamp($arFields["ACTIVE_FROM"], CSite::GetDateFormat("FULL", $site_id)) > time()
										?
											$DB->CharToDateFunction($arFields["ACTIVE_FROM"], "FULL", $site_id)
										:
											$DB->CurrentTimeFunction()
									)
								:
									$DB->CurrentTimeFunction()
							),
							"=LOG_UPDATE" => $DB->CurrentTimeFunction(),
							"TITLE" => $arFields["NAME"],
							"MESSAGE" => (
								$arFields["DETAIL_TEXT"] <> ''
								? ($arFields["DETAIL_TEXT_TYPE"] == "text" ? htmlspecialcharsbx($arFields["DETAIL_TEXT"]) : $arFields["DETAIL_TEXT"])
								: ($arFields["PREVIEW_TEXT_TYPE"] == "text" ? htmlspecialcharsbx($arFields["PREVIEW_TEXT"]) : $arFields["PREVIEW_TEXT"])
							)
						);

						$logID = CSocNetLog::Update($arLog["ID"], $arSoFields);
						if (intval($logID) > 0)
						{
							$rsRights = CSocNetLogRights::GetList(array(), array("LOG_ID" => $logID));
							$arRights = $rsRights->Fetch();
							if (!$arRights)
								CSocNetLogRights::Add($logID, "G2");

							CSocNetLog::SendEvent($logID, "SONET_NEW_EVENT");
						}
					}
					else
					{
						CSocNetLog::Delete($arLog["ID"]);
					}
				}
				else
				{
					if (
						$arFields["ACTIVE"] == "Y"
						&& (
							$arFields["PREVIEW_TEXT"] <> ''
							|| $arFields["DETAIL_TEXT"] <> ''
						)
						&& (
							!array_key_exists("WF", $arFields)
							|| $arFields["WF"] == "N"
							|| ($arFields["WF_STATUS_ID"] == 1
								&& (
									$arFields["WF_PARENT_ELEMENT_ID"] == $arFields["ID"]
									|| empty($arFields["WF_PARENT_ELEMENT_ID"])
								)
							)
						)
					)
					{
						$dbIBlock = CIBlock::GetByID($arFields["IBLOCK_ID"]);
						if($arIBlock = $dbIBlock->Fetch())
						{
							$rsSite = CIBlock::GetSite($arFields["IBLOCK_ID"]);
							if ($arSite = $rsSite->Fetch())
								$site_id = $arSite["SITE_ID"];

							$val = COption::GetOptionString("intranet", "sonet_log_news_iblock", "", $site_id);
							if ($val <> '')
							{
								$arIBCode = unserialize($val, ["allowed_classes" => false]);
								if (!is_array($arIBCode) || count($arIBCode) <= 0)
									$arIBCode = array();
							}
							else
								$arIBCode = array();

							if (in_array($arIBlock["CODE"], $arIBCode))
							{
								$entity_url = str_replace(
									"#SITE_DIR#",
									$arSite["DIR"],
									$arIBlock["LIST_PAGE_URL"]
								);
								if (mb_strpos($entity_url, "/") === 0)
									$entity_url = "/".ltrim($entity_url, "/");

								$url = str_replace(
									array("#SITE_DIR#", "#ID#", "#CODE#"),
									array($arSite["DIR"], $arFields["ID"], $arFields["CODE"]),
									$arIBlock["DETAIL_PAGE_URL"]
								);
								if (mb_strpos($url, "/") === 0)
									$url = "/".ltrim($url, "/");

								$val = COption::GetOptionString("intranet", "sonet_log_news_iblock_forum");
								if ($val <> '')
									$arIBlockForum = unserialize($val, ["allowed_classes" => false]);
								else
									$arIBlockForum = array();

								$strMessage = (
									$arFields["DETAIL_TEXT"] <> ''
									? ($arFields["DETAIL_TEXT_TYPE"] == "text" ? htmlspecialcharsbx($arFields["DETAIL_TEXT"]) : $arFields["DETAIL_TEXT"])
									: ($arFields["PREVIEW_TEXT_TYPE"] == "text" ? htmlspecialcharsbx($arFields["PREVIEW_TEXT"]) : $arFields["PREVIEW_TEXT"])
								);

								$dtFormatSite = (defined("ADMIN_SECTION") && ADMIN_SECTION===true ? SITE_ID : $site_id);
								$dtValue = (
									$arFields["ACTIVE_FROM"] <> ''
									?
										(
											MakeTimeStamp($arFields["ACTIVE_FROM"], CSite::GetDateFormat("FULL", $dtFormatSite)) > time()
											?
												$DB->CharToDateFunction($arFields["ACTIVE_FROM"], "FULL", $dtFormatSite)
											:
												$DB->CurrentTimeFunction()
										)
									:
										$DB->CurrentTimeFunction()
								);

								$arSoFields = Array(
									"SITE_ID" => $site_id,
									"ENTITY_TYPE" => SONET_SUBSCRIBE_ENTITY_NEWS,
									"ENTITY_ID" => $arIBlock["ID"],
									"EVENT_ID" => "news",
									"USER_ID" => $USER->GetID(),
									"=LOG_DATE" => $dtValue,
									"=LOG_UPDATE" => $dtValue,
									"TITLE_TEMPLATE" => GetMessage("INTR_SOCNET_LOG_NEWS_TITLE"),
									"TITLE" => $arFields["NAME"],
									"MESSAGE" => $strMessage,
									"TEXT_MESSAGE" => "",
									"URL"	=> $url,
									"MODULE_ID" => "intranet",
									"CALLBACK_FUNC" => false,
									"TMP_ID" => false,
									"PARAMS" => serialize(array(
										"ENTITY_NAME" => $arIBlock["NAME"],
										"ENTITY_URL" => $entity_url
									)),
									"SOURCE_ID" => $arFields["ID"],
									"ENABLE_COMMENTS" => (array_key_exists($arIBlock["ID"], $arIBlockForum) ? "Y" : "N"),
									"TAG" => (!empty($arFields['TAGS']) ? explode(', ', $arFields['TAGS']) : array())
								);

								$logID = CSocNetLog::Add($arSoFields, false);
								if (intval($logID) > 0)
								{
									CSocNetLog::Update($logID, array("TMP_ID" => $logID));
									CSocNetLogRights::Add($logID, "G2");
									CSocNetLog::SendEvent($logID, "SONET_NEW_EVENT");

									if (Loader::includeModule('forum'))
									{
										$res = CForumTopic::GetList(
											array(),
											array(
												'XML_ID' => 'IBLOCK_'.$arFields['ID']
											)
										);
										if ($topic = $res->fetch())
										{
											$res = CForumMessage::GetList(
												array(),
												array(
													'NEW_TOPIC' => 'N',
													'TOPIC_ID' => $topic['ID']
												)
											);
											$forumCommentsList = array();
											while($message = $res->fetch())
											{
												$forumCommentsList[$message['ID']] = $message;
											}

											if (!empty($forumCommentsList))
											{
												$res = CSocNetLogComments::getList(
													array(),
													array(
														'EVENT_ID' => 'news_comment',
														'SOURCE_ID' => array_unique(array_keys($forumCommentsList))
													),
													false,
													false,
													array('ID', 'SOURCE_ID')
												);
												while($sonetComment = $res->fetch())
												{
													unset($forumCommentsList[$sonetComment['SOURCE_ID']]);
												}

												if (!empty($forumCommentsList))
												{
													$arForum = CForumNew::GetByID($arIBlockForum[$arIBlock["ID"]]);

													$parser = new textParser(LANGUAGE_ID); // second parameter - path to smile!
													$parser->image_params["width"] = false;
													$parser->image_params["height"] = false;

													$arAllow = array(
														"HTML" => "N",
														"ANCHOR" => "N",
														"BIU" => "N",
														"IMG" => "N",
														"LIST" => "N",
														"QUOTE" => "N",
														"CODE" => "N",
														"FONT" => "N",
														"UPLOAD" => ($arForum ? $arForum["ALLOW_UPLOAD"] : "N"),
														"NL2BR" => "N",
														"VIDEO" => "N",
														"SMILES" => "N"
													);

													foreach($forumCommentsList as $forumComment)
													{
														self::addNewsComment(array(
															'entityId' => $arIBlock["ID"],
															'message' => $parser->convert($forumComment["POST_MESSAGE"], $arAllow),
															'textMessage' => $parser->convert4mail($forumComment["POST_MESSAGE"]),
															'forumMessageId' => $forumComment['ID'],
															'authorId' => intval($forumComment['AUTHOR_ID']),
															'logId' => $logID,
															'logDate' => $forumComment['POST_DATE']
														));
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}

				if (
					$logID > 0
					&& $arFields["ACTIVE_TO"] <> ''
				)
				{
					$agent = "CIntranetEventHandlers::DeleteLogEntry(".$arFields["ID"].");";
					CAgent::RemoveAgent($agent, "intranet");
					CAgent::AddAgent($agent, "intranet", "N", 0, $arFields["ACTIVE_TO"], "Y", $arFields["ACTIVE_TO"]);
				}
			}
		}
		// --news
	}
}