• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/integration/landing/livefeed.php
  • Класс: BitrixSocialnetworkIntegrationLandingLivefeed
  • Вызов: Livefeed::getElementsInternal
private function getElementsInternal(array $settings)
{
	global $CACHE_MANAGER, $USER_FIELD_MANAGER;

	$result = [];

	$pathToSmile = MainConfigOption::get("socialnetwork", "smile_page", false, SITE_ID);
	$pathToSmile = ($pathToSmile ? $pathToSmile : "/bitrix/images/socialnetwork/smile/");

	$parserParams = Array(
		"imageWidth" => 500,
		"imageHeight" => 500,
	);

	$allow = [
		"HTML" => "N",
		"ANCHOR" => "Y",
		"BIU" => "Y",
		"IMG" => "Y",
		"QUOTE" => "Y",
		"CODE" => "Y",
		"FONT" => "Y",
		"LIST" => "Y",
		"SMILES" => "Y",
		"NL2BR" => "N",
		"VIDEO" => "Y",
		"USER" => "N",
		"TAG" => "Y",
		"SHORT_ANCHOR" => "Y"
	];
	if(MainConfigOption::get("blog","allow_video", "Y") != "Y")
	{
		$allow["VIDEO"] = "N";
	}

	$iterator = CSocNetLog::getList(
		$settings['order'],
		$settings['filter'],
		false,
		$settings['limit'],
		[ 'SOURCE_ID' ],
		[
			'CHECK_RIGHTS' => 'N',
			'USE_FOLLOW' => 'N',
			'USE_SUBSCRIBE' => 'N',
			'USE_FAVORITES' => 'N',
		]
	);

	$blogPostIdList = [];
	while ($row = $iterator->fetch())
	{
		$blogPostIdList[] = $row['SOURCE_ID'];
	}

	$diskInstalled = MainLoader::includeModule('disk');

	if (
		!empty($blogPostIdList)
		&& MainLoader::includeModule('blog')
	)
	{
		if ($diskInstalled)
		{
			$driver = BitrixDiskDriver::getInstance();
			$urlManager = $driver->getUrlManager();
		}


		$query = new BitrixMainEntityQuery(PostTable::getEntity());
		$query->addOrder('DATE_PUBLISH', 'DESC');
		$query->addFilter('@ID', $blogPostIdList);
		$query->addSelect('ID');
		$query->addSelect('MICRO');
		$query->addSelect('TITLE');
		$query->addSelect('DETAIL_TEXT');
		$query->addSelect('AUTHOR_ID');
		$query->addSelect('DATE_PUBLISH');

		$query->registerRuntimeField(
			'',
			new BitrixMainEntityReferenceField('U',
				UserTable::getEntity(),
				array(
					'=ref.ID' => 'this.AUTHOR_ID'
				),
				array('join_type' => 'INNER')
			)
		);
		$query->addSelect('U.PERSONAL_PHOTO', 'AUTHOR_AVATAR');
		$query->addSelect('U.NAME', 'AUTHOR_NAME');
		$query->addSelect('U.LAST_NAME', 'AUTHOR_LAST_NAME');
		$query->addSelect('U.SECOND_NAME', 'AUTHOR_SECOND_NAME');
		$query->addSelect('U.LOGIN', 'AUTHOR_LOGIN');

		$iterator = $query->exec();
		while ($row = $iterator->fetch())
		{
			if (defined("BX_COMP_MANAGED_CACHE"))
			{
				$CACHE_MANAGER->registerTag("blog_post_".$row['ID']);
			}

			$attachedFilesList = [];

			if ($diskInstalled)
			{
				$res = BitrixDiskAttachedObject::getList(array(
					'filter' => array(
						'=ENTITY_TYPE' => BitrixDiskUfBlogPostConnector::className(),
						'ENTITY_ID' => $row
					),
					'select' => array('ID', 'OBJECT_ID', 'FILENAME' => 'OBJECT.NAME')
				));
				foreach ($res as $attachedObjectFields)
				{
					$attachedObjectFields['URL'] = (BitrixDiskTypeFile::isImage($attachedObjectFields['FILENAME'])
						? $urlManager->getUrlUfController('show', array('attachedId' => $attachedObjectFields['ID']))
						: ''
					);
					$attachedFilesList[] = $attachedObjectFields;
				}
			}

			$detailTextInOneString = str_replace("rn", "", $row["DETAIL_TEXT"]);

			$inlineAttachmentsList = [];
			if (preg_match_all('/[DISKsFILEsID=([n]*)(d+)]/', $row["DETAIL_TEXT"], $matches))
			{
				foreach($matches[2] as $key => $value)
				{
					$inlineAttachmentsList[] = [
						'ID' => $value,
						'KEY' => ($matches[1][$key] === 'n' ? 'OBJECT_ID' : 'ID'),
						'POSITION' => mb_strpos($detailTextInOneString, $matches[0][$key])
					];
				}
			}

			$picture = '';
			$diskPicturePosition = false;
			foreach($inlineAttachmentsList as $inlineAttachment)
			{
				foreach($attachedFilesList as $attachedFile)
				{
					if(
						$attachedFile[$inlineAttachment['KEY']] == $inlineAttachment['ID']
						&& !empty($attachedFile['URL'])
					)
					{
						$picture = [
							'alt' => (!empty($attachedFile['FILENAME']) ? $attachedFile['FILENAME'] : ''),
							'src' => $attachedFile['URL']
						];
						$diskPicturePosition = $inlineAttachment['POSITION'];
						break;
					}
				}
				if(!empty($picture))
				{
					break;
				}
			}

			$imgPattern = '/[IMGs+WIDTHs*=s*d+s+HEIGHTs*=s*d+s*](.+?)[/IMG]/is'.BX_UTF_PCRE_MODIFIER;
			$videoPattern = '/[VIDEO[^]]*](.+?)[/VIDEO]/is'.BX_UTF_PCRE_MODIFIER;
			$detailText = BitrixSocialnetworkHelperMention::clear($row['DETAIL_TEXT']);

			if (
				preg_match_all($imgPattern, $detailText, $matches)
				&& !empty($matches[0])
				&& !empty($matches[0][0])
			)
			{
				if (
					$diskPicturePosition === false
					|| mb_strpos($detailTextInOneString, $matches[0][0]) < $diskPicturePosition
				)
				{
					$picture = [
						'alt' => '',
						'src' => $matches[1][0]
					];
				}
			}

			$parser = new blogTextParser(false, $pathToSmile, []);
			$parser->LAZYLOAD = "N";

			$postFields = $USER_FIELD_MANAGER->getUserFields("BLOG_POST", $row['ID'], LANGUAGE_ID);
			if (!empty($postFields["UF_BLOG_POST_FILE"]))
			{
				$parser->arUserfields = array("UF_BLOG_POST_FILE" => array_merge($postFields["UF_BLOG_POST_FILE"], ["TAG" => "DOCUMENT ID"]));
			}

			$clearedText = $detailText;

			$clearedText = preg_replace(
				[ $imgPattern, $videoPattern ],
				'',
				$clearedText
			);
			$clearedText = preg_replace(
				'/[URL(.*?)]([^]s]{20,})[/URL]/is'.BX_UTF_PCRE_MODIFIER,
				'',
				$clearedText
			);
			$clearedText = preg_replace(
				'/[URL(.*?)]((?:[^]s]{1,19}s+)+)[/URL]/is'.BX_UTF_PCRE_MODIFIER,
				'\2',
				$clearedText
			);
			$clearedText = preg_replace(
				'/[URL(.*?)]((?:[^]s]{1,19}s+)+)[/URL]/is'.BX_UTF_PCRE_MODIFIER,
				'\2',
				$clearedText
			);
			$clearedText = blogTextParser::killAllTags($clearedText);

			$title = (
				$row["MICRO"] == "Y"
					? truncateText($clearedText, 100)
					: htmlspecialcharsEx($row["TITLE"])
			);

			$authorAvatar = '';
			$authorName = '';
			if (intval($row['AUTHOR_AVATAR']) > 0)
			{
				$fileRes = FileTable::getById(intval($row['AUTHOR_AVATAR']));
				if ($fileFields = $fileRes->fetch())
				{
					$authorAvatar = [
						'alt' => '',
						'src' => CFile::getFileSrc($fileFields)
					];
				}
			}
			if (intval($row['AUTHOR_ID']) > 0)
			{
				$authorName = CUser::formatName(CSite::getNameFormat(), [
					"NAME" => $row["AUTHOR_NAME"],
					"LAST_NAME" => $row["AUTHOR_LAST_NAME"],
					"SECOND_NAME" => $row["AUTHOR_SECOND_NAME"],
					"LOGIN" => $row["AUTHOR_LOGIN"],
					"NAME_LIST_FORMATTED" => "",
				]);
			}
			if ($row['DATE_PUBLISH'] instanceof BitrixMainTypeDateTime)
			{
				$logDate = $row['DATE_PUBLISH']->format(BitrixMainTypeDate::getFormat());
			}

			$result[] = [
				'ID' => $row['ID'],
				'TITLE' => $title,
				'PREVIEW_TEXT' => truncateText($clearedText, 255),
				'DETAIL_TEXT' => $parser->convert($detailText, false, [], $allow, $parserParams),
				'PICTURE' => $picture,
				'AUTHOR_AVATAR' => $authorAvatar,
				'AUTHOR_NAME_FORMATTED' => $authorName,
				'LOG_DATE' => $logDate,
			];
		}
		if (!empty($result))
		{
			usort($result, function($a, $b) use ($blogPostIdList) {
				$keyA = array_search($a['ID'], $blogPostIdList);
				$keyB = array_search($b['ID'], $blogPostIdList);
				return ($keyA > $keyB) ? +1 : -1;
			});
		}
	}

	return $result;
}