/** * 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) { $entityType = strtolower($entityType); switch ($entityType) { case 'blog_comment': return array(BlogPostCommentConnector::className(), 'blog'); case 'blog_post': return array(BlogPostConnector::className(), 'blog'); case 'calendar_event': return array(CalendarEventConnector::className(), 'calendar'); case 'forum_message': return array(ForumMessageConnector::className(), 'forum'); case 'tasks_task': return array(TaskConnector::className(), 'tasks'); case 'sonet_log': return array(SonetLogConnector::className(), 'socialnetwork'); case 'sonet_comment': return array(SonetCommentConnector::className(), 'socialnetwork'); case 'iblock_element': return array(IblockElementConnector::className(), 'iblock'); case 'iblock_workflow': return array(IblockWorkflowConnector::className(), 'iblock'); } $data = $this->getAdditionalConnector($entityType); return $data === null ? array(StubConnector::className(), Driver::INTERNAL_MODULE_ID) : $data; }
/** * Gets fields which Externalizer or Internalizer should modify. * @return array */ public function getFieldsForMap() { return array('CREATE_TIME' => array('IN' => function ($externalValue) { return \CRestUtil::unConvertDateTime($externalValue); }, 'OUT' => function (DateTime $internalValue = null) { return \CRestUtil::convertDateTime($internalValue); }), 'ENTITY_TYPE' => array('IN' => function ($externalValue) { switch ($externalValue) { case 'blog_comment': return BlogPostCommentConnector::className(); case 'blog_post': return BlogPostConnector::className(); case 'calendar_event': return CalendarEventConnector::className(); case 'forum_message': return ForumMessageConnector::className(); case 'tasks_task': return TaskConnector::className(); case 'sonet_log': return SonetLogConnector::className(); case 'sonet_comment': return SonetCommentConnector::className(); } return null; }, 'OUT' => function ($internalValue) { switch ($internalValue) { case BlogPostCommentConnector::className(): return 'blog_comment'; case BlogPostConnector::className(): return 'blog_post'; case CalendarEventConnector::className(): return 'calendar_event'; case ForumMessageConnector::className(): return 'forum_message'; case TaskConnector::className(): return 'tasks_task'; case SonetLogConnector::className(): return 'sonet_log'; case SonetCommentConnector::className(): return 'sonet_comment'; } return null; })); }
/** * @param $userId * @return bool */ public function canRead($userId) { if ($this->canRead !== null) { return $this->canRead; } if (($res = $this->getDataToCheck($this->entityId)) && !empty($res)) { list($message, $topic) = $res; $entityId = null; $entityType = null; if (!empty($topic["XML_ID"])) { $entityId = substr($topic["XML_ID"], strrpos($topic["XML_ID"], "_") + 1); $entityType = substr($topic["XML_ID"], 0, strrpos($topic["XML_ID"], "_")); } switch ($entityType) { case "TASK": if (Loader::includeModule("tasks")) { $connector = new TaskConnector($entityId, $this->attachedObject); $this->canRead = $connector->canRead($userId); return $this->canRead; } break; case "EVENT": if (Loader::includeModule("calendar")) { $connector = new CalendarEventConnector($entityId, $this->attachedObject); $this->canRead = $connector->canRead($userId); return $this->canRead; } break; case "IBLOCK": if ((int) $topic["USER_ID"] > 0 && Loader::includeModule("socialnetwork")) { $codes = array(); if (($res = \CSocNetLog::getList(array(), array("SOURCE_ID" => $entityId, "EVENT_ID" => array("photo_photo", "news", "wiki")), false, false, array("ID"))->fetch()) && $res) { $db_res = \CSocNetLogRights::getList(array(), array("LOG_ID" => $res["ID"])); while ($res = $db_res->fetch()) { $codes[] = $res["GROUP_CODE"]; } } $this->canRead = $this->canAccess($userId, $codes); return $this->canRead; } $this->canRead = true; return $this->canRead; case "MEETING": $this->canRead = (int) $message["FORUM_ID"] == (int) \COption::getOptionInt('meeting', 'comments_forum_id', 0, SITE_ID); return $this->canRead; case "TIMEMAN_ENTRY": if (Loader::includeModule("timeman")) { $dbEntry = \CTimeManEntry::getList(array(), array("ID" => $entityId), false, false, array("ID", "USER_ID")); if ($arEntry = $dbEntry->fetch()) { if ($arEntry["USER_ID"] == $userId) { $this->canRead = true; return $this->canRead; } else { $arManagers = \CTimeMan::getUserManagers($arEntry["USER_ID"]); $this->canRead = in_array($userId, $arManagers); return $this->canRead; } } } $this->canRead = false; return $this->canRead; case "TIMEMAN_REPORT": if (Loader::includeModule("timeman")) { $dbReport = \CTimeManReportFull::getList(array(), array("ID" => $entityId), array("ID", "USER_ID")); if ($arReport = $dbReport->fetch()) { if ($arReport["USER_ID"] == $userId) { $this->canRead = true; return $this->canRead; } else { $arManagers = \CTimeMan::getUserManagers($arReport["USER_ID"]); $this->canRead = in_array($userId, $arManagers); return $this->canRead; } } } $this->canRead = false; return $this->canRead; case "WF": $this->canRead = false; if (Loader::includeModule("bizproc")) { $currentUserId = (int) $this->getUser()->getId(); $participants = \CBPTaskService::getWorkflowParticipants($entityId); if (in_array($currentUserId, $participants)) { $this->canRead = true; } else { $state = \CBPStateService::getWorkflowStateInfo($entityId); if ($state && $currentUserId === (int) $state['STARTED_BY']) { $this->canRead = true; } } } return $this->canRead; } if ((!empty($topic["SOCNET_GROUP_ID"]) || !empty($topic["OWNER_ID"])) && Loader::includeModule("socialnetwork")) { if (!empty($topic["SOCNET_GROUP_ID"])) { $this->canRead = \CSocNetFeatures::isActiveFeature(SONET_ENTITY_GROUP, $topic["SOCNET_GROUP_ID"], "forum") && \CSocNetFeaturesPerms::canPerformOperation($userId, SONET_ENTITY_GROUP, $topic["SOCNET_GROUP_ID"], "forum", "view"); return $this->canRead; } else { $this->canRead = \CSocNetFeatures::isActiveFeature(SONET_ENTITY_USER, $topic["OWNER_ID"], "forum") && \CSocNetFeaturesPerms::canPerformOperation($userId, SONET_ENTITY_USER, $topic["OWNER_ID"], "forum", "view"); return $this->canRead; } } if ($message) { $user = $this->getUser(); if ($user && $userId == $user->getId()) { $userGroups = $user->getUserGroupArray(); } else { $userGroups = array(2); } /** @noinspection PhpDynamicAsStaticMethodCallInspection */ if (\CForumUser::isAdmin($userId, $userGroups)) { $this->canRead = true; return $this->canRead; } /** @noinspection PhpDynamicAsStaticMethodCallInspection */ $perms = \CForumNew::getUserPermission($message["FORUM_ID"], $userGroups); if ($perms >= "Y") { $this->canRead = true; return $this->canRead; } if ($perms < "E" || $perms < "Q" && $message["APPROVED"] != "Y") { $this->canRead = false; return $this->canRead; } /** @noinspection PhpDynamicAsStaticMethodCallInspection */ $forum = \CForumNew::getByID($message["FORUM_ID"]); $this->canRead = $forum["ACTIVE"] == "Y"; return $this->canRead; } } $this->canRead = false; return $this->canRead; }