/src/controllers/ForumThreadController.php
https://github.com/bizley/yii2-podium · PHP · 237 lines · 185 code · 14 blank · 38 comment · 27 complexity · efadba82f72fe45d26e0adb829896dc3 MD5 · raw file
- <?php
-
- namespace bizley\podium\controllers;
-
- use bizley\podium\filters\AccessControl;
- use bizley\podium\models\Category;
- use bizley\podium\models\Forum;
- use bizley\podium\models\Thread;
- use bizley\podium\models\User;
- use bizley\podium\rbac\Rbac;
- use bizley\podium\services\ThreadVerifier;
- use Yii;
- use yii\helpers\Html;
- use yii\web\Response;
-
- /**
- * Podium Forum controller
- * All actions concerning threads.
- * Not accessible directly.
- *
- * @author Paweł Bizley Brzozowski <pawel@positive.codes>
- * @since 0.5
- */
- class ForumThreadController extends BaseController
- {
- /**
- * @inheritdoc
- */
- public function behaviors()
- {
- return [
- 'access' => [
- 'class' => AccessControl::className(),
- 'rules' => [['allow' => false]],
- ],
- ];
- }
-
- /**
- * Returns separated thread actions.
- * @return array
- * @since 0.6
- */
- public function actions()
- {
- return [
- 'lock' => [
- 'class' => 'bizley\podium\actions\ThreadAction',
- 'permission' => Rbac::PERM_LOCK_THREAD,
- 'boolAttribute' => 'locked',
- 'switcher' => 'podiumLock',
- 'onMessage' => Yii::t('podium/flash', 'Thread has been locked.'),
- 'offMessage' => Yii::t('podium/flash', 'Thread has been unlocked.')
- ],
- 'pin' => [
- 'class' => 'bizley\podium\actions\ThreadAction',
- 'permission' => Rbac::PERM_PIN_THREAD,
- 'boolAttribute' => 'pinned',
- 'switcher' => 'podiumPin',
- 'onMessage' => Yii::t('podium/flash', 'Thread has been pinned.'),
- 'offMessage' => Yii::t('podium/flash', 'Thread has been unpinned.')
- ],
- ];
- }
-
- /**
- * Deleting the thread of given category ID, forum ID, own ID and slug.
- * @param int $cid category ID
- * @param int $fid forum ID
- * @param int $id thread ID
- * @param string $slug thread slug
- * @return string|Response
- */
- public function actionDelete($cid = null, $fid = null, $id = null, $slug = null)
- {
- $thread = (new ThreadVerifier([
- 'categoryId' => $cid,
- 'forumId' => $fid,
- 'threadId' => $id,
- 'threadSlug' => $slug
- ]))->verify();
- if (empty($thread)) {
- $this->error(Yii::t('podium/flash', 'Sorry! We can not find the thread you are looking for.'));
- return $this->redirect(['forum/index']);
- }
-
- if (!User::can(Rbac::PERM_DELETE_THREAD, ['item' => $thread])) {
- $this->error(Yii::t('podium/flash', 'Sorry! You do not have the required permission to perform this action.'));
- return $this->redirect(['forum/index']);
- }
-
- $postData = Yii::$app->request->post('thread');
- if ($postData) {
- if ($postData != $thread->id) {
- $this->error(Yii::t('podium/flash', 'Sorry! There was an error while deleting the thread.'));
- } else {
- if ($thread->podiumDelete()) {
- $this->success(Yii::t('podium/flash', 'Thread has been deleted.'));
- return $this->redirect([
- 'forum/forum',
- 'cid' => $thread->forum->category_id,
- 'id' => $thread->forum->id,
- 'slug' => $thread->forum->slug
- ]);
- }
- $this->error(Yii::t('podium/flash', 'Sorry! There was an error while deleting the thread.'));
- }
- }
- return $this->render('delete', ['model' => $thread]);
- }
-
- /**
- * Moving the thread of given category ID, forum ID, own ID and slug.
- * @param int $cid category ID
- * @param int $fid forum ID
- * @param int $id thread ID
- * @param string $slug thread slug
- * @return string|Response
- */
- public function actionMove($cid = null, $fid = null, $id = null, $slug = null)
- {
- $thread = (new ThreadVerifier([
- 'categoryId' => $cid,
- 'forumId' => $fid,
- 'threadId' => $id,
- 'threadSlug' => $slug
- ]))->verify();
- if (empty($thread)) {
- $this->error(Yii::t('podium/flash', 'Sorry! We can not find the thread you are looking for.'));
- return $this->redirect(['forum/index']);
- }
-
- if (!User::can(Rbac::PERM_MOVE_THREAD, ['item' => $thread])) {
- $this->error(Yii::t('podium/flash', 'Sorry! You do not have the required permission to perform this action.'));
- return $this->redirect(['forum/index']);
- }
-
- $forum = Yii::$app->request->post('forum');
- if ($forum) {
- if (!is_numeric($forum) || $forum < 1 || $forum == $thread->forum->id) {
- $this->error(Yii::t('podium/flash', 'You have to select the new forum.'));
- } else {
- if ($thread->podiumMoveTo($forum)) {
- $this->success(Yii::t('podium/flash', 'Thread has been moved.'));
- return $this->redirect([
- 'forum/thread',
- 'cid' => $thread->forum->category->id,
- 'fid' => $thread->forum->id,
- 'id' => $thread->id,
- 'slug' => $thread->slug
- ]);
- }
- $this->error(Yii::t('podium/flash', 'Sorry! There was an error while moving the thread.'));
- }
- }
-
- $categories = Category::find()->orderBy(['name' => SORT_ASC]);
- $forums = Forum::find()->orderBy(['name' => SORT_ASC]);
- $list = [];
- $options = [];
- foreach ($categories->each() as $cat) {
- $catlist = [];
- foreach ($forums->each() as $for) {
- if ($for->category_id == $cat->id) {
- $catlist[$for->id] = (User::can(Rbac::PERM_UPDATE_THREAD, ['item' => $for]) ? '* ' : '')
- . Html::encode($cat->name)
- . ' » '
- . Html::encode($for->name);
- if ($for->id == $thread->forum->id) {
- $options[$for->id] = ['disabled' => true];
- }
- }
- }
- $list[Html::encode($cat->name)] = $catlist;
- }
- return $this->render('move', [
- 'model' => $thread,
- 'list' => $list,
- 'options' => $options
- ]);
- }
-
- /**
- * Creating the thread of given category ID and forum ID.
- * @param int $cid category ID
- * @param int $fid forum ID
- * @return string|Response
- */
- public function actionNewThread($cid = null, $fid = null)
- {
- if (!User::can(Rbac::PERM_CREATE_THREAD)) {
- $this->error(Yii::t('podium/flash', 'Sorry! You do not have the required permission to perform this action.'));
- return $this->redirect(['forum/index']);
- }
-
- $forum = Forum::find()->where(['id' => $fid, 'category_id' => $cid])->limit(1)->one();
- if (empty($forum)) {
- $this->error(Yii::t('podium/flash', 'Sorry! We can not find the forum you are looking for.'));
- return $this->redirect(['forum/index']);
- }
-
- $model = new Thread();
- $model->scenario = 'new';
- $model->subscribe = 1;
- $preview = false;
- $postData = Yii::$app->request->post();
- if ($model->load($postData)) {
- $model->posts = 0;
- $model->views = 0;
- $model->category_id = $forum->category->id;
- $model->forum_id = $forum->id;
- $model->author_id = User::loggedId();
- if ($model->validate()) {
- if (isset($postData['preview-button'])) {
- $preview = true;
- } else {
- if ($model->podiumNew()) {
- $this->success(Yii::t('podium/flash', 'New thread has been created.'));
- return $this->redirect([
- 'forum/thread',
- 'cid' => $forum->category->id,
- 'fid' => $forum->id,
- 'id' => $model->id,
- 'slug' => $model->slug
- ]);
- }
- $this->error(Yii::t('podium/flash', 'Sorry! There was an error while creating the thread. Contact administrator about this problem.'));
- }
- }
- }
- return $this->render('new-thread', [
- 'preview' => $preview,
- 'model' => $model,
- 'forum' => $forum,
- ]);
- }
- }