/var/log/life.log
Блог программиста из солнечной Бурятии

Подключение javascript в joomla и немного powershell

Во многих случаях возникает необходимость подключения javascript в модуль или в компонент.
Начнём с того, что подключать javascript следует в шаблоне модуля или компонента, чтобы в случае необходимости переопределить шаблон не приходилось ещё и код модуля/компонента менять и помнить об этом изменении при обновлении.

В joomla это можно сделать несколькими способами:

  • добавив тег script
  • Через JDocument
  • Через JHtml


Добавлять подключение скрипта через тег script не очень хорошая идея, для автоматической обработки скриптов придётся парсить результирующий html.

Писать в шаблоне

1
<?php JFactory()->getDocument()->addScript('script.js')?>

Уже лучше, но код в шаблоне тоже не очень хорошая практика.

У JHtml этих недостатков нет и при этом есть дополнительные преимущества.

1
JHtml::_('script','script.js');

дополнительные параметры:

1
2
3
4
5
boolean  $framework       Подключать ли mootools
boolean  $relative        указан путь до файла относительно папки /media
boolean  $path_only       возвращает только путь до файла
boolean  $detect_browser  определение браузера для подключения специфичных js
boolean  $detect_debug    подключать не сжатые файлы для дебага

$detect_browser по умолчанию true
происходит поиск специфичного js файла для конкретного браузера имя должно формироваться по следующим правилам:
filename.ext, filename_browser.ext, filename_browser_major.ext, filename_browser_major_minor.ext

$detect_debug по умолчанию true
если для подключаемого скрипта script.js есть файл script-uncompressed.js, то в режиме отладки будет подключён именно он.

На днях поставил powershell, поэтому решил попробовать на нём написать функцию для упаковки js с учётом требований joomla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function pack-js($arg){
    $yuicompressor = "C:\\work\\tools\\yuicompressor-2.4.8.jar"
    $path = ""
    if ([string]::IsNullOrEmpty($arg)){
        $path = Get-Location
        $path = $path.toString()+""
    } else {
        $path = $arg
    }
    $js = Get-ChildItem $path -Filter *.js|Foreach-Object {$_.Name}
    foreach($file in $js){
        $unpack = $file -replace ".js","-uncompressed.js"
        if (($file -notmatch "\.min\.") -and  ($file -notmatch "\.pack\.")  -and  ($file -notmatch "\-uncompressed\.js") -and (-not ($js -contains $unpack))){
            Copy-Item $path$file $pack$unpack
            &"java" -jar $yuicompressor --type js --charset utf-8 -o  $path$file $path$file
        }
        if ($file -match "-uncompressed\.js"){
            $compress = $file -replace "-uncompressed.js",".js"
            &"java" -jar $yuicompressor --type js --charset utf-8 -o  $compress $path$file
        }
    }
}

Работа функции заключается в том, чтобы упаковывать через yuicompressor js файлы, находящиеся в папку переданной в аргументе или в текущей папке, если без аргументов. Специфика в том, что если файл не упакован, т.е. для него нет uncompressed версии, то сначала такая создаётся, а уже потом файл упаковывается.
Удобство заключается в том, что на сервере для разработки joomla в debug режиме и подключаются несжатые файлы, а на рабочем будут подключатся упакованные без каких либо изменений в коде.