/** * Уровень доступа к текущей задаче * * @return int */ public function getLevelForCurrentTask() { $level = ACCESS_LEVEL_NO_ACCESS; $task = CSession::getCurrentTask(); if (!is_null($task)) { if ($this->getRoles()->hasElement($task->getId())) { $personTask = $this->getRoles()->getItem($task->getId()); $level = $personTask->level; } } return $level; }
/** * Собираем данные для сабформы поиска */ private function initGlobalSearchSubform() { $search = array(); /** * Инициализация левой части с параметрами поиска */ if (CRequest::getGlobalFilterClass() != "") { $modelMeta = CCoreObjectsManager::getCoreModel(CRequest::getGlobalFilterClass()); if (!is_null($modelMeta)) { $globalSearch = CRequest::getGlobalFilter(); if ($globalSearch["field"] !== false) { /** * Получаем название поля, по которому в данный * момент выполняется поиск */ $translations = $modelMeta->getTranslationDefault(); $filterValue = $globalSearch["value"]; if (CRequest::getString("filterLabel") != "") { $filterValue = CRequest::getString("filterLabel"); } $search[$globalSearch["field"]] = $filterValue; if (array_key_exists($globalSearch["field"], $translations)) { unset($search[$globalSearch["field"]]); $search[$translations[$globalSearch["field"]]] = $filterValue; } } } } $this->setData("__search", $search); /** * Поиск только в рамках текущей задачи */ $this->setData("__current_task", ""); if (!is_null(CSession::getCurrentTask())) { $this->setData("__current_task", CSession::getCurrentTask()->getId()); } CSession::setCurrentController($this); $this->setData("__controller", $this); }
/** * Обновление поискового запроса с учетом прав доступа * Делается из допущения, что текущая задача - эта задача, по * которой выполняется основной запрос * * @return bool */ private function updateQueryForACLLimitations() { /** * Для начала проверим, что текущая задача определяется * Если не определяется, то менять ничего мы не можем - * данных недостаточно */ $task = CSession::getCurrentTask(); if (is_null($task)) { return false; } /** * Теперь проверим, что найденная задача связана с какой-либо моделью * Если модель определить не можем, то тоже выходим */ $targetModel = null; foreach ($task->models->getItems() as $model) { if (mb_strtolower($model->getModelTable()) == mb_strtolower($this->getTableName())) { $targetModel = $model; } } if (is_null($targetModel)) { return false; } /** * Теперь проверим, поддерживает ли эта модель работу с readers/authors-полями * Если таких полей нет, то тоже нет смысла что-либо проверять */ if ($targetModel->getReadersFields()->getCount() == 0) { return false; } /** * Если у пользователя нет доступа к текущей задаче, то * ставим в поля, регламентирующие доступ 0 - нулевого пользователя у нас точно нет * * Если доступ на чтение/запись только своего, то добавляем в readers-поля * id текущего пользователя */ $q = array(); if (CSession::getCurrentUser()->getLevelForCurrentTask() == ACCESS_LEVEL_NO_ACCESS) { foreach ($targetModel->getReadersFields()->getItems() as $field) { $q[] = "(" . $this->getTableAlias() . "." . $field->field_name . "= 0)"; } } elseif (CSession::getCurrentUser()->getLevelForCurrentTask() == ACCESS_LEVEL_READ_OWN_ONLY || CSession::getCurrentUser()->getLevelForCurrentTask() == ACCESS_LEVEL_WRITE_OWN_ONLY) { foreach ($targetModel->getReadersFields()->getItems() as $field) { $q[] = "(" . $this->getTableAlias() . "." . $field->field_name . "=" . CSession::getCurrentPerson()->getId() . ")"; } } if (count($q) > 0) { $query = $this->getQuery(); $condition = $query->getCondition(); if (!is_null($condition)) { $condition .= " AND "; } $condition .= "(" . implode(" OR ", $q) . ")"; $this->getQuery()->condition($condition); } }