Ресурсы (assets) модулей в Yii1 приложениях
Добавляем модулям собственные ресурсы.
Для чего это нужно?
Для лучшей переносимости модулей, использующих 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'); ?>