* */ /** * Модуль опросов * * @package application.modules.poll * @since 2.0 */ class ModulePoll extends ModuleORM { /** * Объект текущего пользователя * * @var ModuleUser_EntityUser|null */ protected $oUserCurrent; protected $aTargetTypes = array( 'topic' => array(), ); /** * Инициализация * */ public function Init() { parent::Init(); $this->oUserCurrent = $this->User_GetUserCurrent(); } /** * Возвращает список типов объектов * * @return array */ public function GetTargetTypes() { return $this->aTargetTypes; } /** * Добавляет в разрешенные новый тип * * @param string $sTargetType Тип * @param array $aParams Параметры * @return bool */ public function AddTargetType($sTargetType, $aParams = array()) { if (!array_key_exists($sTargetType, $this->aTargetTypes)) { $this->aTargetTypes[$sTargetType] = $aParams; return true; } return false; } /** * Проверяет разрешен ли данный тип * * @param string $sTargetType Тип * @return bool */ public function IsAllowTargetType($sTargetType) { return in_array($sTargetType, array_keys($this->aTargetTypes)); } /** * Возвращает парметры нужного типа * * @param string $sTargetType * * @return mixed */ public function GetTargetTypeParams($sTargetType) { if ($this->IsAllowTargetType($sTargetType)) { return $this->aTargetTypes[$sTargetType]; } } /** * Проверка объекта target - владелец медиа * * @param string $sTargetType Тип * @param int $iTargetId ID владельца * @return bool */ public function CheckTarget($sTargetType, $iTargetId) { if (!$this->IsAllowTargetType($sTargetType)) { return false; } $sMethod = 'CheckTarget' . func_camelize($sTargetType); if (method_exists($this, $sMethod)) { return $this->$sMethod($iTargetId); } return false; } /** * Заменяет временный идентификатор на необходимый ID объекта * * @param string $sTargetType * @param string $sTargetId * @param null|string $sTargetTmp Если не задан, то берется их куки "poll_target_tmp_{$sTargetType}" */ public function ReplaceTargetTmpById($sTargetType, $sTargetId, $sTargetTmp = null) { $sCookieKey = 'poll_target_tmp_' . $sTargetType; if (is_null($sTargetTmp) and isset($_COOKIE[$sCookieKey])) { $sTargetTmp = $_COOKIE[$sCookieKey]; setcookie($sCookieKey, null, -1, Config::Get('sys.cookie.path'), Config::Get('sys.cookie.host')); } if (is_string($sTargetTmp)) { $aPollItems = $this->Poll_GetPollItemsByTargetTmpAndTargetType($sTargetTmp, $sTargetType); foreach ($aPollItems as $oPoll) { $oPoll->setTargetTmp(null); $oPoll->setTargetId($sTargetId); $oPoll->Update(); } } } /** * Возвращает список опросов для объекта * * @param string $sTargetType * @param string $sTargetId * * @return mixed */ public function GetPollItemsByTarget($sTargetType, $sTargetId) { $aFilter = array( 'target_type' => $sTargetType, 'target_id' => $sTargetId, '#with' => array('answers') ); if ($this->oUserCurrent) { $aFilter['#with']['vote_current'] = array('user_id' => $this->oUserCurrent->getId(), '#value-default' => false ); } else { $aFilter['#with']['vote_current'] = array('#value-set' => false); } $aPollItems = $this->Poll_GetPollItemsByFilter($aFilter); return $aPollItems; } /** * Проверка владельца с типом "topic" * Название метода формируется автоматически * * @param int $iTargetId ID владельца * @return bool */ public function CheckTargetTopic($iTargetId) { if ($oTopic = $this->Topic_GetTopicById($iTargetId)) { if (!$oTopicType = $this->Topic_GetTopicType($oTopic->getType()) or !$oTopicType->getParam('allow_poll')) { return false; } /** * Проверяем права на редактирование топика */ if ($this->ACL_IsAllowEditTopic($oTopic, $this->oUserCurrent)) { return true; } } return false; } }