Подключение js и css — Yii2

Ресурс в Yii — это файл, который нужен для формирования страницы сайта. Это может быть CSS-файл, JavaScript-файл, файл шрифта, файл изображения или видео и так далее. Ресурсы располагаются в доступных по протололу HTTP директориях и обслуживаются непосредственно сервером Apache или Nginx.

Yii управляет ресурсами как единицей комплекта ресурсов. Комплект ресурсов — это набор ресурсов (файлов), расположенных в определенной директории. При регистрирации комплекта ресурсов в представлении, для страницы сайта включается набор CSS и JavaScript файлов.

Комплект ресурсов определяется как PHP-класс, наследующиий yii\web\AssetBundle. Имя комплекта соответствует полному имени класса без ведущего обратного слеша. При задании комплекта необходимо указать, где ресурсы находятся, какие CSS и JavaScript файлы входят в комплект, и как этот комплект зависит от других комплектов.

Создание комплекта ресурсов

После установки Yii2 уже существует класс AppAsset, который задает комплект ресурсов:

<?php
/*
 * Файл assets/AppAsset.php
 */
namespace app\assets;
use yii\web\AssetBundle;
use yii\web\View;

class AppAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        'css/site.css',
    ];
    public $js = [
        'js/site.js'
    ];
    public $jsOptions = [
        // скрипты будут подключены в <head>
        'position' => View::POS_HEAD
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}

В коде выше класс AppAsset указывает, что файлы ресурса находятся в директории @webroot, которой соответствует URL @web; комплект содержит единственный css-файл css/site.css и единственный js-файл js/site.js; комплект зависит от двух других комплектов: yii\web\YiiAsset и yii\bootstrap\BootstrapAsset.

  • sourcePath: Задаёт корневую директорию, содержащую файлы ресурса этого комплекта. Это свойство должно быть установлено, если корневая директория не доступна по HTTP. В противном случае достаточно установить basePath и baseUrl. Здесь могут быть использованы псевдонимы путей.
  • basePath: Задаёт директорию, доступную по HTTP, содержащую файлы ресурсов этого комплекта. Если задано свойство sourcePath, менеджер ресурсов (yii\web\AssetManager) скопирует файлы этого комплекта в директорию, доступную по HTTP. И перезапишет свойство basePath. Это свойство надо задавать только в том случае, если файлы ресурсов уже расположены в директории, доступной по HTTP. Здесь могут быть использованы псевдонимы путей.
  • baseUrl: задаёт URL, соответствующий директории basePath. Также как и для basePath, если задано свойство sourcePath, менеджер ресурсов перезапишет свойство baseUrl. Здесь могут быть использованы псевдонимы путей.
  • js: Массив, перечисляющий JavaScript файлы, содержащиеся в данном комплекте.
  • css: массив, перечисляющий CSS файлы, содержащиеся в данном комплекте.
  • depends: массив, перечисляющий имена комплектов ресурсов, от которых зависит данный комплект.
  • jsOptions: Задаёт параметры, которые будут переданы методу yii\web\View::registerJsFile(), когда он вызывается для регистрации каждого JavaScript файла комплекта.
  • cssOptions: Задаёт параметры, которые будут переданы методу yii\web\View::registerCssFile(), когда он вызывается для регистрации каждого CSS файла комплекта.
  • publishOptions: Задаёт параметры, которые будут переданы методу yii\web\AssetManager::publish(), когда метод будет вызван для публикации файлов ресурсов. Публикация — это копирование файлов ресурсов в директорию, доступную по HTTP. Это свойство используется только в том случае, если задано свойство sourcePath.

Ресурсы, в зависимости от их расположения, могут быть классифицированы как:

  • Исходные ресурсы: файлы ресурсов, расположенные вместе с исходным кодом PHP, которые не могут быть непосредственно доступны через Web. Для того, чтобы использовать исходные ресурсы на странице, они должны быть скопированы в Web директорию. Этот процесс называется публикацией ресурсов.
  • Опубликованные ресурсы: файлы ресурсов, расположенные в Web-директории и, таким образом, могут быть напрямую доступны через Web.
  • Внешние ресурсы: файлы ресурсов, расположенные на другом Web сервере.

Если задано свойство sourcePath — любые перечисленные ресурсы будут рассматриваться как исходные. Если свойство не задано, все ресурсы рассматриваются как опубликованные. В этом случае следует задать basePath и baseUrl, чтобы дать знать Yii, где эти ресурсы располагаются.

Рекомендуется размещать ресурсы, принадлежащие приложению, в Web директорию, для того, чтобы избежать не нужного процесса публикации. Вот почему в примере выше заданы basePath и baseUrl вместо sourcePath.

Использование комплекта ресурсов

Для использования комплекта ресурсов, нужно его зарегистрировать. Зарегистриуем комплект ресурсов в layout-шаблоне, вызвав метод yii\web\AssetBundle::register():

use app\assets\AppAsset;
AppAsset::register($this);

При вызове этого метода:

  • для каждого css-файла будет вызван метод yii\web\View::registerCssFile()
  • для каждого js-файла будет вызван метод yii\web\View::registerJsFile()

Если какой-то js-файл нужно подключить только для одной страницы контроллера, можно его зарегистрировать прямо в view-шаблоне:

<?php
namespace app\controllers;
use yii\web\Controller;

class SiteController extends Controller {
    public function actionIndex() {
        return $this->render('index');
    }
    public function actionHello() {
        return $this->render('hello');
    }
}
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;

$this->registerJsFile('@web/js/hello.js');
$this->title = 'Hello';
?>
<div class="site-hello">
    <h1><?= Html::encode($this->title) ?></h1>
    <p>Это страница «Hello». Вы можете изменять эту страницу, редактируя файл шаблона:</p>
    <code><?= __FILE__ ?></code>
</div>

При подключении скрипта можно указать дополнительные параметры:

$this->registerJsFile(
    '@web/js/hello.js',
    [
        'depends' => 'yii\web\YiiAsset', // зависимости для скрипта
        'position' => $this::POS_HEAD    // подключать в <head>
    ]
);

Пример подключения шрифта Font Awesome

<?php
// создаем комплект ресурсов
namespace app\assets;
use yii\web\AssetBundle;

class FontAwesomeAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        'icon/css/font-awesome.min.css',
    ];
}
// регистрируем два комплекта ресурсов в layout-шаблоне
use app\assets\AppAsset;
use app\assets\FontAwesomeAsset;

AppAsset::register($this);
FontAwesomeAsset::register($this);

Пример добавления небольшого JS-кода

// регистрируем небольшой js-код в view-шаблоне
$script = <<< JS
$('[type="submit"]').on('click', function(e) {
    $.ajax({
        url: '/path/to/action',
        data: {id: '123', other: 'other data'},
        success: function(response) {
            // process data
        },
        error: function() {
            alert('Произошла ошибка при отправке данных!');
        }
    });
});
JS;
// значение $position может быть View::POS_READY (значение по умолчанию),
// или View::POS_LOAD, View::POS_HEAD, View::POS_BEGIN, View::POS_END
$position = $this::POS_READY;
$this->registerJs($script, $position);

Если $position равно View::POS_READY, js-код будет обернут в

<script>
jQuery(window).load(function() {
    // код будет здесь
});
</script>

Leave a Comment