/modules/vote/lib/uf/manager.php
PHP | 329 lines | 194 code | 33 blank | 102 comment | 18 complexity | 1575b4969985f0efde91d915daa28209 MD5 | raw file
- <?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->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();
- }
- }