public function getLastPage($user, $courseType) { $criteria = new CDbCriteria(); $criteria->with = array('page', 'page.day'); $criteria->compare('t.user_id', $user->id); $criteria->compare('t.course_type_id', $courseType->id); return LastReadPage::model()->find($criteria); }
/** * Метод перед удалением: * * @return void */ public function beforeDelete() { if (User::model()->admin()->count() === 1 && $this->_oldRole === User::getSuperuserRole()) { $this->addError('role', Yii::t('UserModule.user', 'You can\'t make this changes!')); return false; } // убираем связь удаленного пользователя с ролью //$auth = Yii::app()->authManager; //$auth->revoke($this->role, $this->id); //$auth->save(); // Удаляем токены foreach ($this->tokens as $token) { $token->delete(); } // Обнуляем связанные элементы обратной связи Yii::import("application.modules.feedback.models.Feedback"); foreach (Feedback::model()->findAllByAttributes(array('user_id' => $this->id)) as $item) { $item->user_id = null; $item->save(false, array('user_id')); } // Обнуляем связанные подписки Yii::import("application.modules.subscription.models.Subscription"); foreach (Subscription::model()->findAllByAttributes(array('user_id' => $this->id)) as $item) { $item->user_id = null; $item->save(false, array('user_id')); } // Обнуляем связанные результаты голосования Yii::import("application.modules.poll.models.*"); foreach (Result::model()->findAllByAttributes(array('user_id' => $this->id)) as $item) { $item->user_id = null; $item->save(false, array('user_id')); } // Удаляем интересные мысли пользователя Yii::import("application.modules.classroom.models.Quote"); Quote::model()->deleteAllByAttributes(array('user_id' => $this->id)); // Удаляем последние прочитанные страницы пользователя Yii::import("application.modules.classroom.models.LastReadPage"); LastReadPage::model()->deleteAllByAttributes(array('user_id' => $this->id)); // Удаляем настройки пользователя foreach (yupe\models\Settings::model()->findAllByAttributes(array('user_id' => $this->id)) as $item) { $item->delete(); } // Удаляем профиль $this->profile->delete(); return parent::beforeDelete(); }
public function actionShow($courseAlias, $typeAlias) { // Авторизован ли пользователь if (Yii::app()->user->isAuthenticated() === false) { $this->redirect(Yii::app()->user->loginUrl); } if (($user = Yii::app()->user->getProfile()) === null) { Yii::app()->user->setFlash(yupe\widgets\YFlashMessages::ERROR_MESSAGE, Yii::t('UserModule.user', 'User not found.')); Yii::app()->user->logout(); $this->redirect((array) '/user/account/login'); } // Вид курса $courseType = CourseType::model()->published()->with('course')->find('course.alias = :courseAlias AND t.alias = :typeAlias', array(':courseAlias' => $courseAlias, ':typeAlias' => $typeAlias)); if (!$courseType) { throw new CHttpException(404); } if (Yii::app()->user->isSuperUser()) { // Админ может просматривать любой тип курса if ($_GET['adminPackageId'] != '') { $adminPackageId = (int) Yii::app()->getRequest()->getParam('adminPackageId'); if ($adminPackageId > 0) { Yii::app()->user->setState('adminPackageId', $adminPackageId); } else { Yii::app()->user->setState('adminPackageId', null); } } // Админ может просматривать курс с данными другого пользователя if ($_GET['adminUserId'] != '') { $adminUserId = (int) Yii::app()->getRequest()->getParam('adminUserId'); if ($adminUserId > 0) { Yii::app()->user->setState('adminUserId', $adminUserId); } else { Yii::app()->user->setState('adminUserId', null); } } // Подмена данных пользователя для администратора if (Yii::app()->user->getState('adminUserId') !== null) { $viewedUser = User::model()->findByPK((int) Yii::app()->user->getState('adminUserId')); if ($viewedUser) { $user->code = $viewedUser->code; $user->profile->setAttributes(array('name' => $viewedUser->profile->name, 'gender' => $viewedUser->profile->gender, 'birth_date' => $viewedUser->profile->birth_date, 'birth_time' => $viewedUser->profile->birth_time, 'city_id' => $viewedUser->profile->city_id)); $user->profile->city = $viewedUser->profile->city; } } } // Пакет if (Yii::app()->user->isSuperUser() && Yii::app()->user->getState('adminPackageId') !== null) { // Админ может просмотреть любой пакет $packageId = (int) Yii::app()->user->getState('adminPackageId'); $this->package = Package::model()->published()->findByPK($packageId); } else { // Остальным подбираем пакет в зависимости от указанных данных $this->package = Package::model()->published()->find('t.type_id = :type_id AND t.gender = :gender AND t.notime = :notime', array(':type_id' => $courseType->id, ':gender' => $user->profile->gender, ':notime' => $user->profile->birth_time === null)); } if (!$this->package) { throw new CHttpException(404); } // День $dayNumber = (int) Yii::app()->getRequest()->getParam('day', 1); $this->day = $day = Day::model()->published()->package($this->package->id)->findByNumber($dayNumber); if (!$day) { throw new CHttpException(404); } // Страница $pageNumber = (int) Yii::app()->getRequest()->getParam('page', 1); $page = Page::model()->published()->day($day->id)->with(array('blocks' => array('scopes' => 'published', 'order' => 'blocks.sort ASC')))->findByNumber($pageNumber); if (!$page) { throw new CHttpException(404); } // Определяем, имеет ли пользователь доступ к выбранной странице курса $this->_checkPermissions($user, $courseType, $dayNumber, $pageNumber); // Запоминаем последнюю прочитанную страницу для пользователя LastReadPage::model()->fixLastPage($user, $courseType, $page); // Определяем предыдущую и следующую страницы $prevPage = $page->getPrevPage(); $nextPage = $page->getNextPage(); // Выделяем интересную мысль, если она указана $quoteText = ''; $highlightId = Yii::app()->getRequest()->getParam('highlight', null); if (!empty($highlightId)) { $quote = Quote::model()->findByPk($highlightId); $quoteText = $quote ? $quote->content : ''; } // Вывод в шаблон $this->render('show', array('package' => $this->package, 'day' => $day, 'page' => $page, 'nextPage' => $nextPage, 'prevPage' => $prevPage, 'quoteText' => $quoteText)); }
public function getLastPageUrlForUser($user) { $lastReadPage = LastReadPage::model()->getLastPage($user, $this); if ($lastReadPage) { return $this->getUrl($lastReadPage->page->day->number, $lastReadPage->page->number); } return $this->url; }