Your IP : 3.147.28.158


Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/disk/lib/uf/
Upload File :
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/disk/lib/uf/blogpostconnector.php

<?php

namespace Bitrix\Disk\Uf;

use Bitrix\Disk\Ui;
use Bitrix\Main\Application;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Type\DateTime;
use Bitrix\Socialnetwork\CommentAux;
use Bitrix\Disk\Configuration;
use Bitrix\Disk\AttachedObject;
use Bitrix\Socialnetwork\WorkgroupTable;

Loc::loadMessages(__FILE__);

final class BlogPostConnector extends Connector
{
	private $blogPostData;
	private $canRead = null;

	/**
	 * @return bool
	 */
	public function isAnonymousAllowed()
	{
		return true;
	}

	public static function createFromBlogPostCommentConnector(BlogPostCommentConnector $blogPostCommentConnector)
	{
		$connector = new static(null);
		$connector->loadBlogPostDataByCommentId($blogPostCommentConnector->entityId);
		$connector->entityId = $connector->blogPostData['ID'];

		return $connector;
	}

	public function getDataToShow()
	{
		if(!$this->loadBlogPostData())
		{
			return null;
		}
		return array(
			'TITLE' => Loc::getMessage('DISK_UF_BLOG_POST_CONNECTOR_TITLE'),
			'DETAIL_URL' => \CComponentEngine::makePathFromTemplate($this->blogPostData['PATH'], array('post_id' => $this->entityId, )),
			'DESCRIPTION' => Ui\Text::killTags($this->blogPostData['TITLE']),
			'MEMBERS' => $this->getDestinations(),
		);
	}

	public function addComment($authorId, array $data)
	{
		static $blogPostEventIdList = null;

		$this->loadBlogPostData();
		$commentFields = Array(
			"POST_ID" => $this->entityId,
			"BLOG_ID" => $this->blogPostData['BLOG_ID'],
			"POST_TEXT" => CommentAux\FileVersion::getPostText(),
			"DATE_CREATE" => new DateTime,
			"PARENT_ID" => false,
			"AUTHOR_ID" => $authorId,
			"HAS_PROPS" => 'Y',
		);
		if(!empty($data['fileId']))
		{
			$commentFields['UF_BLOG_COMMENT_FILE'] = array($data['fileId']);
		}
		elseif(!empty($data['versionId']))
		{
			$commentFields['UF_BLOG_COMMENT_FH'] = $data['versionId'];
		}

		$comId = \CBlogComment::add($commentFields);
		if(!$comId)
		{
			return;
		}

		if(!Loader::includeModule('socialnetwork'))
		{
			return;
		}

		$provider = CommentAux\Base::init(CommentAux\FileVersion::getType(), array(
			'liveParamList' => array(
				'userId' => $authorId,
				'userGender' => (isset($data['authorGender']) ? $data['authorGender'] : ''),
				'isEnabledKeepVersion' => Configuration::isEnabledKeepVersion()
			)
		));

		/** @noinspection PhpDynamicAsStaticMethodCallInspection */
		\CBlogComment::addLiveComment($comId, array(
			"MODE" => "PULL_MESSAGE",
			"AUX" => 'fileversion',
			"AUX_LIVE_PARAMS" => $provider->getLiveParams()
		));

		BXClearCache(true, "/blog/comment/".intval($this->entityId / 100)."/".$this->entityId."/");

		if ($blogPostEventIdList === null)
		{
			$blogPostLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\BlogPost;
			$blogPostEventIdList = $blogPostLivefeedProvider->getEventId();
		}

		$query = \CSocNetLog::getList(
			array("ID" => "DESC"),
			array(
				"EVENT_ID" => $blogPostEventIdList,
				"SOURCE_ID" => $this->entityId
			),
			false,
			false,
			array("ID", "TMP_ID")
		);
		$row = $query->fetch();
		if(!$row)
		{
			return;
		}
		$fieldsForSocnet = array(
			"ENTITY_TYPE" => SONET_ENTITY_USER,
			"ENTITY_ID" => $this->blogPostData["AUTHOR_ID"],
			"EVENT_ID" => "blog_comment",
			"=LOG_DATE" => Application::getInstance()->getConnection()->getSqlHelper()->getCurrentDateTimeFunction(),
			"MESSAGE" => "file",
			"TEXT_MESSAGE" => "file",
			"URL" => "",
			"MODULE_ID" => false,
			"SOURCE_ID" => $comId,
			"LOG_ID" => $row["ID"],
			"RATING_TYPE_ID" => "BLOG_COMMENT",
			"RATING_ENTITY_ID" => $comId,
			"USER_ID" => $authorId,
		);

		\CSocNetLogComments::add($fieldsForSocnet, false, false, false);
	}

	/**
	 * @param $userId
	 * @return bool
	 */
	public function canRead($userId)
	{
		if($this->canRead !== null)
		{
			return $this->canRead;
		}
		if(!Loader::includeModule('socialnetwork'))
		{
			return false;
		}
		$cacheTtl = 2592000;
		$cacheId = 'blog_post_socnet_general_' . $this->entityId . '_' . LANGUAGE_ID. '_diskconnector';
		$timezoneOffset = \CTimeZone::getOffset();
		if($timezoneOffset != 0)
		{
			$cacheId .= "_" . $timezoneOffset;
		}
		$cacheDir = '/blog/socnet_post/gen/' . intval($this->entityId / 100) . '/' . $this->entityId;

		$cache = new \CPHPCache;
		if($cache->initCache($cacheTtl, $cacheId, $cacheDir))
		{
			$post = $cache->getVars();
		}
		else
		{
			$cache->startDataCache();

			$queryPost = \CBlogPost::getList(array(), array("ID" => $this->entityId), false, false, array(
					"ID",
					"BLOG_ID",
					"PUBLISH_STATUS",
					"TITLE",
					"AUTHOR_ID",
					"ENABLE_COMMENTS",
					"NUM_COMMENTS",
					"VIEWS",
					"CODE",
					"MICRO",
					"DETAIL_TEXT",
					"DATE_PUBLISH",
					"CATEGORY_ID",
					"HAS_SOCNET_ALL",
					"HAS_TAGS",
					"HAS_IMAGES",
					"HAS_PROPS",
					"HAS_COMMENT_IMAGES"
				));
			$post = $queryPost->fetch();

			$cache->endDataCache($post);
		}
		if(!$post)
		{
			$this->canRead = false;
			return false;
		}
		/** @noinspection PhpDynamicAsStaticMethodCallInspection */
		$this->canRead = \CBlogPost::getSocNetPostPerms($this->entityId, true, $userId, $post["AUTHOR_ID"]) >= BLOG_PERMS_READ;

		if (!$this->canRead)
		{
			$perms = \CBlogPost::getSocNetPerms($this->entityId);
			$this->canRead = (
				is_array($perms)
				&& !empty($perms['UP'])
			);

			if(
				!$this->canRead
				&& !empty($perms['SG'])
			)
			{
				$sonetGroupsIdList = array_unique(array_keys($perms['SG']));
				if (
					!empty($sonetGroupsIdList)
					&& Loader::includeModule('socialnetwork')
				)
				{
					$res = WorkgroupTable::getList([
						'filter' => [
							'=LANDING' => 'Y',
							'=ACTIVE' => 'Y'
						],
						'limit' => 1
					]);
					if ($res->fetch())
					{
						$this->canRead = true;
					}
				}
			}
		}

		return $this->canRead;
	}

	/**
	 * @param $userId
	 * @return bool
	 */
	public function canUpdate($userId)
	{
		return $this->canRead($userId);
	}

	public function canConfidenceReadInOperableEntity()
	{
		return true;
	}

	public function canConfidenceUpdateInOperableEntity()
	{
		return true;
	}

	protected function loadBlogPostData()
	{
		if(isset($this->blogPostData))
		{
			return $this->blogPostData;
		}

		$this->blogPostData = \CBlogPost::getList(
			array(),
			array(
				'ID' => $this->entityId,
			),
			false,
			false,
			array(
				'ID', 'PATH', 'TITLE', 'BLOG_ID', 'AUTHOR_ID', 'HAS_SOCNET_ALL',
			)
		)->fetch();

		return $this->blogPostData;
	}

	protected function loadBlogPostDataByCommentId($commentId)
	{
		if(isset($this->blogPostData))
		{
			return $this->blogPostData;
		}

		$this->blogPostData = \CBlogPost::getList(
			array(),
			array(
				'COMMENT_ID' => (int)$commentId,
			),
			false,
			false,
			array(
				'ID', 'PATH', 'TITLE', 'BLOG_ID', 'AUTHOR_ID', 'HAS_SOCNET_ALL',
			)
		)->fetch();

		return $this->blogPostData;
	}

	protected function getDestinations()
	{
		$isExtranetInstalled = Loader::includeModule("extranet");

		$members = array();
		if($this->blogPostData["HAS_SOCNET_ALL"] != "Y")
		{
			/** @noinspection PhpDynamicAsStaticMethodCallInspection */
			$perm = \CBlogPost::getSocnetPermsName($this->entityId);
			foreach($perm as $type => $v)
			{
				foreach($v as $vv)
				{
					if($type == "SG")
					{
						/** @noinspection PhpDynamicAsStaticMethodCallInspection */
						if($socNetGroup = \CSocNetGroup::getByID($vv["ENTITY_ID"]))
						{
							$name = $socNetGroup["~NAME"];
							$link = \CComponentEngine::makePathFromTemplate($this->getPathToGroup(), array("group_id" => $vv["ENTITY_ID"]));

							$groupSiteID = false;
							/** @noinspection PhpDynamicAsStaticMethodCallInspection */
							$queryGroupSite = \CSocNetGroup::getSite($vv["ENTITY_ID"]);

							while($groupSite = $queryGroupSite->fetch())
							{
								/** @noinspection PhpDynamicAsStaticMethodCallInspection */
								if(!$isExtranetInstalled || $groupSite["LID"] != \CExtranet::getExtranetSiteID()
								)
								{
									$groupSiteID = $groupSite["LID"];
									break;
								}
							}

							if($groupSiteID)
							{
								/** @noinspection PhpDynamicAsStaticMethodCallInspection */
								$tmp = \CSocNetLogTools::processPath(array("GROUP_URL" => $link), $this->getUser()->getId(), $groupSiteID); // user_id is not important parameter
								$link = (strlen($tmp["URLS"]["GROUP_URL"]) > 0 ? $tmp["URLS"]["GROUP_URL"] : $link);
							}
							$isExtranet = (is_array($GLOBALS["arExtranetGroupID"]) && in_array($vv["ENTITY_ID"], $GLOBALS["arExtranetGroupID"]));

							$members[] = array(
								"NAME" => $name,
								"LINK" => $link,
								'AVATAR_SRC' => Ui\Avatar::getGroup($socNetGroup['IMAGE_ID']),
								"IS_EXTRANET" => ($isExtranet ? "Y" : "N")
							);
						}
					}
					elseif($type == "U")
					{
						if(in_array("US" . $vv["ENTITY_ID"], $vv["ENTITY"]))
						{
							array_unshift($members, array(
								"NAME" => Loc::getMessage('DISK_UF_BLOG_POST_CONNECTOR_MEMBERS_ALL'),
								"LINK" => null,
								'AVATAR_SRC' => Ui\Avatar::getDefaultGroup(),
								"IS_EXTRANET" => "N",
							));
						}
						else
						{
							$name = \CUser::formatName('#NAME# #LAST_NAME#', array(
								"NAME" => $vv["~U_NAME"],
								"LAST_NAME" => $vv["~U_LAST_NAME"],
								"SECOND_NAME" => $vv["~U_SECOND_NAME"],
								"LOGIN" => $vv["~U_LOGIN"],
								"NAME_LIST_FORMATTED" => "",
							), false);
							$isExtranet = (is_array($GLOBALS["arExtranetUserID"]) && in_array($vv["ENTITY_ID"], $GLOBALS["arExtranetUserID"]));

							$members[] = array(
								"NAME" => $name,
								"LINK" => \CComponentEngine::makePathFromTemplate($this->getPathToUser(), array("user_id" => $vv["ENTITY_ID"])),
								'AVATAR_SRC' => Ui\Avatar::getPerson($vv['U_PERSONAL_PHOTO']),
								"IS_EXTRANET" => ($isExtranet ? "Y" : "N")
							);
						}
					}
					elseif($type == "DR")
					{
						$members[] = array(
							"NAME" => $vv["EL_NAME"],
							"LINK" => null,
							'AVATAR_SRC' => Ui\Avatar::getDefaultGroup(),
							"IS_EXTRANET" => "N",
						);
					}
				}
			}
		}
		else
		{
			$members[] = array(
				"NAME" => Loc::getMessage('DISK_UF_BLOG_POST_CONNECTOR_MEMBERS_ALL'),
				"LINK" => null,
				'AVATAR_SRC' => Ui\Avatar::getDefaultGroup(),
				"IS_EXTRANET" => "N",
			);
		}

		return $members;
	}

	public static function clearCacheByObjectId($id)
	{
		$attachedObjects = AttachedObject::getModelList(array(
			'filter' => array(
				'=ENTITY_TYPE' => self::className(),
				'=OBJECT_ID' => $id,
			))
		);

		foreach($attachedObjects as $attachedObject)
		{
			BXClearCache(true, "/blog/socnet_post/".intval($attachedObject->getEntityId() / 100)."/".$attachedObject->getEntityId()."/");
		}
	}
}