Yii имеет встроенный механизм публикации ресурсов (asset). Он полезен в следующих случаях:
Note|Примечание: Для работы с ресурсами в корне вебсервера должна быть создана папка
assets
с правами
на запись для PHP.
Публикацией ресурсов активно пользуется сам фреймворк. Происходит это, например,
при использовании CLinkPager или CGridView.
После нескольких запусков приложения в assets
образуется примерно следующее содержимое:
assets
1a6630a0\
main.css
2bb97318\
pager.css
4ab2ffe\
jquery.js
…
Папки вида 1a6630a0
создаются для предотвращения конфликта имён ресурсов.
Здесь 1a6630a0
— хеш от полного пути к папке, в которой размещён
подключаемый ресурс.
Tip|Подсказка: Получить текущий или задать новый полный путь к папке
assets
можно при помощиYii::app()->assetManager->basePath
,
а URL при помощиYii::app()->assetManager->baseUrl
.
Для публикации ресурса или папки с ресурсами используется метод
CAssetManager::publish(), принимающий следующие параметры:
$path
— путь к ресурсу или папке с ресурсами.$hashByName
— сохранять ли один и тот же хэш при нескольких публикациях. Полезноfalse
.$level
— уровень вложенности при копировании папки. При -1 копирует всё. При 0 — только файлы в корневой папке.$forceCopy
— копировать ресурс даже если он уже опубликован. Удобно использоватьВозвращается абсолютный URL опубликованного ресурса.
Note|Примечание:
При публикации отдельного ресурса, во избежание ненужного копирования проверяется
время его модификации. При обновлении ресурса автоматически происходит его перепубликация.При публикации папки, её содержимое копируется рекурсивно. При этом метод проверяет
только наличие папки с таким же именем, но не отдельных ресурсов. То есть при изменении
ресурсов в этой папке её содержимое заново опубликовано не будет.
Yii::app()->clientScript->registerScriptFile(
Yii::app()->assetManager->publish(
Yii::getPathOfAlias('ext.myExtension.assets').'/main.js'
),
CClientScript::POS_END
);
Tip|Подсказка: вместо
Yii::app()->assetManager->publish()
можно использовать
его синонимCHtml::asset()
.
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 опубликованного ресурса можно воспользоваться
CAssetManager::getPublishedPath() и CAssetManager::getPublishedUrl() соответственно.
Методы принимают два параметра:
$path
— путь к публикуемому ресурсу.$hashByName
— сохранять ли один и тот же хэш при нескольких публикациях. Полезноfalse
.Если указанный ресурс не опубликован, возвращается false
.
Фреймворк не очищает папку assets
, так что при длительной разработке в ней может
скопиться довольно много ресурсов. В том числе и тех, которые больше не используются.
Очищать папку assets
полностью безопасно и даже рекомендуется это делать при
обновлении фреймворка.
Автор
: Александр Макаров, Sam Dark (rmcreative.ru)Обсуждение и комментарии
: http://yiiframework.ru/forum/viewtopic.php?f=8&t=1245