Jump to content

HTML сжатие страницы Simpla CMS (Smarty)


Go to solution Solved by osben,

Recommended Posts

Гоняетесь за галочками от Google по оптимизации?

https://developers.google.com/speed/pagespeed/insights/?hl=ru

 

Тогда это решение для вас. Встроенное пожатие страниц вашего магазина.

 

  1. создайте бекап файла Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php на всякий пожарный. Я не уверен, но кажется что Smarty давно не обновляется, но если что бекап пригодится.
  2. скачайте smarty_internal_templatecompilerbase.php и залейте файл вместо него.
  3. почистите папку compiled/имя вашего проекта/
  4. пользуйтесь.
Link to post
Share on other sites
  • Solution

с какой то версии симплы есть в config/config.php строка smarty_html_minify = false;
надо заменить на true 

Если Ваше решение отличается и оно на Ваше мнение лучше, то думаю стоит добавить патч на GitHub

Link to post
Share on other sites

с какой то версии симплы есть в config/config.php строка smarty_html_minify = false;

надо заменить на true 

 

Если Ваше решение отличается и оно на Ваше мнение лучше, то думаю стоит добавить патч на GitHub

блин подстава... действительно есть. Но в старой не было... хм, что делать прям не знаю. А что там за строчка кеш? Расскажите?

Link to post
Share on other sites

с какой то версии симплы есть в config/config.php строка smarty_html_minify = false;

надо заменить на true 

 

Если Ваше решение отличается и оно на Ваше мнение лучше, то думаю стоит добавить патч на GitHub

моё решение меркнет перед полноценным минификатором. У вас даже контент в теxtarea предусмотрен.

Link to post
Share on other sites

с какой то версии симплы есть в config/config.php строка smarty_html_minify = false;

надо заменить на true 

 

Если Ваше решение отличается и оно на Ваше мнение лучше, то думаю стоит добавить патч на GitHub

Что если нет такой строчки в config.php?

Link to post
Share on other sites

Что если нет такой строчки в config.php?

То надо обновится что было. 

Что именно обновлять, простите нету времени анализировать и расписывать в бесплатном порядке 

Link to post
Share on other sites

моё решение меркнет перед полноценным минификатором. У вас даже контент в теxtarea предусмотрен.

Стандартное решение хорошо, но есть нюансы при компиляции, остаются лишние пробелы

 

"<!DOCTYPE html> <html> <head> <title>Хиты продаж</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <m"

Link to post
Share on other sites

Стандартное решение хорошо, но есть нюансы при компиляции, остаются лишние пробелы

 

"<!DOCTYPE html> <html> <head> <title>Хиты продаж</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <m"

хм... ну хорошо, вы дали мне надежду что моё не стандартное решение не хуже. Допилю и выложу чуть позже.

Link to post
Share on other sites

ну или юзать моё решение если нет желания обновляться.

То что я Вам показал, после обновления ;)

 

Простой способ решить данную проблему, после:

 

// call compiler

$_compiled_code = $this->doCompile($_content);

 

добавить:

 

$_compiled_code = preg_replace('#[\n\r\t]#us', '', $_compiled_code);

 

 

p.s. визуально проблема решена, но я не программист, может что-то и не правильно написал и в дальнейшем могут возникнуть проблемы..

Link to post
Share on other sites

То что я Вам показал, после обновления ;)

 

Простой способ решить данную проблему, после:

 

// call compiler

$_compiled_code = $this->doCompile($_content);

 

добавить:

 

$_compiled_code = preg_replace('#[\n\r\t]#us', '', $_compiled_code);

 

 

p.s. визуально проблема решена, но я не программист, может что-то и не правильно написал и в дальнейшем могут возникнуть проблемы..

 

Еще как могут!

Например, если в шаблоне будет фрагмент JS из двух строк вида

a=1

b=2

то Ваш метод склеит две строки в одну, и гарантирована ошибка...

Link to post
Share on other sites

Еще как могут!

Например, если в шаблоне будет фрагмент JS из двух строк вида

a=1

b=2

то Ваш метод склеит две строки в одну, и гарантирована ошибка...

А разве переменные или как там это называется, не разделяются запитой ? Если вы правы, то там нужна более детальное функция))

Link to post
Share on other sites

Kors прав. Но это страшно не только для жс  но и html и css.

Поскольку данное регулярное выражении вырежет все пробелы.

Если хотите избавится от тех нескольких пробелов - то копайте сюда Smarty\libs\plugins\outputfilter.trimwhitespace.php

Link to post
Share on other sites

А разве переменные или как там это называется, не разделяются запитой ? Если вы правы, то там нужна более детальное функция))

просто игнорются вложения в script textarea style pre

остальное пожимается. Причем табуляцию убирать тоже нельзя, она может использоваться как пробел.

У нормальных людей нет скриптов в коде страниц. Только линки.

Link to post
Share on other sites

У нормальных людей нет скриптов в коде страниц. Только линки.

У подавляющего большинства сайтов есть JS-скрипты внутри body. Например, так оформляются разные счетчики и подобные вставки. По-Вашему, и http://rozetka.com.ua/ и http://www.mvideo.ru/ и десятки подобных сделаны ненормальными. Как-то Вы категорично оцениваете...

 

Другой вопрос, что JS-скрипт надо писать, не полагаясь на переводы строк как разделители, а разделять операторы явно через ';'...

Link to post
Share on other sites

SerSport

Я ж уже вроде подсказывал куда копать...

Smarty\libs\plugins\outputfilter.trimwhitespace.php

Находите строку 63:

'#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
И заменяете ее на:
'#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1\2',
Кстати. Я бы на Вашем месте меньше волновался б за эти несчастные пару пробелов. Поскольку при установке smarty_html_minify = true; Функция для уменьшения html кода страницы вызывается каждый раз после генерации html. Я уже говорил Мизантропу что бы он, если хочет сделать нормально, делал pre фильтр. Для того что бы сжать еще взятый tpl. Но он пошел каким то не понятным путем правок smarty и тд.
Link to post
Share on other sites
Для того что бы сжать еще взятый tpl. Но он пошел каким то не понятным путем правок smarty и тд. 

Здесь в теме опубликован как раз метод пожатия компайла шаблонов. Этого же достаточно. Или кто-то из нас кого-то не понял.

Link to post
Share on other sites

У подавляющего большинства сайтов есть JS-скрипты внутри body. Например, так оформляются разные счетчики и подобные вставки. По-Вашему, и http://rozetka.com.ua/ и http://www.mvideo.ru/ и десятки подобных сделаны ненормальными. Как-то Вы категорично оцениваете...

а что мешает сделать счетчики в js-файлах? Я лишь говорю об идеальном положении вещей. HTML страница для html-кода. JS-файлы для js-кода и т.д. Разделяй и властвуй.

Link to post
Share on other sites

 





Для того что бы сжать еще взятый tpl. Но он пошел каким то не понятным путем правок smarty и тд. 
Здесь в теме опубликован как раз метод пожатия компайла шаблонов. Этого же достаточно. Или кто-то из нас кого-то не понял.

 

Вы пропускаете через регулярные выражения уже результат выполнения шаблона. То есть каждый шаблон, при каждой загрузке страницы, проходит через вашу регулярку.

Вы писали в теме http://forum.simplacms.ru/topic/8320-где-в-движке-simpla-csm-компилятся-шаблоны/

 

Те, что потом записываются в /var/www/site/compiled/template/*.tpl.php

Хочу сделать пожатие html кода. Пока удалось пожимать на лету, но не выход ибо нагрузка на процессор сервера.

По сути Ваше текущее решение и есть пожатие на лету... И smarty_html_minify = true - тоже есть пожатие на лету.

Link to post
Share on other sites

Вот на мой взгляд лучшее решения для этой задачи. Может кто что предложит лучше.

Simpla с smarty > 3

В smarty - ничего не меняем

Просто заменяем api/Design.php

и в config/config.php ставим smarty_html_minify = true;

Design.php

Link to post
Share on other sites

 

Вы пропускаете через регулярные выражения уже результат выполнения шаблона. То есть каждый шаблон, при каждой загрузке страницы, проходит через вашу регулярку.

Вы писали в теме http://forum.simplacms.ru/topic/8320-где-в-движке-simpla-csm-компилятся-шаблоны/

 

По сути Ваше текущее решение и есть пожатие на лету... И smarty_html_minify = true - тоже есть пожатие на лету.

Нет дорогой мой человек, компайл компилится только один раз при изменении шаблона. А дальше он отдается по запросу. Вы можете открыть файлы и увидеть что они хранятся сжатыми. Так что нет ни какого "на лету". Только если у вас компайл не настроен на постоянную компиляцию при каждом запросе. Но это уже не ко мне ;)

А та тема прошлое моё неудачное решение задачи.

Link to post
Share on other sites

Вот на мой взгляд лучшее решения для этой задачи. Может кто что предложит лучше.

Simpla с smarty > 3

В smarty - ничего не меняем

Просто заменяем api/Design.php

и в config/config.php ставим smarty_html_minify = true;

а вы уверены, что этот файл ни у кого не изменялся напильником? Как вариант указать строки с изменениями.

Link to post
Share on other sites

Нет дорогой мой человек, компайл компилится только один раз при изменении шаблона. А дальше он отдается по запросу. Вы можете открыть файлы и увидеть что они хранятся сжатыми. Так что нет ни какого "на лету". Только если у вас компайл не настроен на постоянную компиляцию при каждом запросе. Но это уже не ко мне ;)

А та тема прошлое моё неудачное решение задачи.

 

Беру свои слова назад. У Вас не налету.

Но предложенный Вами способ - будет терять переменные и делать ошибки - и это факт.

Для примера можете попробовать передать ассоциативный массив в смарти. К примеру такой:

$simpla->view->assign('ttestt', array('key  two spaces'=>'work'));
И в шаблоне попробовать вывести:
{$ttestt['key  two spaces']}
В результате переменной - не будет, а если включен показ ошибок E_ALL то еще и ошибку. И это пример только с пробелами. А могут быть еще и \n\r\t и что угодно...

А вообще - что это за проверка такая? 

 if(!false && !preg_match('#/(simpla|order)/#i',$this->template->getTemplateFilepath())){
Может хотя бы так:
if(!preg_match('#/(simpla|order)/#i', $this->smarty->_current_file)){
 

а вы уверены, что этот файл ни у кого не изменялся напильником? Как вариант указать строки с изменениями.

 

Ну если у кого то изменялся то там всего перенести 1 ф-ю и 1 строку заменить, а не заменять весь класс смарти.

Link to post
Share on other sites

По моему вы придираетесь. Вероятность, что будет ассоциативный массив, с ключом в котором есть двойной пробел стремится к нулю. И даже если он есть, то вероятность, что будут обращаться по его имени ещё меньше все ограничится ещё на этапе перебора. Перенос в ключе и вовсе может вызвать синтаксическую ошибку вы не находите? Вообще не могу представить себе ситуацию когда кто-то будет использовать такие ключи. Это нужно быть большим извращенцем оригиналом. А если и так, то он сам себе злобный Буратино.

 

Второе является скорее перестраховкой. Осталось от старой версии кода поскольку тестировался на живом магазине. Можно убрать. Так же не вижу проблем с указанием имени вместо пути. Даже если и попадет в условие фильтра какая нибудь ещё страница на работу сайта это не скажется.

 

И потом вы не внимательно читаете тему я тут уже написал, что решение с указанием в конфигурации параметра более лучше. Так об чем разговор? Показать кто лучше или круче?

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...