protected/modules/yupe/components/controllers/Controller.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php
/**
 * Общий контроллер для панели управления и фронтенда
 *
 * @category YupeComponents
 * @package  yupe.modules.yupe.components.controllers
 * @author   aopeykin <aopeykin@yandex.ru>
 * @license  BSD https://raw.github.com/yupe/yupe/master/LICENSE
 * @version  0.6
 * @link     https://yupe.ru
 **/

namespace yupe\components\controllers;

use yupe\components\ContentType;
use CHtml;
use Yii;
use CException;
use CHttpException;

/**
 * Class Controller
 * @package yupe\components\controllers
 *
 */
abstract class Controller extends \CController
{
    /**
     * @var \YupeModule
     */
    public $yupe;

    /**
     * @var
     */
    public $layout;

    /**
     * Хлебные крошки сайта, меняется в админке
     */
    public $breadcrumbs = [];

    /**
     * Contains data for "CMenu" widget (provides view for menu on the site)
     */
    public $menu = [];

    /**
     * Тип заголовка, подробнее в yupe\components\ContentType
     * @var integer
     */
    public $headerTypeId = ContentType::TYPE_HTML;

    public $title;

    /**
     * @var
     */
    public $description;

    /**
     * @var
     */
    public $keywords;

    /**
     * Canonical url
     *
     * @var null
     */
    public $canonical = null;

    /**
     * For backward capability
     *
     * @deprecated
     * @param string $value
     */
    public function setDescription($value)
    {
        $this->metaDescription = $value;
    }

    /**
     * For backward capability
     *
     * @deprecated
     * @param string $value
     */
    public function setKeywords($value)
    {
        $this->metaKeywords = $value;
    }

    /**
     * Функци определяющая мультиязычность:
     *
     * @return bool
     **/
    public function isMultilang()
    {
        return count(explode(',', $this->yupe->availableLanguages)) > 1;
    }

    /**
     * Функция инициализации контроллера:
     *
     * @return void
     **/
    public function init()
    {
        parent::init();
        $this->yupe = Yii::app()->getModule('yupe');
    }

    /**
     * Функция отрисовки виджета:
     *
     * @param string $className - имя класса
     * @param mixed $properties - параметры
     * @param bool $captureOutput - требуется ли "захват" вывода виджета
     *
     * @return mixed Инстанс виджета в случае, когда $captureOutput является ложным,
     *               или вывод виджета, когда $captureOutput - истина
     **/
    public function widget($className, $properties = [], $captureOutput = false)
    {
        try {

            $modulePath = explode('.', $className);

            $isModule = strpos($className, 'application.modules') !== false
                && !empty($modulePath[2])
                && !Yii::app()->hasModule($modulePath[2]);

            if (false === Yii::getPathOfAlias($className) || $isModule) {

                if ($isModule) {
                    throw new CException(
                        Yii::t(
                            'YupeModule.yupe',
                            'Widget "{widget}" was not found! Please enable "{module}" module!',
                            [
                                '{widget}' => $className,
                                '{module}' => $modulePath[2],
                            ]
                        ), 1
                    );
                } elseif (class_exists($className) === false) {

                    throw new CException(
                        Yii::t(
                            'YupeModule.yupe',
                            'Widget "{widget}" was not found!',
                            [
                                '{widget}' => $className,
                            ]
                        )
                    );
                }
            }

            $widget = parent::widget($className, $properties, $captureOutput);

        } catch (CException $e) {

            echo CHtml::tag(
                'p',
                [
                    'class' => 'alert alert-danger',
                ],
                $e->getCode()
                    ? $e->getMessage()
                    : Yii::t(
                    'YupeModule.yupe',
                    'Error occurred during the render widget ({widget}): {error}',
                    [
                        '{error}' => $e->getMessage(),
                        '{widget}' => $className,
                    ]
                )
            );

            return null;

        }

        return $widget;
    }

    /**
     * Действие обработки вывода:
     *
     * @param string $output - буфер для вывода
     *
     * @return string родительский вызов processOutput
     **/
    public function processOutput($output)
    {
        ContentType::setHeader($this->headerTypeId);

        return parent::processOutput($output);
    }


    /**
     * @param null $message
     * @param int $error
     * @return mixed
     * @throws CHttpException
     */
    protected function badRequest($message = null, $error = 400)
    {
        // Если сообщение не установленно - выставляем
        // дефолтное
        $message = $message
            ?: Yii::t(
                'YupeModule.yupe',
                'Bad request. Please don\'t use similar requests anymore!'
            );

        if (Yii::app()->getRequest()->getIsAjaxRequest() === true) {
            return Yii::app()->ajax->failure($message);
        }

        throw new CHttpException($error, $message);
    }

    /**
     * Отключение всех профайлеров и логгеров, используется, например при загрузке файлов
     *
     * @since 0.5
     * @see http://allframeworks.ru/blog/Yii/371.html
     **/
    public function disableProfilers()
    {
        if (Yii::app()->getComponent('log')) {
            foreach (Yii::app()->getComponent('log')->routes as $route) {
                if (in_array(
                    get_class($route),
                    [
                        'CFileLogRoute',
                        'CProfileLogRoute',
                        'CWebLogRoute',
                        'YiiDebugToolbarRoute',
                        'DbProfileLogRoute',
                    ]
                )
                ) {
                    $route->enabled = false;
                }
            }
        }
    }
}