/** * Проверяем, что текущий пользователь имеет право редактировать записи * * @param CModel $model * @return bool */ public function onUpdate(CModel $model) { $result = true; if (CSession::getCurrentUser()->getLevelForCurrentTask() == ACCESS_LEVEL_NO_ACCESS) { /** * Проверим, что пользователь имеет доступ к текущей задаче */ $result = false; } elseif (CSession::getCurrentUser()->getLevelForCurrentTask() == ACCESS_LEVEL_READ_OWN_ONLY || CSession::getCurrentUser()->getLevelForCurrentTask() == ACCESS_LEVEL_READ_ALL) { /** * Пользователь с правом только на чтение не может что-либо сохранять */ $result = false; } elseif (CSession::getCurrentUser()->getLevelForCurrentTask() == ACCESS_LEVEL_WRITE_OWN_ONLY) { /** * Проверим, что текущий пользователь есть в authors-полях модели, * которую будет сохранять */ $result = false; $coreModel = CCoreObjectsManager::getCoreModel($model); if (is_null($coreModel)) { /** * Если модели нет, то будем считать, что отвалидировано * успешно. Иначе сломается все остальное */ $result = true; } else { if ($coreModel->getAuthorsFields()->getCount() == 0) { /** * Не стопорим систему если она не настроена. * Если поля не указаны, то не валидируем */ $result = true; } else { /** * Проверяем, что текущий пользователь прописан в authors-полях модели */ foreach ($coreModel->getAuthorsFields()->getItems() as $field) { $fieldName = $field->field_name; if ($model->{$fieldName} == CSession::getCurrentPerson()->getId()) { $result = true; } } } } } return $result; }
public function save() { $model = CCoreObjectsManager::getCoreModel($this->id); foreach ($this->getItems()->getItems() as $item) { $field = new CCoreModelField(); $field->model_id = $model->getId(); $field->field_name = $item["name"]; $field->save(); if ($item["translation"] !== "") { $t = new CCoreModelFieldTranslation(); $t->field_id = $field->getId(); $t->value = $item["translation"]; $t->save(); } if ($item["validator"] !== "0") { $v = new CCoreModelFieldValidator(); $v->field_id = $field->getId(); $v->validator_id = $item["validator"]; $v->save(); } } }
/** * Валидаторы полей для модели * * @param CModel $model * @return array */ public static function getFieldValidators(CModel $model) { $validators = array(); /** * Сначала получаем валидаторы из модели */ foreach ($model->getValidationRules() as $type => $fields) { foreach ($fields as $field) { $v = array(); if (array_key_exists($field, $validators)) { $v = $validators[$field]; } $v[] = $type; $validators[$field] = $v; } } /** * Теперь берем валидаторы из базы */ $persistedModel = CCoreObjectsManager::getCoreModel(get_class($model)); if (!is_null($persistedModel)) { foreach ($persistedModel->fields->getItems() as $field) { foreach ($field->validators->getItems() as $validator) { $v = array(); if (array_key_exists($field->field_name, $validators)) { $v = $validators[$field->field_name]; } if (!is_null($validator->getValidatorObject())) { $v[] = $validator->getValidatorObject(); } $validators[$field->field_name] = $v; } } } return $validators; }
/** * Собираем данные для сабформы поиска */ 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); }
public static function addObject(CActiveModel $model) { $doc = self::createSolrInputDocument($model, true, true); $response = self::getClient()->addDocument($doc); /** * Непосредственно связанные объекты */ foreach ($model->getRelations() as $name => $params) { if ($params["relationPower"] == RELATION_HAS_ONE) { $obj = $model->{$name}; if (!is_null($obj)) { $modelMeta = CCoreObjectsManager::getCoreModel(get_class($obj)); if (!is_null($modelMeta)) { if ($modelMeta->isExportable()) { $doc = self::createSolrInputDocument($obj, false, false); $doc->addField("_parent_class_", get_class($model)); $doc->addField("_parent_field_", self::getConditionField($params)); $response = self::getClient()->addDocument($doc); } } } } elseif ($params["relationPower"] == RELATION_HAS_MANY) { } elseif ($params["relationPower"] == RELATION_MANY_TO_MANY) { } elseif ($params["relationPower"] == RELATION_COMPUTED) { } } }
public function actionExport() { $metaModel = CCoreObjectsManager::getCoreModel(CRequest::getInt("id")); if (!$metaModel->isExportable()) { $this->redirect("models.php?action=edit&id=" . $metaModel->getId()); echo 1; return false; } $modelClass = $metaModel->class_name; $model = new $modelClass(); $records = CActiveRecordProvider::getAllFromTable($model->getRecord()->getTable()); foreach ($records->getItems() as $record) { $model = new $modelClass($record); CSolr::addObject($model); } CSolr::commit(); echo 1; }
public function actionGlobalSearch() { /** * Запрос, который отправил пользователь */ $userQuery = CRequest::getString("keyword"); /** * Задачи, в которые у него есть доступ */ $tasks = array(); foreach (CSession::getCurrentUser()->getRoles()->getItems() as $role) { $tasks[] = $role->getId(); } /** * Непосредственно, поиск */ $params = array("_is_main_" => 1, "_highlight_" => "doc_body"); $resultObj = CSolr::search($userQuery, $params); /** * Формируем модель данных для рисования результата */ $result = array(); $userQuery = mb_strtolower($userQuery); foreach ($resultObj->getDocuments() as $doc) { $hl = $resultObj->getHighlighingByDocument($doc); $res = array("text" => implode(", ", $hl)); /** * Получаем метамодель для этого типа объекта * Смотрим, какие задачи с ней связны */ $model = CCoreObjectsManager::getCoreModel($doc->_class_); $tasks = array(); if (!is_null($model)) { foreach ($model->tasks->getItems() as $task) { /** * Для каждой задачи формируем URL с фильтром */ $title = $task->name; $url = $task->url; $urlParams = array(); $urlParams[] = "filterClass=" . $doc->_class_; $urlParams[] = "filterLabel=" . str_replace("</em>", "", str_replace("<em>", "", implode(", ", $hl))); foreach ($model->fields->getItems() as $field) { if (property_exists($doc, $field->field_name)) { $fieldName = $field->field_name; $fieldValue = mb_strtolower($doc->{$fieldName}); if (mb_strpos($fieldValue, $userQuery) !== false) { if (mb_strlen($fieldValue) < 100) { $urlParams[] = "filter=" . $fieldName . ":" . $fieldValue; } else { $urlParams[] = "filter=" . $fieldName . ":" . $userQuery; } } } } $url .= "?" . implode("&", $urlParams); $tasks[$url] = $title; } } $res["tasks"] = $tasks; $result[] = $res; } /** * Склеиваем результаты с одинаковым текстом */ $outResults = array(); foreach ($result as $res) { $key = $res["text"]; if (array_key_exists($key, $outResults)) { $obj = $outResults[$key]; $tasks = $obj["tasks"]; foreach ($res["tasks"] as $url => $title) { $tasks[$url] = $title; } $obj["tasks"] = $tasks; } else { $obj = $res; } $outResults[$key] = $obj; } /** * Отображением */ $this->setData("results", $outResults); $this->renderView("_search/results.tpl"); }
/** * Валидация модели по указанному событию * * @param $event * @return bool */ protected function validateModel($event) { $isValid = true; /** * Валидация самой модели * Если текущая модель - наследник CFormModel, то, если не можем найти модель * для нее, смотрим модели объектов в публичных свойствах и валидируем их */ $modelsToValidate = array(); if (is_a($this, "CFormModel")) { $model = CCoreObjectsManager::getCoreModel($this); if (!is_null($model)) { $modelsToValidate[] = $this; } else { $publicVars = get_object_vars($this); foreach ($publicVars as $key => $value) { if (is_object($value)) { if (is_a($value, "CModel")) { $modelsToValidate[] = $value; } } } } } else { $modelsToValidate[] = $this; } foreach ($modelsToValidate as $model) { foreach (CCoreObjectsManager::getModelValidators($model)->getItems() as $validator) { if (!$validator->{$event}($model)) { $error = $validator->getError(); $this->getValidationErrors()->add($this->getValidationErrors()->getCount(), $error); $isValid = false; } } } return $isValid; }