[pdoTools] 2.7.0 - улучшения Fenom
Привет, друзья!
Для обновления доступна новая версия pdoTools, в которой обновлён сам Fenom, добавлена пара функций, а также исправлена одна серьёзная недоработка.

А теперь подробнее.
Fenom обновлён до последней текущей версии 2.11.4, список изменений вы можете найти в его репозитории.
В список разрешенных PHP функций (то есть тех, которые доступны всегда) внесены rand() и number_format(). Лично я их использую почти на каждом проекте, и писать каждый раз сниппеты для их вызова уже надоело. number_format также доступен и как модификатор.
Примеры:
Суть в том, что Fenom на страницах сайта (когда включен для работы везде) вызывается после обработки документа MODX, когда тот уже сохранил все подключенные скрипты и стили в $modx->resource. И если вы вызываете кэшированный MinifyX, то работать он будет только один раз — при пустом кэше. Второй раз он уже не запустится (как и должно быть с кэшированными сниппетами), но и результатов его работы от первого запуска в кэше документа нет — так что пустота вместо скриптов и стилей.
То есть, вызывать сниппеты, регистрирующие скрипты со стилями, можно было только в некэшированном виде — иначе они не работали. Для принудительного сохранения результатов их деятельности я добавил вот эти строки в pdoParser. Тогда всё зарегистрированное попадало в кэш ресурса и проблема, казалось бы, решена.
Однако, Fenom позволяет регистрировать скрипты и стили не только через сниппеты, но и напрямую — через вызов {$_modx->regClientScript()} и подобных функций. И вот тут выходит серьёзная проблема, если содержимое вызова меняется.
Например, вывод в консоли случайного числа:
Но так как вызов скрипта из кэша не совпадает с тем, что будет в шаблоне во второй вызов (число-то случайное!), то при последующих загрузках мы получим 2 вызова этого скрипта с 2мя разными числами. Первое будет получаться из кэша, а второе — запускаться динамически из шаблона.
Можно представить массу ситуаций, когда такой кэш будет мешать разрабатывать динамические сайты.
Поэтому я добавил сохранение скриптов и стилей, подключаемых через Fenom, в отдельные временные массивы и удаление их из кэша ресурса. Таким образом всё, что подключается через {$_modx->regClientScript()} и другие подобные функции, в кэш больше не сохраняется.
Динамические вызовы скриптов, как в примере выше, работают без проблем.
При этом нужно помнить, что если вы регистрируете скрипты и стили через кэшированные сниппеты, и меняете их параметры напрямую в файлах шаблона, без очистки кэша в админки — никаких изменений вы не увидите по описанным выше причинам. Вы будете видеть старые скрипты и стили, зарегистрированные первый раз в момент генерации кэша.
Так что, во время разработки, MinifyX через Fenom лучше запускать некэшированным.
Новая версия уже доступна в репозитории modstore.pro — можно обновляться.
P.S. Кстати, если вы вдруг уже используете на сайте сниппеты rand или number (number_format) как модификаторы строк в Fenom — их заменят функции в новой версии. Так что обновите свои вызовы, если нужно.
Для обновления доступна новая версия pdoTools, в которой обновлён сам Fenom, добавлена пара функций, а также исправлена одна серьёзная недоработка.

А теперь подробнее.
Fenom обновлён до последней текущей версии 2.11.4, список изменений вы можете найти в его репозитории.
В список разрешенных PHP функций (то есть тех, которые доступны всегда) внесены rand() и number_format(). Лично я их использую почти на каждом проекте, и писать каждый раз сниппеты для их вызова уже надоело. number_format также доступен и как модификатор.
Примеры:
{rand(1, 10)} // вывеведет случайное число от 1 до 10
{var $number = 10000}
{number_format($number, 0, '.', ' ')} // выведет 10 000
{$number | number : 0 : '.' : ' '} // тоже выведет 10 000, просто вызван как модификаторА теперь самое интересное — про недоработку. Тем это давнишняя, ей уже примерно год.Суть в том, что Fenom на страницах сайта (когда включен для работы везде) вызывается после обработки документа MODX, когда тот уже сохранил все подключенные скрипты и стили в $modx->resource. И если вы вызываете кэшированный MinifyX, то работать он будет только один раз — при пустом кэше. Второй раз он уже не запустится (как и должно быть с кэшированными сниппетами), но и результатов его работы от первого запуска в кэше документа нет — так что пустота вместо скриптов и стилей.
То есть, вызывать сниппеты, регистрирующие скрипты со стилями, можно было только в некэшированном виде — иначе они не работали. Для принудительного сохранения результатов их деятельности я добавил вот эти строки в pdoParser. Тогда всё зарегистрированное попадало в кэш ресурса и проблема, казалось бы, решена.
Однако, Fenom позволяет регистрировать скрипты и стили не только через сниппеты, но и напрямую — через вызов {$_modx->regClientScript()} и подобных функций. И вот тут выходит серьёзная проблема, если содержимое вызова меняется.
Например, вывод в консоли случайного числа:
{var $rand = rand()}
{$_modx->regClientScript('
<script type="text/javascript">
console.log(' ~ $rand ~ ');
</script>', true)}При первом вызове, когда кэша у документа еще нет, этот вызов попадёт к нему в свойство _jscripts, и будет вставлен на страницу при следующей загрузке.Но так как вызов скрипта из кэша не совпадает с тем, что будет в шаблоне во второй вызов (число-то случайное!), то при последующих загрузках мы получим 2 вызова этого скрипта с 2мя разными числами. Первое будет получаться из кэша, а второе — запускаться динамически из шаблона.
Можно представить массу ситуаций, когда такой кэш будет мешать разрабатывать динамические сайты.
Поэтому я добавил сохранение скриптов и стилей, подключаемых через Fenom, в отдельные временные массивы и удаление их из кэша ресурса. Таким образом всё, что подключается через {$_modx->regClientScript()} и другие подобные функции, в кэш больше не сохраняется.
Динамические вызовы скриптов, как в примере выше, работают без проблем.
При этом нужно помнить, что если вы регистрируете скрипты и стили через кэшированные сниппеты, и меняете их параметры напрямую в файлах шаблона, без очистки кэша в админки — никаких изменений вы не увидите по описанным выше причинам. Вы будете видеть старые скрипты и стили, зарегистрированные первый раз в момент генерации кэша.
Так что, во время разработки, MinifyX через Fenom лучше запускать некэшированным.
Новая версия уже доступна в репозитории modstore.pro — можно обновляться.
P.S. Кстати, если вы вдруг уже используете на сайте сниппеты rand или number (number_format) как модификаторы строк в Fenom — их заменят функции в новой версии. Так что обновите свои вызовы, если нужно.
Комментарии: 22
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Пока не авторизовался было вот так
joxi.ru/D2P6LEMIdM4K6r
Повторить пока не могу, но буду наблюдать, спасибо.
Fi1osofЛадно, потестирую еще, а новую версию пока уберу из репо.
Давно ждал разрешения проблемы с Minifyx на феноме…
pdotools_fenom_parser = 1
Пример подключения.
s3708
FhQIqQmo09Md
Твой код с подключением файлов в шаблоне, никуда не пропадает.
i.imgur.com/GHAYgtF.png — Первый вход на страницу
i.imgur.com/fXq6LiN.png — Повторный
PS
Определил зависимость, если в теле есть больше одного include — проблема повторяется(
если раскомментить inc_header, начинает у меня пропадать оО
Для эксперимента попробуй так
Думаю, в модификаторе проверку нужно доработать. Как минимум приводить к integer. Или самому делать проверку на 0.
П.С. Конечно, такой код не имеет смысла
Только если через переменную $_modx->user.id.
P. S.: $_modx->user.id — это и есть текущий пользователь, т.е. 0|ismember и $_modx->user.id|ismember — эквивалентные записи.
Они выводят следующее, если дата публикации, к примеру 00:13, то получим: «сегодня в 12:13»
Т.е. пользователя это может ввести в заблуждение по поводу даты публикации. Так задумывалось?
Не было бы вернее заменить %I на %k, чтобы вывело «сегодня в 0:13»?
Или я что-то упустил