Автоматическое подключение js файлов в Yii Framework

Если посмотреть js файлы многих сайтов, то, в большинстве случаев, можно увидеть файлы типа scripts.js, main.js, functions.js и т.д. в которых тысячи строк самых разных скриптов, и половина которых скорее всего не нужна на этой странице. Другой крайностью является десятка два подключаемых файлов, которые создают лишнюю нагрузку на сервер.

При разработке приложений на Yii я выработал следующую методику организации js файлов.

В webroot/js создаются папки с названиями контроллеров, например:

  • js/site
  • js/articles

Если для реализации функционала экшена контроллера необходим свой js код, то он кладется в свою папку и файл с названием экшена.

  • js/articles
  •     js/articles/update.js
  •     js/articles/selectground.js

Бывают случаи, когда необходимо вынести общую часть когда — создается файл shared.js который включается для всех экшенов.

В процессе разработки удобно, когда код разнесен по разным файлам, в продакшене используется объединение и сжатие скриптов с помощью расширения cclientscriptminify.

На заключение, код который автоматически подключает необходимые файлы, поместить в components/Controller.php

/**
 * Вспомогательные действия
 *
 * @param $action
 * @return bool
 */
public function beforeAction($action) {
    parent::beforeAction($action);
 
    $actionScriptFile = Yii::getPathOfAlias("webroot.js.".Y::app()->controller->id)
                        .'/'.Y::app()->controller->action->id . '.js';
 
    if (file_exists($actionScriptFile)) {
        Yii::app()->clientScript->registerScriptFile(Html::asset($actionScriptFile));
    }
 
    $sharedScriptFile = Yii::getPathOfAlias("webroot.js.".Y::app()->controller->id)
                        .'/shared.js';
 
    if (file_exists($sharedScriptFile)) {
        Yii::app()->clientScript->registerScriptFile(Html::asset($sharedScriptFile));
    }
 
    return true;
}
  • 27.09.2011
  • Yii
  • Anonymous

    Сто раз же уже писали, что и CSS и JS надо подключать в beforeRender(), плюс проверять что за mime-тип рендеришь. Если ты выводишь XML, подключение твоей JS-ки разрушит всю разметку.

    • http://sergebezborodov.com Serge Bezborodov

      Согласен с Вами, исправлю