• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/item/helper.php
  • Класс: BitrixSocialnetworkItemHelper
  • Вызов: Helper::addBlogPost
static function addBlogPost($params, $scope = Controller::SCOPE_AJAX, &$resultFields = [])
{
	global $USER, $CACHE_MANAGER, $APPLICATION;

	$siteId = (
		is_set($params, 'SITE_ID')
		&& !empty($params['SITE_ID'])
			? $params['SITE_ID']
			: SITE_ID
	);

	$authorId = (
		isset($params['USER_ID'])
		&& (int)$params['USER_ID'] > 0
		&& Livefeed::isAdmin()
			? $params['USER_ID']
			: $USER->getId()
	);

	if (!Loader::includeModule('blog'))
	{
		$APPLICATION->throwException(Loc::getMessage('SOCIALNETWORK_ITEM_HELPER_BLOG_MODULE_NOT_INSTALLED'), 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_MODULE_BLOG_NOT_INSTALLED');
		return false;
	}

	$blogGroupId = Option::get('socialnetwork', 'userbloggroup_id', false, $siteId);
	if (empty($blogGroupId))
	{
		$blogGroupIdList = ComponentHelper::getSonetBlogGroupIdList([
			'SITE_ID' => $siteId
		]);
		if (!empty($blogGroupIdList))
		{
			$blogGroupId = array_shift($blogGroupIdList);
		}
	}

	$blog = Blog::getByUser([
		'GROUP_ID' => $blogGroupId,
		'SITE_ID' => $siteId,
		'USER_ID' => $authorId,
		'CREATE' => 'Y'
	]);

	if (!$blog)
	{
		$APPLICATION->throwException('Blog not found', 'SONET_CONTROLLER_LIVEFEED_BLOG_NOT_FOUND');
		return false;
	}

	$connection = BitrixMainApplication::getConnection();
	$helper = $connection->getSqlHelper();

	$postFields = [
		'BLOG_ID' => $blog['ID'],
		'AUTHOR_ID' => $authorId,
		'=DATE_CREATE' => $helper->getCurrentDateTimeFunction(),
		'=DATE_PUBLISH' => $helper->getCurrentDateTimeFunction(),
		'MICRO' => 'N',
		'TITLE' => (($params['POST_TITLE'] ?? '') <> '' ? $params['POST_TITLE'] : ''),
		'DETAIL_TEXT' => $params['POST_MESSAGE'],
		'DETAIL_TEXT_TYPE' => 'text',
		'PUBLISH_STATUS' => BLOG_PUBLISH_STATUS_PUBLISH,
		'HAS_IMAGES' => 'N',
		'HAS_TAGS' => 'N',
		'HAS_SOCNET_ALL' => 'N'
	];

	$emailUserAllowed = (
		ModuleManager::isModuleInstalled('mail')
		&& ModuleManager::isModuleInstalled('intranet')
		&& (
			!Loader::includeModule('bitrix24')
			|| CBitrix24::isEmailConfirmed()
		)
	);

	if (
		!empty($params['DEST'])
		&& is_array($params['DEST'])
	)
	{
		$resultFields = [
			'ERROR_MESSAGE' => false,
			'PUBLISH_STATUS' => $postFields['PUBLISH_STATUS']
		];

		if ($emailUserAllowed)
		{
			$destinationList = $params['DEST'];
			ComponentHelper::processBlogPostNewMailUserDestinations($destinationList);
			$params['DEST'] = array_unique($destinationList);
		}

		$postFields['SOCNET_RIGHTS'] = ComponentHelper::checkBlogPostDestinationList([
			'DEST' => $params['DEST'],
			'SITE_ID' => $siteId,
			'AUTHOR_ID' => $authorId,
			'MOBILE' => ($params['MOBILE'] ?? 'N'),
		], $resultFields);

		if ($resultFields['ERROR_MESSAGE_PUBLIC'] ?? null)
		{
			return false;
		}

		if ($resultFields['ERROR_MESSAGE'])
		{
			$APPLICATION->throwException($resultFields['ERROR_MESSAGE']);
			return false;
		}

		$postFields['PUBLISH_STATUS'] = $resultFields['PUBLISH_STATUS'];
	}
	elseif (
		!empty($params['SPERM'])
		&& $scope === Controller::SCOPE_REST
	)
	{
		if ($emailUserAllowed)
		{
			$pseudoHttpPostFields = [
				'SPERM' => $params['SPERM'],
				'INVITED_USER_NAME' => (!empty($params['INVITED_USER_NAME']) && is_array($params['INVITED_USER_NAME']) ? $params['INVITED_USER_NAME'] : []),
				'INVITED_USER_LAST_NAME' => (!empty($params['INVITED_USER_NAME']) && is_array($params['INVITED_USER_LAST_NAME']) ? $params['INVITED_USER_LAST_NAME'] : []),
				'INVITED_USER_CRM_ENTITY' => (!empty($params['INVITED_USER_CRM_ENTITY']) && is_array($params['INVITED_USER_CRM_ENTITY']) ? $params['INVITED_USER_CRM_ENTITY'] : []),
				'INVITED_USER_CREATE_CRM_CONTACT' => (!empty($params['INVITED_USER_CREATE_CRM_CONTACT']) && is_array($params['INVITED_USER_CREATE_CRM_CONTACT']) ? $params['INVITED_USER_CREATE_CRM_CONTACT'] : []),
			];
			$temporaryParams = [
				'ALLOW_EMAIL_INVITATION' => true
			];
			ComponentHelper::processBlogPostNewMailUser($pseudoHttpPostFields, $temporaryParams);
			if (!empty($temporaryParams['ERROR_MESSAGE']))
			{
				$APPLICATION->throwException($temporaryParams['ERROR_MESSAGE'], 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_ADD_ERROR');
				return false;
			}

			$params['SPERM'] = $pseudoHttpPostFields['SPERM'];
		}

		$resultFields = [
			'ERROR_MESSAGE' => false,
			'PUBLISH_STATUS' => $postFields['PUBLISH_STATUS'],
		];

		$postFields['SOCNET_RIGHTS'] = ComponentHelper::convertBlogPostPermToDestinationList([
			'PERM' => $params['SPERM'],
			'IS_REST' => true,
			'AUTHOR_ID' => $authorId,
			'SITE_ID' => $siteId
		], $resultFields);

		$postFields['PUBLISH_STATUS'] = $resultFields['PUBLISH_STATUS'];
		if (!empty($resultFields['ERROR_MESSAGE']))
		{
			$APPLICATION->throwException($resultFields['ERROR_MESSAGE'], 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_ADD_ERROR');
			return false;
		}
	}
	elseif (
		!Loader::includeModule('extranet')
		|| CExtranet::isIntranetUser()
	)
	{
		$postFields['SOCNET_RIGHTS'] = [ 'UA' ];
	}

	if (empty($postFields['SOCNET_RIGHTS']))
	{
		$APPLICATION->throwException('No destination specified', 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_ADD_ERROR');
		return false;
	}

	if ((string)$postFields['TITLE'] === '')
	{
		$postFields['MICRO'] = 'Y';
		$postFields['TITLE'] = preg_replace([ "/n+/is" . BX_UTF_PCRE_MODIFIER, "/s+/is" . BX_UTF_PCRE_MODIFIER ], ' ', blogTextParser::killAllTags($postFields['DETAIL_TEXT']));
		$postFields['TITLE'] = trim($postFields['TITLE'], " tnrx0BxA0");
	}

	if (
		isset($params['IMPORTANT'])
		&& $params['IMPORTANT'] === 'Y'
	)
	{
		$postFields['UF_BLOG_POST_IMPRTNT'] = true;

		if (!empty($params['IMPORTANT_DATE_END']))
		{
			$endDate = CRestUtil::unConvertDate($params['IMPORTANT_DATE_END']);
			if ($endDate)
			{
				$postFields['UF_IMPRTANT_DATE_END'] = BitrixMainTypeDateTime::createFromUserTime($endDate);
			}
		}
	}

	if (isset($params['GRATITUDE_MEDAL'], $params['GRATITUDE_EMPLOYEES']))
	{
		$gratitudeElementId = BitrixSocialnetworkHelperGratitude::create([
			'medal' => $params['GRATITUDE_MEDAL'],
			'employees' => $params['GRATITUDE_EMPLOYEES']
		]);
		if ($gratitudeElementId)
		{
			$postFields['UF_GRATITUDE'] = $gratitudeElementId;
		}
	}

	if (
		!empty($params['UF_BLOG_POST_VOTE'])
		&& !empty($params['UF_BLOG_POST_VOTE_' . $params['UF_BLOG_POST_VOTE'] . '_DATA'])
	)
	{
		$postFields['UF_BLOG_POST_VOTE'] = $params['UF_BLOG_POST_VOTE'];
		$GLOBALS['UF_BLOG_POST_VOTE_' . $params['UF_BLOG_POST_VOTE'] . '_DATA'] = $params['UF_BLOG_POST_VOTE_' . $params['UF_BLOG_POST_VOTE'] . '_DATA'];
	}

	if (!empty($params['BACKGROUND_CODE']))
	{
		$postFields['BACKGROUND_CODE'] = $params['BACKGROUND_CODE'];
	}

	if (
		isset($params['PARSE_PREVIEW'])
		&& $params['PARSE_PREVIEW'] === 'Y'
		&& !empty($postFields['DETAIL_TEXT'])
		&& ($urlPreviewValue = ComponentHelper::getUrlPreviewValue($postFields['DETAIL_TEXT']))
	)
	{
		$postFields['UF_BLOG_POST_URL_PRV'] = $urlPreviewValue;
	}

	$result = CBlogPost::add($postFields);

	if (!$result)
	{
		$APPLICATION->throwException('Blog post hasn't been added', 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_ADD_ERROR');
		return false;
	}

	$socnetPerms = ComponentHelper::getBlogPostSocNetPerms([
		'postId' => $result,
		'authorId' => $postFields['AUTHOR_ID']
	]);

	BitrixMainFinderDestTable::merge([
		'CONTEXT' => 'blog_post',
		'CODE' => BitrixMainFinderDestTable::convertRights($socnetPerms, [ 'U' . $postFields['AUTHOR_ID'] ])
	]);

	if (
		isset($params['IMPORTANT'])
		&& $params['IMPORTANT'] === 'Y'
	)
	{
		CBlogUserOptions::setOption($result, 'BLOG_POST_IMPRTNT', 'Y', $authorId);

		if (defined('BX_COMP_MANAGED_CACHE'))
		{
			$CACHE_MANAGER->clearByTag('blogpost_important_all');
		}
	}

	$categoryIdList = BitrixSocialnetworkComponentBlogPostEditTag::parseTagsFromFields([
		'postFields' => $postFields,
		'blogId' => $blog['ID'],
	]);
	if (!empty($categoryIdList))
	{
		foreach ($categoryIdList as $categoryId)
		{
			CBlogPostCategory::add([
				'BLOG_ID' => $postFields['BLOG_ID'],
				'POST_ID' => $result,
				'CATEGORY_ID' => $categoryId
			]);
		}

		CBlogPost::update(
			$result,
			[
				'CATEGORY_ID' => implode(',', $categoryIdList),
				'HAS_TAGS' => 'Y'
			]
		);
	}

	if (
		Option::get('disk', 'successfully_converted', false)
		&& Loader::includeModule('disk')
		&& ($storage = BitrixDiskDriver::getInstance()->getStorageByUserId($authorId))
		&& ($folder = $storage->getFolderForUploadedFiles())
	)
	{
		$filesList = [];

		if (
			isset($params['FILES'])
			&& is_array($params['FILES'])
			&& $scope === Controller::SCOPE_REST
		)
		{
			foreach ($params['FILES'] as $fileData)
			{
				$fileFields = CRestUtil::saveFile($fileData);

				if (is_array($fileFields))
				{
					$file = $folder->uploadFile(
						$fileFields, // file array
						[
							'NAME' => $fileFields['name'],
							'CREATED_BY' => $authorId
						],
						[],
						true
					);

					if ($file)
					{
						$filesList[] = FileUserType::NEW_FILE_PREFIX . $file->getId();
					}
				}
			}
		}
		elseif (
			isset($params['UF_BLOG_POST_FILE'])
			&& is_array($params['UF_BLOG_POST_FILE'])
		)
		{
			$filesList = $params['UF_BLOG_POST_FILE'];
		}

		if (!empty($filesList)) // update post
		{
			CBlogPost::update(
				$result,
				[
					'HAS_PROPS' => 'Y',
					'UF_BLOG_POST_FILE' => $filesList
				]
			);
		}
	}

	$pathToPost = BitrixSocialnetworkHelperPath::get('userblogpost_page', $siteId);

	$postFields['ID'] = $result;

	$postUrl = CComponentEngine::makePathFromTemplate(htmlspecialcharsBack($pathToPost), [
		'post_id' => $result,
		'user_id' => $blog['OWNER_ID']
	]);

	if ($postFields['PUBLISH_STATUS'] === BLOG_PUBLISH_STATUS_PUBLISH)
	{
		$paramsNotify = [
			'bSoNet' => true,
			'allowVideo' => Option::get('blog', 'allow_video', 'Y'),
			'PATH_TO_POST' => $pathToPost,
			'user_id' => $authorId,
			'NAME_TEMPLATE' => CSite::getNameFormat(null, $siteId),
		];

		$logId = CBlogPost::notify($postFields, $blog, $paramsNotify);
		if (
			$logId
			&& ($post = Post::getById($result))
		)
		{
			CSocNetLog::update($logId, [
				'EVENT_ID' => self::getBlogPostEventId([
					'postId' => $post->getId()
				]),
				'SOURCE_ID' => $result, // table column field
				'TAG' => $post->getTags(),
			]);
		}

		BXClearCache(true, ComponentHelper::getBlogPostCacheDir([
			'TYPE' => 'posts_last',
			'SITE_ID' => $siteId
		]));

		$mentionList = BitrixSocialnetworkHelperMention::getUserIds($postFields['DETAIL_TEXT']);

		ComponentHelper::notifyBlogPostCreated([
			'post' => [
				'ID' => $result,
				'TITLE' => $postFields['TITLE'],
				'AUTHOR_ID' => $authorId
			],
			'siteId' => $siteId,
			'postUrl' => $postUrl,
			'socnetRights' => ($logId ? LogRight::get($logId) : $postFields['SOCNET_RIGHTS']),
			'socnetRightsOld' => [],
			'mentionListOld' => [],
			'mentionList' => $mentionList
		]);
	}
	elseif (
		$postFields['PUBLISH_STATUS'] === BLOG_PUBLISH_STATUS_READY
		&& !empty($postFields['SOCNET_RIGHTS'])
	)
	{
		CBlogPost::notifyImReady([
			'TYPE' => 'POST',
			'POST_ID' => $result,
			'TITLE' => $postFields['TITLE'],
			'POST_URL' => $postUrl,
			'FROM_USER_ID' => $authorId,
			'TO_SOCNET_RIGHTS' => $postFields['SOCNET_RIGHTS']
		]);

		$resultFields['WARNING_MESSAGE_PUBLIC'] = Loc::getMessage('SOCIALNETWORK_ITEM_HELPER_MODERATION_WARNING');
	}

	foreach ($postFields['SOCNET_RIGHTS'] as $destination)
	{
		if (preg_match('/^SG(d+)/i', $destination, $matches))
		{
			CSocNetGroup::setLastActivity($matches[1]);
		}
	}

	return $result;
}