Your IP : 3.133.124.52


Current Path : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/modules/vote/lib/uf/
Upload File :
Current File : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/modules/vote/lib/uf/manager.php

<?php

namespace Bitrix\Vote\Uf;

use Bitrix\Vote\Attach;
use Bitrix\Vote\Attachment\Connector;
use Bitrix\Vote\Attachment\DefaultConnector;
use Bitrix\Vote\Attachment\BlogPostConnector;
use Bitrix\Vote\Attachment\ForumMessageConnector;
use Bitrix\Main\ErrorCollection;
use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Main\SystemException;

final class Manager
{
	/** @var  ErrorCollection */
	protected $errorCollection;

	protected $params;

	protected $additionalConnectorList = null;
	/** @var Attach[]  */
	protected $loadedAttachedObjects = array();

	protected static $instance = array();

	private $int = 0;

	/**
	 * Constructor of UserFieldManager.
	 * @param array $params
	 */
	public function __construct(array $params)
	{
		$this->params = $params;
		$this->params['ENTITY_VALUE_ID'] = $this->params['ENTITY_VALUE_ID'] ?? null;
		$this->params['VALUE_ID'] = $this->params['VALUE_ID'] ?? null;
		$this->errorCollection = new ErrorCollection();
	}

	/**
	 * Returns instance of Manager.
	 * @param array $params Array (
			[ID] => 29
			[ENTITY_ID] => BLOG_POST
			[FIELD_NAME] => UF_BLOG_POST_VOTE
			[USER_TYPE_ID] => vote
			[XML_ID] => UF_BLOG_POST_VOTE
			[SORT] => 100
			[MULTIPLE] => N
			[MANDATORY] => N
			[SHOW_FILTER] => N
			[SHOW_IN_LIST] => Y
			[EDIT_IN_LIST] => Y
			[IS_SEARCHABLE] => N
			[SETTINGS] => Array
				(
					[CHANNEL_ID] => 1
					[UNIQUE] => 8
					[UNIQUE_IP_DELAY] => Array
						(
							[DELAY] =>
							[DELAY_TYPE] => S
						)

					[NOTIFY] => I
				)

			[EDIT_FORM_LABEL] => UF_BLOG_POST_VOTE
			[LIST_COLUMN_LABEL] =>
			[LIST_FILTER_LABEL] =>
			[ERROR_MESSAGE] =>
			[HELP_MESSAGE] =>
			[USER_TYPE] => Array
				(
					[USER_TYPE_ID] => vote
					[CLASS_NAME] => Bitrix\Vote\Uf\VoteUserType
					[DESCRIPTION] => "Vote"
					[BASE_TYPE] => int
				)

			[VALUE] => 27
			[ENTITY_VALUE_ID] => 247)).
	 * @return Manager
	 */
	public static function getInstance(array $params)
	{
		$id = md5(serialize($params));
		if (!array_key_exists($id, self::$instance))
		{
			self::$instance[$id] = new static($params);
		}
		return self::$instance[$id];
	}

	/**
	 * Returns attached object by id.
	 * @param int $id Id of attached object.
	 * @return Attach
	 */
	public function loadFromAttachId($id)
	{
		if(!isset($this->loadedAttachedObjects[$id]))
		{
			$this->loadedAttachedObjects[$id] = \Bitrix\Vote\Attachment\Manager::loadFromAttachId($id);
		}
		return $this->loadedAttachedObjects[$id];
	}

	/**
	 * Returns vote object by id.
	 * @param int $id Id of vote.
	 * @return Attach
	 */
	public function loadFromVoteId($id)
	{
		$id1 = VoteUserType::NEW_VOTE_PREFIX.$id;
		if(!isset($this->loadedAttachedObjects[$id1]))
		{
			[$entityType, $moduleId] = $this->getConnectorDataByEntityType($this->params["ENTITY_ID"]);
			$attach = \Bitrix\Vote\Attachment\Manager::loadFromVoteId(array(
				"ENTITY_ID" => ($this->params["ENTITY_VALUE_ID"]  ?: $this->params["VALUE_ID"]), // http://hg.office.bitrix.ru/repos/modules/rev/b614a075ce64
				"ENTITY_TYPE" => $entityType,
				"MODULE_ID" => $moduleId), $id);
			$this->loadedAttachedObjects[$id1] = $attach;
		}
		return $this->loadedAttachedObjects[$id1];
	}

	/**
	 * @return \Bitrix\Vote\Attach
	 */
	public function loadEmptyObject()
	{
		[$entityType, $moduleId] = $this->getConnectorDataByEntityType($this->params["ENTITY_ID"]);
		return \Bitrix\Vote\Attachment\Manager::loadEmptyAttach(array(
			"ENTITY_ID" => ($this->params["ENTITY_VALUE_ID"] ?: $this->params["VALUE_ID"]), // http://hg.office.bitrix.ru/repos/modules/rev/b614a075ce64,
			"ENTITY_TYPE" => $entityType,
			"MODULE_ID" => $moduleId), array(
			"CHANNEL_ID" => $this->params["SETTINGS"]["CHANNEL_ID"]
		));
	}

	/**
	 * @return Attach[]
	 */
	public function loadFromEntity()
	{
		[$entityType, $moduleId] = $this->getConnectorDataByEntityType($this->params["ENTITY_ID"]);
		$res = array(
			"ENTITY_ID" => ($this->params["ENTITY_VALUE_ID"] ?: $this->params["VALUE_ID"]), // http://hg.office.bitrix.ru/repos/modules/rev/b614a075ce64
			"=ENTITY_TYPE" => $entityType,
			"=MODULE_ID" => $moduleId);
		return \Bitrix\Vote\Attachment\Manager::loadFromEntity($res);
	}
	/**
	 * Checks attitude attached object to entity.
	 * @param Attach $attachedObject Attached object.
	 * @param string $entityType Entity type (ex. blog_post).
	 * @param int $entityId Id of entity.
	 * @return bool
	 */
	public function belongsToEntity(Attach $attachedObject, $entityType, $entityId)
	{
		[$connectorClass, $moduleId] = $this->getConnectorDataByEntityType($entityType);

		return
			$attachedObject->getEntityId()   == $entityId &&
			$attachedObject->getModuleId()   == $moduleId &&
			$attachedObject->getEntityType() == $connectorClass;
	}
	/**
	 * Gets data which describes specific connector by entity type.
	 * @param string $entityType Entity type (ex. sonet_comment).
	 * @return array|null Array with two elements: connector class and module.
	 */
	public function getConnectorDataByEntityType($entityType)
	{
		$defaultConnectors = $this->getDefaultConnectors();
		$entityType = mb_strtolower($entityType);

		if(isset($defaultConnectors[$entityType]))
			return $defaultConnectors[$entityType];
		if (($connector = $this->getAdditionalConnector($entityType)) !== null)
			return $connector;
		return array(DefaultConnector::className(), 'vote');
	}

	/**
	 * Returns full list of available connectors for attached objects.
	 *
	 * @return array
	 */
	public function getConnectors()
	{
		return array_merge($this->getDefaultConnectors(), $this->getAdditionalConnectors());
	}

	private function getDefaultConnectors()
	{
		return array(
			'blog_post' => array(BlogPostConnector::className(), 'blog'),
			'forum_message' => array(ForumMessageConnector::className(), 'forum')
		);
	}


	private function getAdditionalConnectors()
	{
		if($this->additionalConnectorList === null)
		{
			$this->buildAdditionalConnectorList();
		}

		return $this->additionalConnectorList;
	}

	private function getAdditionalConnector($entityType)
	{
		$additionalConnectorList = $this->getAdditionalConnectors();

		return isset($additionalConnectorList[$entityType])? $additionalConnectorList[$entityType] : null;
	}

	private function buildAdditionalConnectorList()
	{
		$this->additionalConnectorList = array();

		$event = new Event("vote", "onBuildAdditionalConnectorList");
		$event->send();

		foreach($event->getResults() as $evenResult)
		{
			if($evenResult->getType() != EventResult::SUCCESS)
			{
				continue;
			}

			$result = $evenResult->getParameters();
			if(!is_array($result))
			{
				throw new SystemException('Wrong event result by building AdditionalConnectorList. Must be array.');
			}

			foreach($result as $connector)
			{
				if(empty($connector['ENTITY_TYPE']))
				{
					throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find ENTITY_TYPE.');
				}

				if(empty($connector['MODULE_ID']))
				{
					throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find MODULE_ID.');
				}

				if(empty($connector['CLASS']))
				{
					throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find CLASS.');
				}

				if(is_string($connector['CLASS']) && class_exists($connector['CLASS']) && is_a($connector['CLASS'], Connector::class, true))
				{
					$this->additionalConnectorList[mb_strtolower($connector['ENTITY_TYPE'])] = array(
						$connector['CLASS'],
						$connector['MODULE_ID']
					);
				}
				else
				{
					throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find class by CLASS.');
				}
			}
		}
	}

	/**
	 * Shows component to edit vote.
	 * @param array &$params Component parameters.
	 * @param array &$result Component results.
	 * @param null $component Component.
	 * @return void
	 */
	public function showEdit(&$params, &$result, $component = null)
	{
		global $APPLICATION;
		$APPLICATION->IncludeComponent(
			"bitrix:voting.uf",
			".default",
			array(
				'EDIT' => 'Y',
				'PARAMS' => $params,
				'RESULT' => $result,
			),
			$component,
			array("HIDE_ICONS" => "Y")
		);
	}

	/**
	 * Shows component to participate in vote
	 * @param array &$params Component parameters.
	 * @param array &$result Component results.
	 * @param null $component Component.
	 * @return void
	 */
	public function showView(&$params, &$result, $component = null)
	{
		global $APPLICATION;
		$APPLICATION->IncludeComponent(
			"bitrix:voting.uf",
			".default",
			array(
				"PARAMS" => $params,
				"RESULT" => $result
			),
			$component,
			array("HIDE_ICONS" => "Y")
		);
	}

	/**
	 * Getting array of errors.
	 * @return array
	 */
	public function getErrors()
	{
		return $this->errorCollection->toArray();
	}
}