Модульность Yii. #2 Ресурсы модулей (assets)

Добавляем модулям собственные ресурсы.

Для чего это нужно?

Для лучшей переносимости модулей, использующих CSS, Javascript и прочие ресурсы, их неплохо было бы поставлять в комплекте с модулями. Для реализации этого хорошо подойдет встроенный в Yii механизм публикации ресурсов. В модулях Yii, к сожалению нет встроенных методов для управления ресурсами, однако реализовать их самостоятельно не составляет труда.

 

Реализация

Разработаем базовый класс модуля со всеми необходимыми методами:

<?php
    class Module extends CWebModule {
        // хранит в себе URL адрес папки с ресурсами 
        private $_assetsUrl;
        public function getAssetsUrl() {
            if($this->_assetsUrl === null)
                $this->_assetsUrl = Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias($this->getId() . '.assets'));
            return $this->_assetsUrl;
    }

 

Таким образом, получаем метод getAssetsUrl, возвращающий url папки с ресурсами. Теперь можно использовать его в представлениях (Views) модуля так:

<?php Yii::app()->clientScript->registerCssFile($this->getModule()->getAssetsUrl() . '/css/module.css'); ?>

 

Также, для уменьшения кода, можно реализовать вспомогательные методы регистрации стилей и скриптов в модуле:

<?php
    class Module extends CWebModule {
        /* ... */
        public function registerScriptFile($file, $position = null, array $htmlOptions = array()) {
            Yii::app()->getClientScript()->registerScriptFile($this->getAssetsUrl() . '/js/' . $file, $position, $htmlOptions);
        }
        public function registerCssFile($file, $media = 'all') {
            Yii::app()->getClientScript()->registerCssFile($this->getAssetsUrl() . '/css/' . $file, $media);
        }
    }

 

Использовать соответственно так:

<?php $this->getModule()->registerCssFile('module.css'); ?>