PerformerController.php 9.93 KB
<?php
    namespace frontend\controllers;

    use common\models\Blog;
    use common\models\Fields;
    use common\models\Gallery;
    use common\models\Portfolio;
    use common\models\PortfolioSpecialization;
    use Yii;
    use yii\data\ArrayDataProvider;
    use yii\data\Pagination;
    use yii\helpers\ArrayHelper;
    use yii\web\BadRequestHttpException;
    use yii\web\Controller;
    use common\models\User;

    /**
     * Site controller
     */
    class PerformerController extends Controller
    {

        public $layout = 'performer';

        public $user;

        public $defaultAction = 'common';

        public function afterAction($action, $result)
        {
            if(!empty( $action->controller->actionParams[ 'performer_id' ] )) {
                $performer_id = $action->controller->actionParams[ 'performer_id' ];
                $user = User::findOne($performer_id);
                if(!empty( $user->userInfo )) {
                    $user->userInfo->updateCounters([ 'view_count' => 1 ]);
                }
            }
            return parent::afterAction($action, $result);
        }

        /**
         * @inheritdoc
         */
        public function actions()
        {
            return [
                'error'   => [
                    'class' => 'yii\web\ErrorAction',
                ],
                'captcha' => [
                    'class'           => 'yii\captcha\CaptchaAction',
                    'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : NULL,
                ],
            ];
        }

        public function actionCommon($performer_id)
        {

            $user = User::findOne($performer_id);

            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }

            $educations = Fields::getData($user->id, $user->className(), 'education');
            $phones = Fields::getData($user->id, $user->className(), 'phone');
            $sites = Fields::getData($user->id, $user->className(), 'site');
            $soft = implode(', ', ArrayHelper::getColumn(Fields::getData($user->id, $user->className(), 'soft'), 'soft'));

            return $this->render('common', [
                'user'       => $user,
                'educations' => $educations,
                'phones'     => $phones,
                'sites'      => $sites,
                'soft'       => $soft,
            ]);

        }

        public function actionPortfolio($performer_id)
        {
            $user = User::findOne($performer_id);

            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }
            $projects = ArrayHelper::getColumn($user->portfolios, 'portfolio_id');

            $filters = PortfolioSpecialization::find()
                                              ->select([
                                                  "specialization_id",
                                                  "COUNT('specialization_id') AS count",
                                              ])
                                              ->where([ "portfolio_id" => $projects ])
                                              ->groupBy("specialization_id")
                                              ->all();

            $portfolio = new ArrayDataProvider([
                'allModels'  => $user->getPortfolios()->orderBy('portfolio_id')->all(),
                'pagination' => [
                    'pageSize' => 9,
                ],
            ]);

            return $this->render('portfolio', [
                'user'      => $user,
                'filters'   => $filters,
                'portfolio' => $portfolio,
                'count'     => count($user->portfolios),
            ]);

        }

        public function actionPortfolioFilter($performer_id, $filter)
        {
            $user = User::findOne($performer_id);

            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }
            $portfolios = ArrayHelper::getColumn($user->portfolios, 'portfolio_id');

            $filters = PortfolioSpecialization::find()
                                              ->select([
                                                  "specialization_id",
                                                  "COUNT('specialization_id') AS count",
                                              ])
                                              ->where([ "portfolio_id" => $portfolios ])
                                              ->groupBy("specialization_id")
                                              ->all();

            $filter_result = PortfolioSpecialization::find()
                                                    ->where([
                                                        'specialization_id' => $filter,
                                                        'portfolio_id'      => $portfolios,
                                                    ])
                                                    ->all();

            $portfolio = new ArrayDataProvider([
                'allModels'  => Portfolio::find()
                                         ->where([ 'portfolio_id' => ArrayHelper::getColumn($filter_result, 'portfolio_id') ])
                                         ->all(),
                'pagination' => [
                    'pageSize' => 9,
                ],
            ]);

            return $this->render('portfolio', [
                'user'      => $user,
                'filters'   => $filters,
                'portfolio' => $portfolio,
                'filter_id' => $filter,
                'count'     => count($user->portfolios),
            ]);
        }

        public function actionPortfolioView($performer_id, $portfolio_id)
        {
            $user = User::findOne($performer_id);
            $portfolio = $user->getPortfolios()
                              ->where([ 'portfolio_id' => $portfolio_id ])
                              ->one();
            $portfolio->updateCounters([ 'view_count' => 1 ]);
            return $this->render('portfolio-view', [
                'user'      => $user,
                'portfolio' => $portfolio,
            ]);
        }

        public function actionBlogList($performer_id)
        {
            $user = User::findOne($performer_id);

            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }

            $query = $user->getBlog();

            $countQuery = clone $query;

            $pagination = new Pagination([
                'totalCount' => $countQuery->count(),
                'pageSize'   => 5,
            ]);

            $article = $query->offset($pagination->offset)
                             ->limit($pagination->limit)
                             ->all();

            $blog = new ArrayDataProvider([
                'allModels' => $article,
            ]);

            return $this->render('blog-list', [
                'user'       => $user,
                'blog'       => $blog,
                'pagination' => $pagination,
            ]);
        }

        public function actionBlogView($performer_id, $link)
        {
            $user = User::findOne($performer_id);

            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }

            $article = Blog::findOne([
                'link'    => $link,
                'user_id' => $performer_id,
            ]);
            $article->updateCounters([ 'view_count' => 1 ]);

            return $this->render('blog-view', [
                'user'    => $user,
                'article' => $article,

            ]);
        }

        public function actionReview($performer_id)
        {
            $user = User::findOne($performer_id);

            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }

            return $this->render('review', [
                'user' => $user,
            ]);
        }

        public function actionWorkplace($performer_id)
        {
            $user = User::findOne($performer_id);
            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }

            return $this->render('workplace', [
                'user' => $user,
            ]);
        }

        public function actionGallery($performer_id)
        {
            $user = User::findOne($performer_id);

            if(!$user instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }

            $query = Gallery::find()->where([ 'user_id' => $performer_id ]);

            $countQuery = clone $query;

            $pagination = new Pagination([
                'totalCount' => $countQuery->count(),
                'pageSize'   => 5,
            ]);

            $gallery = $query->offset($pagination->offset)
                             ->limit($pagination->limit)
                             ->all();

            $gallery = new ArrayDataProvider([
                'allModels' => $gallery,
            ]);

            $videos = Fields::getData($user->id, Gallery::className(), 'youtube');

            $this->layout = 'gallery';

            return $this->render('gallery', [
                'user'       => $user,
                'gallery'    => $gallery,
                'pagination' => $pagination,
                'videos'     => $videos,
            ]);
        }
    }