Smarty Minify

Smarty Minify

Smarty Minify (сжатие и упаковка js, css и less)

Данный модуль позволяет сжимать и объеденять css, js, less файлы и коды с возможностью сжатия через gzip и дальнейшим кэшированием.

1. Папки из архива распаковываем в корень сайта 

2. В файле api/Turbo.php после строки:

'design'     => 'Design',

добавляем: 

'js'     => 'Javascript',
'css'     => 'Stylesheet',

3. view/View.php после строки:

// Настраиваем плагины для смарти

добавляем:

// функции для работы с js 
$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'));
        
 // функции для работы с css 
 $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)

добавляем:

/*
    * Функции для работа с файлами javascript
    * Регистрация  js фал(а|ов) или кода
    */
    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']);
        }
    }    
    /*
    * Отмена регистрации js фал(а|ов) или кода
    */
    public function unset_javascript_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;


        $this->js->unplug($params['id']);
    }
    /*
    * Вывод упакованого js файла 
    */
    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']);
    }    
    
    /*
    * Функции для работа с файлами стилей
    * Регистрация  css фал(а|ов) или кода
    */
    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']);
        }
    }    
    /*
    * Отмена регистрации css фал(а|ов) или кода
    */
    public function unset_stylesheet_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;


        $this->css->unplug($params['id']);
    }
    /*
    * Вывод упакованого css файла 
    */
    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']);
    }

 4.  В config/config.php после

[smarty]

добавляем:

minify_js    = false                ; сжимать javascript (true=да, false=нет)
minify_css    = false                    ; сжимать css (true=да, false=нет)
minify_gzip_level    = 0                    ; уровень сжатия (gzip) от 0 до 9
minify_cache_dir    = cache/minify/    ; папка для кеширования

5. В .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]

Как использовать:

После установки в файле шаблона где мы выводим js и css (обычно index.tpl) необходимо разместить коды:

{stylesheet minify=false} для вывода css (обычно перед </head>)
...........
{javascript combine=false} для вывода js (обычно перед </body>)

данные теги могут принимать параметры (если они не указаны то возьмутся глобальные из настроек в config/config.php):

  • combine=true - паковать все в один файл / false - не паковать
  • minify=true - сжить код / false - не сжимать
  • id - идентификатор. Вывести с очереди js или css с указанным ид

Данные коды служат для вывода наших скриптов и стилей.
 
Далее как добавлять js и css:
 
Добавлять их можно с каких угодно tpl. Варианты добавления:
 
CSS:
Регистрация сразу нескольких файлов 

{css id="libs" include=[
"design/{$settings->theme}/css/bootstrap.css",
"design/{$settings->theme}/css/animate.css",
"design/{$settings->theme}/css/style.css"
]}{/css}

регистрация 1 файла:

{css id="theme" include="design/{$settings->theme}/css/theme.css"}{/css}

регистрация 1 файла и произвольного кода:

{css id="mycode" include="design/{$settings->theme}/css/mycode.css" render=true}
.my_class {
color: red
}
{/css}

убрать код с регистрации:

{unset_css id="mycode"}

данные функции принимают параметры:

  • 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)

JavaScripts:
Регистрация сразу нескольких js-файлов:

{js id="libs" priority=99 include=[
"design/{$settings->theme}/js/jquery-2.1.1.min.js",
"design/{$settings->theme}/js/bootstrap.min.js"
]}{/js}

Удаление из очереди: 

{unset_js id="mycode"}

Коментарии

Пока нет комментариев.