• Модуль: lists
  • Путь к файлу: ~/bitrix/modules/lists/classes/general/livefeed.php
  • Класс: CListsLiveFeed
  • Вызов: CListsLiveFeed::setMessageLiveFeed
static function setMessageLiveFeed($users, $elementId, $workflowId, $flagCompleteProcess)
{
	$elementId = intval($elementId);
	$elementObject = CIBlockElement::getList(
		array(),
		array('ID' => $elementId),
		false,
		false,
		array('ID', 'CREATED_BY', 'IBLOCK_NAME', 'NAME', 'IBLOCK_ID', 'LANG_DIR', 'IBLOCK_CODE')
	);
	$element = $elementObject->fetch();

	if (!CLists::getLiveFeed($element["IBLOCK_ID"] ?? null))
	{
		return false;
	}

	$listSystemIblockCode = array(
		'bitrix_holiday',
		'bitrix_invoice',
		'bitrix_trip',
		'bitrix_cash',
		'bitrix_incoming_doc',
		'bitrix_outgoing_doc'
	);

	$params = serialize(array("ELEMENT_NAME" => $element['NAME']));

	$element['NAME'] = htmlspecialcharsbx($element['NAME']);
	if (in_array($element['IBLOCK_CODE'], $listSystemIblockCode))
	{
		$element['NAME'] = preg_replace_callback(
			'#^[^[]]+?[(d+)]#i',
			function ($matches)
			{
				$userId = $matches[1];
				$db = CUser::GetByID($userId);
				if ($ar = $db->GetNext())
				{
					$ix = randString(5);
					return ''.CUser::FormatName(CSite::GetNameFormat(false), $ar, true, false).'';
				}
				return $matches[0];
			},
			$element['NAME']
		);
	}

	$path = rtrim($element['LANG_DIR'], '/');
	$urlElement = $path.COption::GetOptionString('lists', 'livefeed_url').'?livefeed=y&list_id='.$element["IBLOCK_ID"].'&element_id='.$elementId;
	$createdBy = $element['CREATED_BY'];
	if(!Loader::includeModule('socialnetwork') || $createdBy <= 0)
		return false;

	$sourceId = CBPStateService::getWorkflowIntegerId($workflowId);
	$logId = 0;
	$userObject = CUser::getByID($createdBy);
	$siteId = array();
	$siteObject = CSite::getList("sort", "desc", array("ACTIVE" => "Y"));
	while ($site = $siteObject->fetch())
		$siteId[] = $site['LID'];

	if ($userObject->fetch())
	{
		global $DB;
		$soFields = Array(
			'ENTITY_TYPE' => SONET_LISTS_NEW_POST_ENTITY,
			'EVENT_ID' => 'lists_new_element',
			'ENTITY_ID' => 1,
			'=LOG_UPDATE' => $DB->currentTimeFunction(),
			'SOURCE_ID' => $sourceId,
			'USER_ID' => $createdBy,
			'MODULE_ID' => 'lists',
			'TITLE_TEMPLATE' => $urlElement,
			'TITLE' => $element['IBLOCK_NAME'],
			'PARAMS' => $params,
			'MESSAGE' => $workflowId,
			'CALLBACK_FUNC' => false,
			'SITE_ID' => $siteId,
			'ENABLE_COMMENTS' => 'Y',
			'RATING_TYPE_ID' => 'LISTS_NEW_ELEMENT',
			'RATING_ENTITY_ID' => $sourceId,
			'URL' => '#SITE_DIR#'.COption::GetOptionString('socialnetwork', 'user_page', false, SITE_ID).'log/'
		);

		$logObject = CSocNetLog::getList(array(), array(
			'ENTITY_TYPE' => $soFields['ENTITY_TYPE'],
			'ENTITY_ID' => $soFields['ENTITY_ID'],
			'EVENT_ID' => $soFields['EVENT_ID'],
			'SOURCE_ID' => $soFields['SOURCE_ID'],
		));

		$iblockPicture = CIBlock::getArrayByID($element['IBLOCK_ID'], 'PICTURE');
		$imageFile = CFile::getFileArray($iblockPicture);
		if($imageFile !== false)
		{
			$imageFile = CFile::ResizeImageGet(
				$imageFile,
				array("width" => 36, "height" => 30),
				BX_RESIZE_IMAGE_PROPORTIONAL,
				false
			);
		}
		if(empty($imageFile['src']))
			$imageFile['src'] = '/bitrix/images/lists/default.png';

		$soFields['TEXT_MESSAGE'] = '
			
				
					
				
				'.$element['NAME'].'
			
		';

		if($log = $logObject->fetch())
		{
			if (intval($log['ID']) > 0)
			{
				if(empty($users))
				{
					CSocNetLog::update($log['ID'], $soFields);
				}
				else
				{
					$activeUsers = CBPTaskService::getWorkflowParticipants($workflowId);

					$rights = self::getRights($activeUsers, $log['ID'], $createdBy, 'post');
					$usersRight = self::getUserIdForRight($rights);

					self::setSocnetFollow($usersRight, $log['ID'], 'Y', true);
					/* Recipients tasks bp */
					CSocNetLog::update($log['ID'], $soFields);

					/* Increment the counter for participants */
					CSocNetLogRights::deleteByLogID($log['ID']);
					$rightsCounter = self::getRights($users, $log['ID'], $createdBy, 'counter');
					CSocNetLogRights::add($log['ID'], $rightsCounter, false, false);
					CSocNetLog::counterIncrement($log['ID'], $soFields['EVENT_ID'], false, 'L', false);

					/* Return previous state rights */
					CSocNetLogRights::deleteByLogID($log['ID']);
					CSocNetLogRights::add($log['ID'], $rights, false, false);

					self::setSocnetFollow($users, $log['ID'], 'Y');
					self::setSocnetFollow($users, $log['ID'], 'N');
				}

				/* Completion of the process for the author */
				if ($flagCompleteProcess)
				{
					$activeUsers = CBPTaskService::getWorkflowParticipants($workflowId);
					$rights = self::getRights($activeUsers, $log['ID'], $createdBy, 'post');
					$usersRight = self::getUserIdForRight($rights);

					/* Increment the counter for author */
					$users[] = $createdBy;
					CSocNetLogRights::deleteByLogID($log['ID']);
					$rightsCounter = self::getRights($users, $log['ID'], $createdBy, 'counter');
					CSocNetLogRights::add($log['ID'], $rightsCounter, false, false);
					CSocNetLog::counterIncrement($log['ID'], $soFields['EVENT_ID'], false, 'L', false);

					/* Return previous state rights */
					CSocNetLogRights::deleteByLogID($log['ID']);
					CSocNetLogRights::add($log['ID'], $rights, false, false);

					self::setSocnetFollow($users, $log['ID'], 'Y');
					self::setSocnetFollow($usersRight, $log['ID'], 'N');
				}
			}
		}
		else
		{
			$activeUsers = CBPTaskService::getWorkflowParticipants($workflowId);

			$soFields['=LOG_DATE'] = $DB->currentTimeFunction();
			$logId = CSocNetLog::add($soFields, false);
			if (intval($logId) > 0)
			{
				$rights = self::getRights($activeUsers, $logId, $createdBy, 'post');
				CSocNetLogRights::add($logId, $rights, false, false);
				$usersRight = self::getUserIdForRight($rights);
				self::setSocnetFollow($usersRight, $logId, 'N');
			}
			CSocNetLog::counterIncrement($logId, $soFields['EVENT_ID'], false, 'L', false);
		}
	}
	return $logId;
}