/** * Сохранение данных поручим модели чтобы * контроллер не нагружать */ 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(); // } } }