Ресурсы

Yii имеет встроенный механизм публикации ресурсов (asset). Он полезен в следующих случаях:

  • При оформлении кода как расширения, ресурсы которого содержатся в той же папке, что и код.
  • При использовании ресурсов за корнем вебсервера.
  • Для обработки ресурсов непосредственно перед публикацией. Например, сжатия CSS и JavaScript.
  • При использовании одного и того же ресурса множеством компонент (для исключения дубликатов).

Note|Примечание: Для работы с ресурсами в корне вебсервера должна быть создана папка assets с правами
на запись для PHP.

Публикацией ресурсов активно пользуется сам фреймворк. Происходит это, например,
при использовании CLinkPager или CGridView.

Что находится в папке assets?

После нескольких запусков приложения в 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 — копировать ресурс даже если он уже опубликован. Удобно использовать
    во время разработки задав значение как YII_DEBUG. Не рекомендуется использовать
    на живом проекте, так как производительность падает.

Возвращается абсолютный URL опубликованного ресурса.

Note|Примечание:
При публикации отдельного ресурса, во избежание ненужного копирования проверяется
время его модификации. При обновлении ресурса автоматически происходит его перепубликация.

При публикации папки, её содержимое копируется рекурсивно. При этом метод проверяет
только наличие папки с таким же именем, но не отдельных ресурсов. То есть при изменении
ресурсов в этой папке её содержимое заново опубликовано не будет.

Примеры публикации и подключения ресурсов

JavaScript

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().

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

Расширения