Файл: silawar.ru/protected/controllers/ForumController.php
Строк: 188
<?php
class ForumController extends Controller {
    public function accessRules() {
        return array(
            array('deny',
                'roles' => array('banned'),
                'deniedCallback' => array(Yii::app()->controller, 'redirectToHome'),
            ),
            array('allow',
                'actions' => array('createCategory', 'updateCategory', 'editTheme', 'editMessage', 'deleteMessage'),
                'roles' => array('moder'),
            ),
            array('allow',
                'actions' => array('index', 'category', 'createTheme', 'theme', 'markAsRead'),
                'users' => array('@'),
            ),
            array('deny',
                'users' => array('*'),
                'deniedCallback' => array(Yii::app()->controller, 'redirectToHome'),
            )
        );
    }
    public function actionIndex() {
        $count = ForumCategories::model()->count();
        $pages = new CPagination($count);
        // элементов на страницу
        $pages->pageSize = 10;
        $pages->route = '/forum/index/';
        $models = ForumCategories::model()->findAll();
        $this->render('index', array(
            'models' => $models,
            'pages' => $pages,
        ));
    }
    public function actionCategory($id) {
        if ($id == 1) {
            $user = Users::findUser();
            $user->news_ntf = 0;
            if (!$user->save(false)) {
                throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении пользователя!'));
            }
        }
        $criteria = new CDbCriteria();
        $criteria->compare('id_category', $id);
        $criteria->order = '`vip` DESC, `time` DESC';
        $count = ForumThemes::model()->count($criteria);
        $pages = new CPagination($count);
        // элементов на страницу
        $pages->pageSize = 10;
        $pages->route = '/forum/category/';
        $category = ForumCategories::model()->findByPk($id);
        $models = ForumThemes::model()->findAll($criteria);
        $this->render('category', array(
            'models' => $models,
            'category' => $category,
            'pages' => $pages,
        ));
    }
    public function actionMarkAsRead($id) {
        $this->loadModel($id);
        $user = Users::findUser();
        $criteria = new CDbCriteria();
        $criteria->compare('id_category', $id);
        $themes = ForumThemes::model()->findAll($criteria);
        $ids = CHtml::listData($themes, 'id_theme', 'id_theme');
        $old_ids = CHtml::listData($user->forum_themes, 'id_theme', 'id_theme');
        $user->forum_themes = array_merge($old_ids, $ids);
        $user->forum_themes = array_unique($user->forum_themes);
        if (!$user->save(false)) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении пользователя'));
        }
        $this->redirect(array('forum/category', 'id' => $id));
        Yii::app()->end();
    }
    public function actionCreateCategory() {
        $model = new ForumCategories();
        $this->performAjaxValidation($model);
        if (isset($_POST['ForumCategories'])) {
            $model->attributes = $_POST['ForumCategories'];
            if ($model->validate()) {
                if (!$model->save(false)) {
                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при создании категории!'));
                }
                echo CJSON::encode(array(
                    'status' => 'success',
                    'reload' => true,
                ));
                Yii::app()->end();
            } else {
                $error = CActiveForm::validate($model);
                if ($error != '[]')
                    echo $error;
                Yii::app()->end();
            }
        }
        $this->renderPartial('_category', array(
            'model' => $model,
        ));
    }
    public function actionUpdateCategory($id) {
        if (Yii::app()->user->level > 4 && Yii::app()->user->mute < time()) {
            if (Yii::app()->user->checkAccess('moder')) {
                
            } elseif ($category->id_category > 1) {
                
            }
        }
        $model = ForumCategories::model()->findByPk($id);
        $this->performAjaxValidation($model);
        if (isset($_POST['ForumCategories'])) {
            $model->attributes = $_POST['ForumCategories'];
            if ($model->validate()) {
                if (!$model->save(false)) {
                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при редактировании категории!'));
                }
                echo CJSON::encode(array(
                    'status' => 'success',
                    'reload' => true,
                ));
                Yii::app()->end();
            } else {
                $error = CActiveForm::validate($model);
                if ($error != '[]')
                    echo $error;
                Yii::app()->end();
            }
        }
        $this->renderPartial('_category', array(
            'model' => $model,
        ));
    }
    public function actionTheme($id) {
        $theme = $this->loadModel($id, 'ForumThemes');
        if (!ForumThemesForUsers::checkRead($theme->id_theme)) {
            $ids = CHtml::listData($theme->users, 'id_user', 'id_user');
            $ids[] = Yii::app()->user->id;
            $theme->users = $ids;
            if (!$theme->save(false)) {
                throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении темы!'));
            }
        }
        $count = ForumMessages::model()->countByAttributes(array('id_theme' => $id));
        $model = new ForumMessages('search');
        $comment = new ForumMessages('insert');
        if (strstr(Yii::app()->request->getUrlReferrer(true), 'category')) {
            $model->search($id)->pagination->setCurrentPage(99);
        }
        if (isset($_POST['ForumMessages'])) {
            $comment->attributes = $_POST['ForumMessages'];
            $comment->id_theme = $id;
            if ($comment->validate()) {
                if (!$comment->save(false)) {
                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при создани комментария!'));
                }
                $theme->users = Yii::app()->user->id;
                $theme->time = time();
                if (!$theme->save(false)) {
                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении темы!'));
                }
                echo CJSON::encode(array(
                    'status' => 'success',
                    'updateList' => 'messages',
                ));
                Yii::app()->end();
            }
        }
        $this->render('theme', array(
            'model' => $model,
            'theme' => $theme,
            'comment' => $comment,
            'count' => $count
        ));
    }
    public function actionCreateTheme($id) {
        $category = $this->loadModel($id);
        if (Yii::app()->user->level > 9 && Yii::app()->user->mute < time() && (Yii::app()->user->checkAccess('moder') || $id > 1)) {
            $model = new ForumThemes();
            if (isset($_POST['ForumThemes'])) {
                $model->id_category = $id;
                $model->attributes = $_POST['ForumThemes'];
                if ($model->validate()) {
                    if (!$model->save(false)) {
                        throw new CHttpException(500, Yii::t('layout', 'Ошибка при создании темы!'));
                    }
                    if ($id == 1) {
                        Yii::app()->db->createCommand()->update('users', array('news_ntf' => '1'), '`id_role`!=5 AND `id_role`!=6 AND `news_ntf`=0');
                    }
                    $this->redirect(array('/forum/theme', 'id' => $model->id_theme));
                    Yii::app()->end();
                }
            }
            $this->render('createTheme', array(
                'model' => $model,
            ));
        }
        else {
            $this->redirect(Yii::app()->user->returnUrl);
            Yii::app()->end();
        }
    }
    public function actionEditTheme($id) {
        $model = $this->loadModel($id, 'ForumThemes');
        if (isset($_POST['ForumThemes'])) {
            $model->attributes = $_POST['ForumThemes'];
            if ($model->is_delete) {
                $id_category = $model->id_category;
                $model->delete();
                $this->redirect(array('/forum/category', 'id' => $id_category));
                Yii::app()->end();
            }
            if ($model->validate()) {
                if (!$model->save(false)) {
                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при редактировании темы!'));
                }
                $this->redirect(array('/forum/theme', 'id' => $id));
                Yii::app()->end();
            }
        }
        $this->render('editTheme', array(
            'model' => $model,
        ));
    }
    public function actionEditMessage($id) {
        $message = $this->loadModel($id, 'ForumMessages');
        $model = new AdminForm('messageEdit');
        $model->message = $message->message;
        if (isset($_POST['AdminForm'])) {
            $model->attributes = $_POST['AdminForm'];
            if ($model->validate()) {
                if ($model->message != $message->message) {
                    $message->id_moder = Yii::app()->user->id;
                    $message->message = $model->message;
                    $message->answer = 'отредактировано';
                    if (!$message->save(false)) {
                        throw new CHttpException(500, Yii::t('layout', 'Ошибка при работе с сообщением!'));
                    }
                }
                elseif ($model->answer) {
                    $message->id_moder = Yii::app()->user->id;
                    $message->answer = $model->answer;
                    $message->answer_type = 2;
                    if (!$message->save(false)) {
                        throw new CHttpException(500, Yii::t('layout', 'Ошибка при работе с сообщением!'));
                    }
                }
                elseif ($model->mute) {
                    $message->id_moder = Yii::app()->user->id;
                    $message->answer = '';
                    if ($model->reason)
                        $message->answer .= $model->reason.'. ';
                    $message->answer .= 'Молчание на '.$model->mute.' ч.';
                    $message->answer_type = 3;
                    if (!$message->save(false)) {
                        throw new CHttpException(500, Yii::t('layout', 'Ошибка при работе с сообщением!'));
                    }
                    $user = Users::model()->findByPk($message->id_user);
                    $user->mute_time = time()+$model->mute*60*60;
                    if (!$user->save(false)) {
                        throw new CHttpException(500, Yii::t('layout', 'Ошибка при работе с пользователем!'));
                    }
                    
                    $id_dialog = Users::checkDialog($message->id_user, 100);
                    $mail = new UsersMessages();
                    $mail->id_dialog = $id_dialog;
                    $mail->id_user = 100;
                    $mail->users = $message->id_user;
                    $mail->message = 'Вы получили наказание "Молчание на '.$model->mute.' ч."';
                    if (!$mail->save(false)) {
                        throw new CHttpException(500, Yii::t('layout', 'Ошибка при отправке почты!'));
                    }
                }
                echo CJSON::encode(array(
                     'status'=>'success',
                     'updateList'=>'messages',
                ));
                Yii::app()->end();
             }
             else{
                $error = CActiveForm::validate($model);
                if($error!='[]')
                    echo $error;
                Yii::app()->end();
             }
        }
        $this->renderPartial('edit', array(
            'model'=>$model,
            'message'=>$message,
        ));
    }
    
    public function actionDeleteMessage($id) {
        if (Yii::app()->getRequest()->getIsPostRequest()) {
            $this->loadModel($id, 'ForumMessages')->delete();
            echo "true";
            Yii::app()->end();
        } else {
            throw new CHttpException(400, Yii::t('layout', 'Неверный запрос'));
        }
    }
    protected function performAjaxValidation($model) {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'forum-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }
    public function loadModel($id, $name = 'ForumCategories') {
        $model = $name::model()->findByPk($id);
        if ($model === null)
            throw new CHttpException(404, Yii::t('admin_layout', 'Страница не найдена!'));
        return $model;
    }
}