• Модуль: mobile
  • Путь к файлу: ~/bitrix/modules/mobile/lib/livefeed/helper.php
  • Класс: BitrixMobileLivefeedHelper
  • Вызов: Helper::getBlogPostFullData
static function getBlogPostFullData(array $params = []): array
{
	global $USER, $USER_FIELD_MANAGER;

	$result = [];

	if (
		empty($params)
		|| !Loader::includeModule('socialnetwork')
		|| !Loader::includeModule('blog')
	)
	{
		return $result;
	}

	$postId = (int)($params['postId'] ?? 0);
	$siteId = ($params['siteId'] ?? SITE_ID);
	$nameTemplate = ($params['nameTemplate'] ?? CSite::getNameFormat(false, $siteId));
	$showLogin = (isset($params['showLogin']) && $params['showLogin'] === 'Y');
	$htmlEncode = (!isset($params['htmlEncode']) || $params['htmlEncode'] !== 'N');
	$previewImageSize = (isset($params['previewImageSize']) && (int)$params['previewImageSize'] > 0 ? (int)$params['previewImageSize'] : 144);
	$getAdditionalData = (isset($params['getAdditionalData']) && $params['getAdditionalData'] === 'Y');

	if ($postId <= 0)
	{
		return $result;
	}

	$blogPostFields = CBlogPost::getById($postId);
	if (empty($blogPostFields))
	{
		return $result;
	}

	$blogPostLivefeedProvider = new BitrixSocialnetworkLivefeedBlogPost;

	$res = CSocNetLog::getList(
		[],
		[
			'EVENT_ID' => $blogPostLivefeedProvider->getEventId(),
			'SOURCE_ID' => $postId
		],
		false,
		false,
		[ 'ID' ]
	);
	if (!($logEntryFields = $res->fetch()))
	{
		return $result;
	}

	$result['log_id'] = $logEntryFields['ID'];
	$result['post_user_id'] = $blogPostFields['AUTHOR_ID'];
	$result['PostPerm'] = CBlogPost::getSocNetPostPerms($postId, true, $USER->getId(), $blogPostFields['AUTHOR_ID']);
	if ($result['PostPerm'] < BLOG_PERMS_FULL)
	{
		return $result;
	}

	$rights = [];
	$res = CSocNetLogRights::getList([], [ 'LOG_ID' => $logEntryFields['ID'] ]);
	while ($rightFields = $res->fetch())
	{
		$rights[] = $rightFields['GROUP_CODE'];
	}

	$destinationsAll = CSocNetLogTools::formatDestinationFromRights($rights, [
		'CHECK_PERMISSIONS_DEST' => 'N',
		'DESTINATION_LIMIT' => 100,
		'NAME_TEMPLATE' => $nameTemplate,
		'SHOW_LOGIN' => ($showLogin ? 'Y' : 'N'),
		'HTML_ENCODE' => ($htmlEncode ? 'Y' : 'N'),
		'GET_AVATARS' => true,
		'AVATAR_SIZE' => 100,
	]);

	$destinationsAvailable = CSocNetLogTools::formatDestinationFromRights($rights, [
		'CHECK_PERMISSIONS_DEST' => 'Y',
		'DESTINATION_LIMIT' => 100,
		'NAME_TEMPLATE' => $nameTemplate,
		'SHOW_LOGIN' => ($showLogin ? 'Y' : 'N')
	]);

	if (count($destinationsAvailable) > 1) // not only author, so delete author
	{
		foreach ($destinationsAvailable as $key => $destination)
		{
			if (
				!empty($destination['TYPE'])
				&& $destination['TYPE'] === 'U'
				&& !empty($destination['ID'])
				&& (int)$destination['ID'] === (int)$blogPostFields['AUTHOR_ID']
			)
			{
				unset($destinationsAvailable[$key]);
				break;
			}
		}
	}

	$destinationCodesList = [];
	foreach($destinationsAvailable as $destination)
	{
		if (
			!empty($destination['TYPE'])
			&& !empty($destination['ID'])
		)
		{
			$destinationCodesList[] = $destination['TYPE'].$destination['ID'];
		}
	}

	$result['PostDestination'] = [];
	$result['PostDestinationHidden'] = [];

	foreach ($destinationsAll as $destination)
	{
		if (
			!empty($destination['TYPE'])
			&& !empty($destination['ID'])
		)
		{
			$destCode = $destination['TYPE'].$destination['ID'];
			if (in_array($destCode, $destinationCodesList, true))
			{
				$result['PostDestination'][] = $destination;
			}
			else
			{
				$result['PostDestinationHidden'][] = [
					'TYPE' => $destination['TYPE'],
					'ID' => $destination['ID']
				];
			}
		}
		else
		{
			$result['PostDestination'][] = $destination;
		}
	}

	$result['PostDetailText'] = BitrixMainTextEmoji::decode(htmlspecialcharsback($blogPostFields['DETAIL_TEXT']));
	$result['PostTitle'] = ($blogPostFields['MICRO'] !== 'Y' ? $blogPostFields['TITLE'] : '');
	$diskOrWebDavInstalled = (ModuleManager::isModuleInstalled('disk') || ModuleManager::isModuleInstalled('webdav'));

	$ufCode = (
		$diskOrWebDavInstalled
			? 'UF_BLOG_POST_FILE'
			: 'UF_BLOG_POST_DOC'
	);

	$result['PostUFCode'] = $ufCode;

	$result['PostFiles'] = CMobileHelper::getUFForPostForm([
		'ENTITY_TYPE' => 'BLOG_POST',
		'ENTITY_ID' => $postId,
		'UF_CODE' => $ufCode,
		'IS_DISK_OR_WEBDAV_INSTALLED' => $diskOrWebDavInstalled,
		'PREVIEW_IMAGE_SIZE' => $previewImageSize
	]);

	$result['PostBackgroundCode'] = ($blogPostFields['BACKGROUND_CODE'] ?? '');

	if ($getAdditionalData)
	{
		$blogPostUserFields = $USER_FIELD_MANAGER->getUserFields('BLOG_POST', $postId, LANGUAGE_ID);

		$result['PostImportantData'] = [];
		if (isset($blogPostUserFields['UF_BLOG_POST_IMPRTNT']))
		{
			$result['PostImportantData']['value'] = ((int)$blogPostUserFields['UF_BLOG_POST_IMPRTNT']['VALUE'] > 0 ? 'Y' : 'N');
			if (isset($blogPostUserFields['UF_IMPRTANT_DATE_END']))
			{
				$result['PostImportantData']['endDate'] = MakeTimeStamp($blogPostUserFields['UF_IMPRTANT_DATE_END']['VALUE']);
			}
		}

		$result['PostGratitudeData'] = [];
		if (
			isset($blogPostUserFields['UF_GRATITUDE']['VALUE'])
			&& (int)$blogPostUserFields['UF_GRATITUDE']['VALUE'] > 0
			&& Loader::includeModule('iblock')
		)
		{
			$gratitudesIblockId = BitrixSocialnetworkHelperGratitude::getIblockId();
			if ($gratitudesIblockId)
			{
				$res = BitrixIblockElementPropertyTable::getList([
					'filter' => [
						'=IBLOCK_ELEMENT_ID' => (int)$blogPostUserFields['UF_GRATITUDE']['VALUE'],
						'=PROPERTY.CODE' => [ 'GRATITUDE', 'USERS' ]
					],
					'runtime' => [
						new ReferenceField(
							'PROPERTY',
							BitrixIblockPropertyTable::class,
							[ '=this.IBLOCK_PROPERTY_ID' => 'ref.ID' ],
							[ 'join_type' => 'INNER' ]
						)
					],
					'select' => [
						'IBLOCK_PROPERTY_ID',
						'VALUE',
						'VALUE_ENUM',
						'VALUE_XML_ID' => 'ENUM.XML_ID',
						'PROPERTY_CODE' => 'PROPERTY.CODE'
					]
				]);

				while($prop = $res->fetch())
				{
					switch($prop['PROPERTY_CODE'])
					{
						case 'GRATITUDE':
							$result['PostGratitudeData']['gratitude'] = $prop['VALUE_XML_ID'];
							break;
						case 'USERS':
							if (!isset($result['PostGratitudeData']['employees']))
							{
								$result['PostGratitudeData']['employees'] = [];
							}
							$result['PostGratitudeData']['employees'][] = [
								'id' => (int)$prop['VALUE'],
								'title' => '',
								'subtitle' => '',
								'imageUrl' => '',
							];
							break;
						default:
					}
				}

				if (
					!empty($result['PostGratitudeData']['employees'])
					&& is_array($result['PostGratitudeData']['employees'])
				)
				{
					$userData = [];
					$res = UserTable::getList([
						'filter' => [
							'=ID' => array_map(static function($item) {
								return $item['id'];
							}, $result['PostGratitudeData']['employees'])
						],
						'select' => [ 'ID', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'LOGIN', 'WORK_POSITION', 'PERSONAL_PHOTO', 'PERSONAL_GENDER' ]
					]);
					while($userFields = $res->fetch())
					{
						$userData[(int)$userFields['ID']] = $userFields;
					}

					foreach($result['PostGratitudeData']['employees'] as $key => $user)
					{
						if (!isset($userData[$user['id']]))
						{
							continue;
						}

						$result['PostGratitudeData']['employees'][$key]['title'] = CUser::formatName(CSite::getNameFormat(), $userData[$user['id']], true, false);
						$result['PostGratitudeData']['employees'][$key]['subtitle'] =  $userData[$user['id']]['WORK_POSITION'];

						$fileId = (int)$userData[$user['id']]['PERSONAL_PHOTO'];
						if ($fileId <= 0)
						{
							switch ($userData[$user['id']]['PERSONAL_GENDER'])
							{
								case 'M':
									$suffix = 'male';
									break;
								case 'F':
									$suffix = 'female';
									break;
								default:
									$suffix = 'unknown';
							}
							$fileId = Option::get('socialnetwork', 'default_user_picture_'.$suffix, false, SITE_ID);
						}

						if ($fileId > 0)
						{
							$imageFile = CFile::getFileArray($fileId);
							if ($imageFile !== false)
							{
								$file = CFile::resizeImageGet(
									$imageFile,
									[ 'width' => 150, 'height' => 150 ],
									BX_RESIZE_IMAGE_EXACT,
									false
								);
								$result['PostGratitudeData']['employees'][$key]['imageUrl'] = CHTTP::URN2URI(CHTTP::urnEncode($file['src']));
							}
						}
					}
				}
			}
		}

		$result['PostVoteData'] = [];
		if (
			isset($blogPostUserFields['UF_BLOG_POST_VOTE']['VALUE'])
			&& (int)$blogPostUserFields['UF_BLOG_POST_VOTE']['VALUE'] > 0
			&& Loader::includeModule('vote')
			&& ($userFieldManager = BitrixVoteUfManager::getInstance($blogPostUserFields['UF_BLOG_POST_VOTE']))
			&& ($attach = $userFieldManager->loadFromAttachId((int)$blogPostUserFields['UF_BLOG_POST_VOTE']['VALUE']))
		)
		{
			$result['PostVoteData']['questions'] = [];

			foreach ($attach['QUESTIONS'] as $question)
			{
				$answers = [];

				foreach ($question['ANSWERS'] as $answer)
				{
					$answers[] = [
						'value' => $answer['MESSAGE']
					];
				}

				$result['PostVoteData']['questions'][] = [
					'value' => $question['QUESTION'],
					'allowMultiSelect' => ($question['FIELD_TYPE'] === '1' ? 'Y' : 'N'),
					'answers' => $answers
				];
			}
		}
	}

	return $result;
}