public function save() { $group = $this->group; $roles = array(); if (array_key_exists("roles", $group)) { $roles = $group["roles"]; unset($group["roles"]); } $groupObj = new CUserGroup(); $groupObj->setAttributes($group); /** * Удаляем старые задачи группы и пользователей */ foreach (CActiveRecordProvider::getWithCondition(TABLE_USER_GROUP_HAS_ROLES, "user_group_id = " . $groupObj->getId())->getItems() as $ar) { $ar->remove(); } $groupObj->save(); /** * Создаем новые задачи группы и пользователей */ foreach ($roles as $role => $level) { if ($level != 0) { $ar = new CActiveRecord(array("id" => null, "user_group_id" => $groupObj->getId(), "task_id" => $role, "task_rights_id" => $level)); $ar->setTable(TABLE_USER_GROUP_HAS_ROLES); $ar->insert(); } } }
public function save() { parent::save(); /** * У сотрудников, которых нет приказов по * ГАК в году комиссии автоматически устанавливается * приказ от комиссии */ if ($this->order_id !== 0) { $persons = new CArrayList(); foreach ($this->members->getItems() as $person) { $persons->add($person->getId(), $person); } if (!is_null($this->manager)) { $persons->add($this->manager->getId(), $this->manager); } foreach ($persons->getItems() as $person) { if (is_null($person->getSABOrdersByYear($this->year))) { $ar = new CActiveRecord(array("id" => null, "person_id" => $person->getId(), "year_id" => $this->year->getId(), "order_id" => $this->order_id)); $ar->setTable(TABLE_SAB_PERSON_ORDERS); $ar->insert(); } } } }
public function save() { $this->grant->save(); /** * Работа с участниками */ $members = array(); if (array_key_exists("members", $this->_fields)) { $members = $this->_fields["members"]; } /** * Делаем руководителя тоже участником */ if ($this->grant->manager_id != "0") { $members[] = $this->grant->manager_id; } /** * Удаляем старых участников */ foreach (CActiveRecordProvider::getWithCondition(TABLE_GRANT_MEMBERS, "grant_id= " . $this->grant->getId())->getItems() as $ar) { $ar->remove(); } /** * Добавляем новых */ foreach ($members as $member) { $ar = new CActiveRecord(array("id" => null, "grant_id" => $this->grant->getId(), "person_id" => $member)); $ar->setTable(TABLE_GRANT_MEMBERS); $ar->insert(); } }
public function save() { $commission = $this->commission; $members = array(); if (array_key_exists("members", $commission)) { $members = $commission["members"]; unset($commission["members"]); } $commObj = new CDiplomPreviewComission(); $commObj->setAttributes($commission); $commObj->save(); $this->commission = $commObj; foreach (CActiveRecordProvider::getWithCondition(TABLE_DIPLOM_PREVIEW_MEMBERS, "comm_id=" . $commObj->getId())->getItems() as $ar) { $ar->remove(); } foreach ($members as $m) { if ($m !== 0) { $ar = new CActiveRecord(array("comm_id" => $commObj->getId(), "kadri_id" => $m, "id" => null)); $ar->setTable(TABLE_DIPLOM_PREVIEW_MEMBERS); $ar->insert(); } } }
public function save() { $personArr = $this->person; /** * Сохраняем сотрудника */ $this->person->save(); /** * Удаляем старые типы участия на кафедре */ foreach (CActiveRecordProvider::getWithCondition(TABLE_PERSON_BY_TYPES, "kadri_id=" . $this->person->getId())->getItems() as $ar) { $ar->remove(); } /** * Сохраняем новые типы участия на кафедре */ foreach ($this->_types as $type) { if ($type != "" && $type != "0") { $ar = new CActiveRecord(array("kadri_id" => $this->person->getId(), "person_type_id" => $type, "id" => null)); $ar->setTable(TABLE_PERSON_BY_TYPES); $ar->insert(); } } }
/** * Уникальные по заданному ключу и условию записи из таблицы * * @param $table * @param $condition * @param $field * @return CRecordSet */ public static function getDistinctWithCondition($table, $condition, $field) { $key = $table . "_" . $condition . "_distinct_" . $field; if (!self::getCache()->hasElement($key)) { $q = new CQuery(); $res = new CRecordSet(); $res->setManualAdd(true); $q->select("DISTINCT(" . $field . "), id")->from($table)->condition($condition . " GROUP BY " . $field); $r = $q->execute(); foreach ($r->getItems() as $item) { $record = new CActiveRecord($item); $record->setTable($table); $distinct = self::getById($table, $record->getId()); $res->add($res->getCount(), $distinct); } self::getCache()->add($key, $res); } return self::getCache()->getItem($key); }
/** * Обновление модели на основе данных, пришедших из json-контроллера * * @param $jsonString * @return array */ public function updateWithJsonString($jsonString) { // данные модели $modelData = json_decode($jsonString, true); // убираем служебную инфу if (array_key_exists("_translation", $modelData)) { unset($modelData["_translation"]); } // попробуем сохранить данные, которые находятся в отношениях // многие-ко-многим foreach ($this->relations() as $field => $properties) { if ($properties["relationPower"] == RELATION_MANY_TO_MANY) { if (array_key_exists($field, $modelData)) { $data = $modelData[$field]; // уберем их из модели unset($modelData[$field]); // уберем уже имеющиеся данные из связанной таблицы /** * @var CActiveRecord $ar */ if (array_key_exists("id", $modelData)) { foreach (CActiveRecordProvider::getWithCondition($properties["joinTable"], trim(CUtils::strLeft($properties["leftCondition"], "=")) . "=" . $modelData["id"])->getItems() as $ar) { $ar->remove(); } } // добавим туда новые данные foreach ($data as $value) { $ar = new CActiveRecord(array($properties["rightKey"] => $value["id"], trim(CUtils::strLeft($properties["leftCondition"], "=")) => $modelData["id"], "id" => null)); $ar->setTable($properties["joinTable"]); $ar->insert(); } } } elseif ($properties["relationPower"] == RELATION_HAS_MANY) { if (array_key_exists($field, $modelData)) { $data = $modelData[$field]; // уберем данные из модели unset($modelData[$field]); // если в свойствах отношения указан целевой класс, то // будем обновлять автоматом if (array_key_exists("targetClass", $properties)) { // получим список записей, которые уже есть $targetClass = $properties["targetClass"]; /** * @var CActiveModel $targetObj */ $targetObj = new $targetClass(); $docsToRemove = array(); // его может не быть, если запись новая if (array_key_exists("id", $modelData)) { $items = CActiveRecordProvider::getWithCondition($targetObj->getTable(), trim(CUtils::strLeft($properties["storageCondition"], "=")) . "=" . $modelData["id"]); /** * @var CActiveRecord $item */ foreach ($items->getItems() as $item) { $docsToRemove[] = $item->getId(); } } /** * @var string $item */ foreach ($data as $item) { // полученные данные обратно в json, чтобы // можно было все сделать одинаково рекурсивно $childJsonData = json_encode($item); // создадим экземпляр целевого класса /** * @var CActiveModel $targetObj */ $targetObj = new $targetClass(); $targetObj->updateWithJsonString($childJsonData); $targetObj->save(); // уберем из списка добавленную запись if (in_array($targetObj->getId(), $docsToRemove)) { unset($docsToRemove[array_search($targetObj->getId(), $docsToRemove)]); } } // удалим элементы из списка на удаление - мы // их удалили и вместе с другими данными с клиента // они не пришли if (count($docsToRemove) > 0) { CActiveRecordProvider::removeWithCondition($targetObj->getTable(), "id in (" . implode(", ", $docsToRemove) . ")"); } } } } } // данные обратно в модель foreach ($modelData as $key => $value) { $this->{$key} = $value; } return $modelData; }
/** * Разбитый на страницы набор данных * * @return CArrayList */ public function getPaginated() { /** * Разбивка на страницы на случай, если записи добавлялись вручную * и на случай, если рекордсет получен из таблицы */ if ($this->_manualAdded) { $res = new CArrayList(); $i = 0; $start = ($this->getCurrentPage() - 1) * $this->getPageSize(); $end = $this->getCurrentPage() * $this->getPageSize(); foreach ($this->getItems() as $key => $value) { if ($i >= $start && $i < $end) { $res->add($key, $value); } $i++; } return $res; } else { $res = new CArrayList(); $query = $this->getQuery(); /** * Использование глобального поиск и глобальных сортировок */ if ($this->_useGlobalSearch) { // глобальный поиск $globalFilter = CRequest::getGlobalFilter(); if ($globalFilter["field"] !== false) { $condition = $query->getCondition(); if (is_numeric($globalFilter["value"])) { if ($condition != "") { $condition .= " AND " . $globalFilter["field"] . '=' . $globalFilter["value"]; } else { $condition = $globalFilter["field"] . '=' . $globalFilter["value"]; } } else { if ($condition != "") { $condition .= " AND " . $globalFilter["field"] . " like '%" . $globalFilter["value"] . "%'"; } else { $condition = $globalFilter["field"] . " like '%" . $globalFilter["value"] . "%'"; } } $query->condition($condition); } // глобальные сортировки $globalOrder = CRequest::getGlobalOrder(); if ($globalOrder["field"] !== false) { $query->order($globalOrder["field"] . " " . $globalOrder["direction"]); } } /** * Использование глобального ограничения доступа */ if ($this->_isAclControlledSet) { $this->updateQueryForACLLimitations(); } if ($this->getPageSize() != PAGINATION_ALL) { $start = ($this->getCurrentPage() - 1) * $this->getPageSize(); $query->limit($start, $this->getPageSize()); } $items = $query->execute(); foreach ($items->getItems() as $item) { $ar = new CActiveRecord($item); $ar->setTable($query->getTable()); $res->add($ar->getId(), $ar); } return $res; } }
/** * Сохранение данных поручим модели чтобы * контроллер не нагружать */ public function save() { /** * Извлечем все данные из текущей модели. * Мы будем сохранять их по отдельности */ $user = $this->user; $roles = array(); $groups = array(); if (array_key_exists("groups", $user)) { $groups = $user["groups"]; unset($user["groups"]); } if (array_key_exists("roles", $user)) { $roles = $user["roles"]; unset($user["roles"]); } $userObj = new CUser(); $userObj->setAttributes($user); if ($this->changePassword == 1) { if ($this->newPassword !== "") { $userObj->password = md5($this->newPassword); } } $userObj->save(); $this->user = $userObj; /** * Удаляем старые упоминания о группах, в которых * пользователь состоял */ foreach (CActiveRecordProvider::getWithCondition(TABLE_USER_IN_GROUPS, "user_id = " . $userObj->getId())->getItems() as $ar) { $ar->remove(); } foreach ($groups as $group) { $ar = new CActiveRecord(array("user_id" => $userObj->getId(), "group_id" => $group, "id" => null)); $ar->setTable(TABLE_USER_IN_GROUPS); $ar->insert(); } /** * Исключаем из личных прав пользователей те, которые совпадают с правами * на задачу * * 08.11.2014 * Больше так не делаем - пусть система работает тривиально. Если это * личные права, то они до конца личные * foreach ($userObj->getGroups()->getItems() as $group) { foreach ($group->getRoles()->getItems() as $role) { if (array_key_exists($role->getId(), $roles)) { if ($role->level == $roles[$role->getId()]) { unset($roles[$role->getId()]); } } } } */ /** * Удаляем старые и сохраняем отличающиеся */ foreach (CActiveRecordProvider::getWithCondition(TABLE_USER_HAS_ROLES, "user_id = " . $userObj->getId())->getItems() as $ar) { $ar->remove(); } /** * Сохраняем личные права пользователя */ foreach ($roles as $role => $level) { /** * Можно индивидуально запрещать доступ к задаче */ // if ($level != 0) { $ar = new CActiveRecord(array("id" => null, "user_id" => $userObj->getId(), "task_id" => $role, "task_rights_id" => $level)); $ar->setTable(TABLE_USER_HAS_ROLES); $ar->insert(); // } } }