Портал Belkin-labs»PHP классы»Статья
welcome!

CS-CART: где и как происходит обработка стилей и слитие их в один файл?

Вас не раздражает тот факт, что CS-CART пользуется гигантским стилевым файлом, который страшно сложно отлаживать? Конечно лично мне хотелось бы в целях отладки иметь миллион маленьких несжатых файлов, а на интернете иметь один, но сжатый. Мы же в движке имеем весьма своеобразный подход. На интернете мы имеем огромный несжатый файл, а для отладки мы имеем его же и даже тот факт, что он не сжат, все равно не дает им пользоваться так, как хотелось бы.

Так где и как движок обрабатывает стили?

Ну, очевидно, этим должен заниматься Smarty. И точно! Есть SMARTY плагин, имеющий имя smarty_block_styles(), и находящийся в файле /app/functions/smarty_plugins/block.styles.php.

Давайте посмотрим, как же он работает?

Очень криво! Как, впрочем и очень многое в этом крутом двигле. Там имена стилей и вся сопутствующая информация выдирается из текста уже подготовленного htm-кода тегов link с помощью регулярок. Удивительно, но в этом плагине подразумевается возможность того, что в списке стилей будут стили внешние. То есть такие, у которых хост другой указан. Я попробовал указать хост явно и у меня ничего не вышло. Почему?

Есть еще один плагин, который отвечает за производство тегов link. К сожалению, из анализа кода этого плагина видно, что не существует возможности указать стилевой файл с другого хоста. К любому источнику обязательно добавится путь по умолчанию. Странно, да? Кстати, сам описываемый плагин находится в файле /app/functions/smarty_plugins/function.style.php.

А где готовится единый файл?

Это делается в специальной функции fn_merge_styles() в модуле /app/functions/fn.common.php. Функция длинная, трудночитаемая и имеет крайне витиеватый алгоритм. Начинающим программистам стоит разобраться в ней и в качестве упражнения прикинуть, какие основополагающие принципы программирования нарушены и решить для себя, как надо эту функцию переделать.

Никаких хуков в этой функции нет! Так что переделывать ее можно только на свой страх и риск.

Дорогие начинающие программисты!
Программа - это не статья на русском литературном языке, где можно писать и о том, и о сем, делать врезки, вставки, лирические отступления, отвлекаться на анекдоты, поучения молодежи и так далее. Программа должна строиться на принципах "от простого к сложному" и текст одной функции должен, в идеале, умещаться на одном экране. В функции должна быть явная и хорошо осознаваемая структура. Очень часто читаешь чужие функции и чувствуешь, что программиста "несло по алгоритмическим ухабам..."

А как сделать так, чтобы не сливать файлы в один?

Знаете, там есть еще одни грабли. Эти грабли называются "Less". Плагин /app/functions/smarty_plugins/function.style.php делает теги link. И все бы хорошо, но там, в этих тегах могут быть файлы ".less" Эти файлы будут вынуты из текста готовых линков и отправлены в функцию fn_merge_styles(). После этого будет создан один новый тег линк с уже готовым скомпилированным файлом, в котором все less и css. И вот он уже будет вставлен в страницу.

Чувствуете, какая эффективность офигительная?
Сначала создаем код Smarty. Потом парсим этот код и создаем html-код тегов link. Но этот html-код нужен нам только для дальнейшего парсинга! Круть, да и только. И эти люди, как говорится, запрещают нам ковырять в носу!

Получается, что прежде, чем пытаться отлаживать код css, нам надо сначала научиться отлаживать код less! А если мы умеем отлаживать less, то тогда извольте работать со стилевым файлом размером больше 100 кБ.

А все-таки?

Ну, если вы делаете свой собственный, абсолютно кастомный дизайн и уходите от существующей системы стилей, и имеете одни только css, то можно в функции smarty_block_styles() где-нибудь поближе к началу временно поставить строчку return $content; и тогда созданный код линков вернется без изменений. А заодно я бы еще сделал сжатие CSS кода для production работы сайта. Для этого надо переделывать приведенную выше функцию, а потом не забывать обновлять ее вместе с обновлениями движка.

Финальная желчь

У меня есть телефон на Андроиде. И есть планшет на Андроиде. И я не обновляю на них программное обеспечение, поскольку знаю точно, что лучше не будет, а хуже - вполне может быть. Точно так же я бы до сих пор работал на windows XP, которая, хоть и дерьмо, но привычное и, как бы, родное. Но нет! Была сделана Виста, семерка, восьмерка и десятка. И на мой взгляд это все иллюстрирует ту самую спираль вниз, которую я и пытаюсь описать. На висту, я, кстати, так и не смог перейти. Перешел на Убунту и жутко доволен. Тоже сложности есть, но хоть деньги на это свои тратить не нужно!

Так вот, то же самое мы видим и в области программного обеспечения. Делаются инструменты разработки, которые не упрощают, а усложняют работу программиста. Делается Смарти, которая, кажется, нарушает все возможные принципы создания легко читаемых программ. Код Смарти напоминает мне код с GOTO. Точно так же запутывает код. Потом делается Less, который, как бы полезный, но тоже укрупняет код, делает крайне сложным его отладку и практически закрывает его, формально открывая. Вот такие странные вещи происходят.

Куда катится мир? Не знаю! Пойду напьюсь!

Крайне занудный (сегодня)
Дмитрий Белкин

Статья создана 29.08.2015