protected/modules/page/controllers/PageController.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

use yupe\components\controllers\FrontController;

/**
 * PageController публичный контроллер для работы со страницами
 *
 * @author yupe team <support@yupe.ru>
 * @link https://yupe.ru
 * @copyright 2009-2013 amyLabs && Yupe! team
 * @package yupe.modules.page.controllers
 * @license  BSD https://raw.github.com/yupe/yupe/master/LICENSE
 * @since 0.1
 *
 */
class PageController extends FrontController
{
    /**
     * Текущая просматриваемая страница
     */
    public $currentPage;

    /**
     * экшн для отображения конкретной страницы, отображает опубликованные страницы и превью
     */
    public function actionView($slug)
    {
        $isPreview = ((int)Yii::app()->getRequest()->getQuery('preview') === 1 && Yii::app()->getUser()->isSuperUser());
        if ($isPreview) {
            $model = Page::model()->find(
                'slug = :slug AND (lang=:lang OR (lang IS NULL))',
                [
                    ':slug' => $slug,
                    ':lang' => Yii::app()->getLanguage(),
                ]
            );
        } else {
            $criteria = [
                'condition' => 'slug = :slug AND (lang = :lang OR (lang = :deflang))',
                'params' => [
                    ':slug' => $slug,
                    ':lang' => Yii::app()->getLanguage(),
                    ':deflang' => $this->yupe->defaultLanguage,
                ],
                'order' => 'FIELD(lang, "' . Yii::app()->getLanguage() . '", "' . $this->yupe->defaultLanguage . '")'
            ];
            $model = Page::model()->published()->find($criteria);
        }

        if (null === $model) {
            throw new CHttpException(404, Yii::t('PageModule.page', 'Page was not found'));
        }

        // проверим что пользователь может просматривать эту страницу
        if ($model->isProtected() && !Yii::app()->getUser()->isAuthenticated()) {
            Yii::app()->getUser()->setFlash(
                yupe\widgets\YFlashMessages::ERROR_MESSAGE,
                Yii::t('PageModule.page', 'You must be authorized user for view this page!')
            );

            $this->redirect([Yii::app()->getModule('user')->accountActivationSuccess]);
        }

        $this->currentPage = $model;

        $this->render($model->view ?: 'view', ['model' => $model]);
    }

    /**
     * Генерирует меню навигации по вложенным страницам для использования в zii.widgets.CBreadcrumbs
     */
    public function getBreadCrumbs()
    {
        $pages = [];
        if ($this->currentPage->parentPage) {
            $pages = $this->getBreadCrumbsRecursively($this->currentPage->parentPage);
        }

        $pages = array_reverse($pages);
        $pages[] = $this->currentPage->title;

        return $pages;
    }

    /**
     * Рекурсивно возвращает пригодный для zii.widgets.CBreadcrumbs массив, начиная со страницы $page
     * @param  Page $page
     * @return array
     * @internal param int $pageId
     */
    private function getBreadCrumbsRecursively(Page $page)
    {
        $pages = [];
        $pages[$page->title] = Yii::app()->createUrl('/page/page/view', ['slug' => $page->slug]);
        $pp = $page->parentPage;

        if ($pp) {
            $pages += $this->getBreadCrumbsRecursively($pp);
        }

        return $pages;
    }
}