/**
  * Проверяем, что текущий пользователь имеет право редактировать записи
  *
  * @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);
 }
예제 #5
0
 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");
 }
예제 #8
0
 /**
  * Валидация модели по указанному событию
  *
  * @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;
 }