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

	$postId = (int) ($params['POST_ID'] ?? null);

	if ($postId <= 0)
	{
		$APPLICATION->throwException('Wrong post ID', 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_UPDATE_ERROR');
		return false;
	}

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

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

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

	$currentUserPerm = self::getBlogPostPerm([
		'USER_ID' => $currentUserId,
		'POST_ID' => $postId
	]);

	if ($currentUserPerm <= Permissions::WRITE)
	{
		$APPLICATION->throwException('No write perms', 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_UPDATE_ERROR');
		return false;
	}

	$postFields = Post::getById($postId)->getFields();
	if (empty($postFields))
	{
		$APPLICATION->throwException('No post found', 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_UPDATE_ERROR');
		return false;
	}

	$blog = Blog::getByUser([
		'GROUP_ID' => Option::get('socialnetwork', 'userbloggroup_id', false, $siteId),
		'SITE_ID' => $siteId,
		'USER_ID' => $postFields['AUTHOR_ID']
	]);

	if (!$blog)
	{
		$APPLICATION->throwException('No blog found', 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_UPDATE_ERROR');
		return false;
	}

	$updateFields = [
		'PUBLISH_STATUS' => $postFields['PUBLISH_STATUS']
	];

	$updateFields['TITLE'] = '';
	$updateFields['MICRO'] = 'N';

	if (isset($params['POST_TITLE']))
	{
		$updateFields['TITLE'] = $params['POST_TITLE'];
	}

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

	if (($params['POST_MESSAGE'] ?? '') <> '')
	{
		$updateFields['DETAIL_TEXT'] = $params['POST_MESSAGE'];
	}

	if (!empty($params['DEST']))
	{
		if (
			ModuleManager::isModuleInstalled('mail')
			&& ModuleManager::isModuleInstalled('intranet')
			&& (
				!Loader::includeModule('bitrix24')
				|| CBitrix24::isEmailConfirmed()
			)
		)
		{
			$destinationList = $params['DEST'];
			ComponentHelper::processBlogPostNewMailUserDestinations($destinationList);
			$params['DEST'] = array_unique($destinationList);
		}

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

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

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

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

		$updateFields['PUBLISH_STATUS'] = $resultFields['PUBLISH_STATUS'];
	}

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

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

	if (isset($params['GRATITUDE_MEDAL']))
	{
		if (
			!empty($params['GRATITUDE_MEDAL'])
			&& isset($params['GRATITUDE_EMPLOYEES'])
		)
		{
			$gratitudeElementId = BitrixSocialnetworkHelperGratitude::create([
				'medal' => $params['GRATITUDE_MEDAL'],
				'employees' => $params['GRATITUDE_EMPLOYEES']
			]);
			if ($gratitudeElementId)
			{
				$updateFields['UF_GRATITUDE'] = $gratitudeElementId;
				$updateFields['HAS_PROPS'] = 'Y';
			}
		}
		else
		{
			$updateFields['UF_GRATITUDE'] = false;
		}
	}

	if (isset($params['UF_BLOG_POST_VOTE']))
	{
		if (
			!empty($params['UF_BLOG_POST_VOTE'])
			&& !empty($params['UF_BLOG_POST_VOTE_' . $params['UF_BLOG_POST_VOTE'] . '_DATA'])
		)
		{
			$updateFields['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'];
			$updateFields['HAS_PROPS'] = 'Y';
		}
		else
		{
			$updateFields['UF_BLOG_POST_VOTE'] = false;
		}
	}

	if (isset($params['BACKGROUND_CODE']))
	{
		$updateFields['BACKGROUND_CODE'] = (!empty($params['BACKGROUND_CODE']) ? $params['BACKGROUND_CODE'] : false);
	}

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

	if ($result = CBlogPost::update($postId, $updateFields))
	{
		if (
			Option::get('disk', 'successfully_converted', false)
			&& Loader::includeModule('disk')
			&& ($storage = BitrixDiskDriver::getInstance()->getStorageByUserId($postFields['AUTHOR_ID']))
			&& ($folder = $storage->getFolderForUploadedFiles())
		)
		{
			$filesList = [];

			$needToDelete = false;

			if (
				(
					!empty($params['FILES'])
					|| !empty($params['UF_BLOG_POST_FILE'])
				)
				&& $scope === Controller::SCOPE_REST
			)
			{
				$postUF = $USER_FIELD_MANAGER->getUserFields('BLOG_POST', $postId, LANGUAGE_ID);
				if (
					!empty($postUF['UF_BLOG_POST_FILE'])
					&& !empty($postUF['UF_BLOG_POST_FILE']['VALUE'])
				)
				{
					$filesList = array_merge($filesList, $postUF['UF_BLOG_POST_FILE']['VALUE']);
				}

				if (!empty($params['FILES']))
				{
					foreach ($params['FILES'] as $key => $fileData)
					{
						if (
							$fileData === 'del'
							&& in_array($key, $filesList)
						)
						{
							foreach ($filesList as $i => $v)
							{
								if ($v == $key)
								{
									unset($filesList[$i]);
									$needToDelete = true;
								}
							}
						}
						else
						{
							$fileFields = CRestUtil::saveFile($fileData);

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

								if ($file)
								{
									$filesList[] = FileUserType::NEW_FILE_PREFIX . $file->getId();
								}
							}
						}
					}
				}
				elseif (
					isset($params['UF_BLOG_POST_FILE'])
					&& is_array($params['UF_BLOG_POST_FILE'])
				)
				{
					if (
						count($params['UF_BLOG_POST_FILE']) === 1
						&& $params['UF_BLOG_POST_FILE'][0] === 'empty'
					)
					{
						$filesList = [];
						$needToDelete = true;
					}
					else
					{
						$filesList = array_unique(array_merge($filesList, array_map(static function($value) {
							return (
								preg_match('/^' . FileUserType::NEW_FILE_PREFIX . '(d+)$/i', $value)
									? $value
									: (int)$value
							);
						}, $params['UF_BLOG_POST_FILE'])));
					}
				}
			}
			elseif (
				!empty($params['UF_BLOG_POST_FILE'])
				&& $scope === Controller::SCOPE_AJAX
			)
			{
				$filesList = array_unique(array_merge($filesList, array_map(static function($value) {
					return (
					preg_match('/^' . FileUserType::NEW_FILE_PREFIX . '(d+)$/i', $value)
						? $value
						: (int)$value
					);
				}, $params['UF_BLOG_POST_FILE'])));
			}

			if (
				!empty($filesList)
				|| $needToDelete
			)
			{
				CBlogPost::update($postId, [
					'HAS_PROPS' => 'Y',
					'UF_BLOG_POST_FILE' => $filesList
				]);
			}
		}

		BXClearCache(true, ComponentHelper::getBlogPostCacheDir([
			'TYPE' => 'post',
			'POST_ID' => $postId
		]));
		BXClearCache(true, ComponentHelper::getBlogPostCacheDir([
			'TYPE' => 'post_general',
			'POST_ID' => $postId
		]));
		BXClearCache(true, ComponentHelper::getBlogPostCacheDir([
			'TYPE' => 'posts_popular',
			'SITE_ID' => $siteId
		]));

		$updateFields['AUTHOR_ID'] = $postFields['AUTHOR_ID'];

		if ($postFields['PUBLISH_STATUS'] === BLOG_PUBLISH_STATUS_PUBLISH)
		{
			if ($updateFields['PUBLISH_STATUS'] === BLOG_PUBLISH_STATUS_DRAFT)
			{
				CBlogPost::deleteLog($postId);
			}
			elseif ($updateFields['PUBLISH_STATUS'] === BLOG_PUBLISH_STATUS_PUBLISH)
			{
				CBlogPost::updateLog($postId, $updateFields, $blog, [
					'allowVideo' => Option::get('blog', 'allow_video', 'Y'),
					'PATH_TO_SMILE' => false
				]);
			}
		}

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

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

	return $result;
}