Велосипед не мой, но очень полезный. Сначала поработаем под капотом:
- Распаковать из архива в корень сайта файлы
- Добавим в api/Simpla.php:
'js' => 'Javascript',
'css' => 'Stylesheet',
- Добавим в файл view/View.php после строки:
$this->design->smarty->registerPlugin('block', 'js', array($this, 'add_javascript_block'));
$this->design->smarty->registerPlugin('function', 'unset_js', array($this, 'unset_javascript_function'));
$this->design->smarty->registerPlugin('function', 'javascript', array($this, 'print_javascript'));
$this->design->smarty->registerPlugin('block', 'css', array($this, 'add_stylesheet_block'));
$this->design->smarty->registerPlugin('function', 'unset_css', array($this, 'unset_stylesheet_function'));
$this->design->smarty->registerPlugin('function', 'stylesheet', array($this, 'print_stylesheet'));
- Далее в этом же файле перед строкой:
public function get_discounted_products_plugin($params, &$smarty)
Добавим:
public function add_javascript_block($params, $content, $smarty, &$repeat)
{
if(!isset($params['id']) || $repeat || (empty($content)) && empty($params['include']))
return false;
if(!isset($params['priority']))
$params['priority'] = 10;
if(!empty($params['include']))
$this->js->add_files($params['id'], $params['include'], $params['priority']);
if(!empty($content))
$this->js->add_code($params['id'], $content, $params['priority']);
if(!empty($params['render']))
{
if(!isset($params['minify']))
$params['minify'] = null;
if(!isset($params['combine']))
$params['combine'] = true;
return $this->js->render($params['id'], $params['minify'], $params['combine']);
}
}
public function unset_javascript_function($params, $smarty)
{
if(!isset($params['id']))
return false;
$this->js->unplug($params['id']);
}
public function print_javascript($params)
{
if(!isset($params['id']))
$params['id'] = null;
if(!isset($params['combine']))
$params['combine'] = true;
if(!isset($params['minify']))
$params['minify'] = null;
return $this->js->render($params['id'], $params['minify'], $params['combine']);
}
public function add_stylesheet_block($params, $content, $smarty, &$repeat)
{
if(!isset($params['id']) || $repeat || (empty($content)) && empty($params['include']))
return false;
if(!isset($params['priority']))
$params['priority'] = 10;
if(!isset($params['less']))
$params['less'] = false;
if(!empty($params['include']))
$this->css->add_files($params['id'], $params['include'], $params['priority'], $params['less']);
if(!empty($content))
$this->css->add_code($params['id'], $content, $params['priority'], $params['less']);
if(!empty($params['render']))
{
if(!isset($params['minify']))
$params['minify'] = null;
if(!isset($params['combine']))
$params['combine'] = true;
return $this->css->render($params['id'], $params['minify'], $params['combine']);
}
}
public function unset_stylesheet_function($params, $smarty)
{
if(!isset($params['id']))
return false;
$this->css->unplug($params['id']);
}
public function print_stylesheet($params)
{
if(!isset($params['id']))
$params['id'] = null;
if(!isset($params['combine']))
$params['combine'] = true;
if(!isset($params['minify']))
$params['minify'] = null;
return $this->css->render($params['id'], $params['minify'], $params['combine']);
}
- В config-файл добавляем:
minify_js = false;
minify_css = false;
minify_gzip_level = 0;
minify_cache_dir = cache/minify/;
- В .htaccess после RewriteEngine on добавляем:
<FilesMatch "(js|css).gz[1-9]$">
<IfModule mod_headers.c>
Header set Content-Encoding: gzip
</IfModule>
<FilesMatch "css.gz[1-9]$">
ForceType text/css
</FilesMatch>
<FilesMatch "js.gz[1-9]$">
ForceType text/javascript
</FilesMatch>
</FilesMatch>
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cache/minify/(.+).gz([1-9])$ resize/gzip.php [L,END]
Чтобы всё заработало:
{stylesheet minify=true}
{javascript combine=true}
Группировка файлов:
{css id="libs" include=[
"design/{$settings->theme}/css/bootstrap.css",
"design/{$settings->theme}/css/animate.css",
"design/{$settings->theme}/css/style.css"
]}{/css}
{js id="libs" priority=99 include=[
"design/{$settings->theme}/js/jquery-2.1.1.min.js",
"design/{$settings->theme}/js/bootstrap.min.js"
]}{/js}
Функции принимают параметры:
id — служит для идентификации (обязательный параметр)
include — строка или массив строк для добавления в очередь
priority — приоритет вывода. По умолчанию равен 10 (если не указывать файлы будут становится один за одним согласно вызову функций) Чем больше приоритет тем он быстрее будет на выводе
less — если установлено true то данному ресурсу будет применен синтаксис less и перекодирован в css. (по умолчанию: false)
render — если данный параметр установлен в true то код на очередь не станет, а будет выведен прямо в месте вызова функции. Параметры minify и combine буриться глобальные.
minify — если данный параметр установлен в true то к данному ресурсу будет применяться сжатие. Если false — то файлы принадлежащие данному id не будут сжиматься. (по умолчанию: значение config.php)
combine — если данный параметр установлен в true то к данному ресурсу будет применяться упаковка в один файл. Если false — то файлы принадлежащие данному id не будут паковаться в один файл. (по умолчанию: значение config.php)