Ресурсы
Yii имеет встроенный механизм публикации ресурсов (asset). Он полезен в следующих случаях:
- При оформлении кода как расширения, ресурсы которого содержатся в той же папке, что и код.
- При использовании ресурсов за корнем вебсервера.
- Для обработки ресурсов непосредственно перед публикацией. Например, сжатия CSS и JavaScript.
- При использовании одного и того же ресурса множеством компонент (для исключения дубликатов).
Примечание: Для работы с ресурсами в корне вебсервера должна быть создана папка
assetsс правами на запись для PHP.
Публикацией ресурсов активно пользуется сам фреймворк. Происходит это, например, при использовании CLinkPager или CGridView.
Что находится в папке assets?
После нескольких запусков приложения в assets образуется примерно следующее содержимое:
assets
1a6630a0\
main.css
2bb97318\
pager.css
4ab2ffe\
jquery.js
…
Папки вида 1a6630a0 создаются для предотвращения конфликта имён ресурсов.
Здесь 1a6630a0 — хеш от полного пути к папке, в которой размещён
подключаемый ресурс.
Подсказка: Получить текущий или задать новый полный путь к папке
assetsможно при помощиYii::app()->assetManager->basePath, а URL при помощиYii::app()->assetManager->baseUrl.
Публикация ресурсов
Для публикации ресурса или папки с ресурсами используется метод CAssetManager::publish, принимающий следующие параметры:
$path— путь к ресурсу или папке с ресурсами.$hashByName— сохранять ли один и тот же хэш при нескольких публикациях. Полезно при использовании ресурса несколькими компонентами. По умолчанию равенfalse.$level— уровень вложенности при копировании папки. При -1 копирует всё. При 0 — только файлы в корневой папке.$forceCopy— копировать ресурс даже если он уже опубликован. Удобно использовать во время разработки задав значение как YII_DEBUG. Не рекомендуется использовать на живом проекте, так как производительность падает.
Возвращается абсолютный URL опубликованного ресурса.
Примечание: При публикации отдельного ресурса, во избежание ненужного копирования проверяется время его модификации. При обновлении ресурса автоматически происходит его перепубликация.
При публикации папки, её содержимое копируется рекурсивно. При этом метод проверят только наличие папки с таким же именем, но не отдельных ресурсов. То есть при изменении ресурсов в этой папке её содержимое заново опубликовано не будет.
Примеры публикации и подключения ресурсов
JavaScript
Yii::app()->clientScript->registerScriptFile( Yii::app()->assetManager->publish( Yii::getPathOfAlias('ext.myExtension.assets').'/main.js' ), CClientScript::POS_END );
Подсказка: вместо
Yii::app()->assetManager()->publish()можно использовать его синонимCHtml::asset().
CSS
Yii::app()->clientScript->registerCssFile( Yii::app()->assetManager->publish( Yii::getPathOfAlias('ext.myExtension.assets').'/main.css' ) );
Изображение
$url = Yii::app()->assetManager->publish( Yii::getPathOfAlias('ext.myExtension.assets').'/image.png' ); echo CHtml::image($url);
Получение путей и URL к уже опубликованным ресурсам
Для получения пути или URL опубликованного ресурса можно воспользоваться CAssetManager::getPublishedPath и CAssetManager::getPublishedUrl соответственно.
Методы принимают два параметра:
$path— путь к публикуемому ресурсу.$hashByName— сохранять ли один и тот же хэш при нескольких публикациях. Полезно при использовании ресурса несколькими компонентами. По умолчанию равенfalse.
Если указанный ресурс не опубликован, возвращается false.
Размер папки assets и её очистка
Фреймворк не очищает папку assets, так что при длительной разработке в ней может
скопиться довольно много ресурсов. В том числе и тех, которые больше не используются.
Очищать папку assets полностью безопасно и даже рекомендуется это делать при
обновлении фреймворка.
Полезные ссылки
API
Расширения
- extendedclientscript — собирает CSS и JavaScript в один файл, сжимает их при помощи JSMin и CSSTidy.
- cclientscriptminify — то же при помощи minify.
- haml-and-sass — конвертирует Sass в CSS при публикации. Также позволяет использовать Haml.
Автор: Александр Макаров, Sam Dark (rmcreative.ru)Обсуждение и комментарии: http://yiiframework.ru/forum/viewtopic.php?f=8&t=1245
