CompanyController.php 12.8 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 common\models\Team;
    use common\models\Vacancy;
    use common\models\VacancySpecialization;
    use Yii;
    use yii\data\ActiveDataProvider;
    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 CompanyController extends Controller
    {

        public $layout = 'company';

        public $defaultAction = 'common';

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

        public function actionIndex()
        {
            $this->redirect('site/index');
        }

        public function actionCommon($company_id)
        {
            $company = User::findOne($company_id);

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

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

        public function actionPortfolio($company_id)
        {
            $company = User::findOne($company_id);

            if(!$company instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }
            $projects = ArrayHelper::getColumn($company->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'  => $company->getPortfolios()
                                        ->orderBy('portfolio_id')
                                        ->all(),
                'pagination' => [
                    'pageSize' => 9,
                ],
            ]);

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

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

            if(!$company instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }
            $portfolios = ArrayHelper::getColumn($company->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', [
                'company'   => $company,
                'filters'   => $filters,
                'portfolio' => $portfolio,
                'filter_id' => $filter,
                'count'     => count($company->portfolios),
            ]);
        }

        public function actionPortfolioView($company_id, $portfolio_id)
        {
            $user = User::findOne($company_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 actionTeam($company_id)
        {
            $company = User::findOne($company_id);
            if(!$company instanceof User) {
                throw new BadRequestHttpException('Пользователь не найден');
            }
            $comments = new ActiveDataProvider([
                'query' => $company->getComments(),
                'pagination' => [
                    'pageSize' => 4
                ],
            ]);
            $query = Team::find()
                         ->where([ 'user_id' => $company_id ]);
            $team = new ActiveDataProvider([
                'query'      => $query,
                'pagination' => [
                    'pageSize' => 9,
                ],
            ]);
            return $this->render('team', [
                'company'  => $company,
                'team'     => $team,
                'comments' => $comments,
            ]);
        }

        public function actionBlogList($company_id)
        {
            $company = User::findOne($company_id);

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

            $query = Blog::find()
                         ->where([ 'user_id' => $company_id ]);

            $countQuery = clone $query;

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

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

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

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

        public function actionBlogView($company_id, $link)
        {
            $company = User::findOne($company_id);

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

            $article = Blog::find()
                           ->where([
                               'link'    => $link,
                               'user_id' => $company_id,
                           ])
                           ->with('comments')
                           ->one();
            $article->updateCounters([ 'view_count' => 1 ]);

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

            ]);
        }

        public function actionReview($company_id)
        {
            $company = User::findOne($company_id);

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

        public function actionVacancyList($company_id)
        {

            $company = User::findOne($company_id);

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

            $query = $company->getVacancies();

            $provider = new ActiveDataProvider([
                'query'      => $query,
                'pagination' => [
                    'pageSize' => 5,
                ],
                'sort'       => [
                    'defaultOrder' => [
                        'date_add' => SORT_DESC,
                        'name'     => SORT_ASC,
                    ],
                ],
            ]);

            return $this->render('vacancy-list', [
                'company'  => $company,
                'provider' => $provider,
            ]);

        }

        public function actionVacancyView($company_id, $link)
        {
            $company = User::findOne($company_id);
            $vacancy = $company->getVacancies()
                               ->where([ 'link' => $link ])
                               ->with([
                                   'employments',
                                   'specializations',
                               ])
                               ->one();

            $specialization_id = $vacancy->getSpecializations()
                                         ->select('specialization_id')
                                         ->column();

            $vacancy_id = VacancySpecialization::find()
                                               ->where([ 'specialization_id' => $specialization_id ])
                                               ->select('vacancy_id')
                                               ->column();

            $similar_vacancies = Vacancy::find()
                                        ->where([
                                            'city'       => $vacancy->city,
                                            'vacancy_id' => $vacancy_id,
                                        ])
                                        ->andFilterWhere([
                                            '<>',
                                            'vacancy_id',
                                            $vacancy->vacancy_id,
                                        ])
                                        ->orderBy([ 'vacancy_id' => SORT_DESC ])
                                        ->limit(3)
                                        ->all();

            return $this->render('vacancy-view', [
                'company'           => $company,
                'vacancy'           => $vacancy,
                'similar_vacancies' => $similar_vacancies,
            ]);
        }

        public function actionGallery($company_id)
        {
            $company = User::findOne($company_id);

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

            $query = Gallery::find()
                            ->where([ 'user_id' => $company_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($company->id, Gallery::className(), 'youtube');

            $this->layout = 'gallery-company';

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