[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
На этом сайте Fenom работает только в чанках, для страниц он отключен — так что вряд ли это связано с обновлением.
Повторить пока не могу, но буду наблюдать, спасибо.
Повторить пока не могу, но буду наблюдать, спасибо.
Проблема действительно есть. Еще утром заметил (до моих каких-то экспериментов), но не стал писать, думал ты итак заметишь. В анонимной сессии: joxi.ru/823OeZKC6ow5V2
Ага, вижу. Явно что-то с кэшированием скриптов.
Ладно, потестирую еще, а новую версию пока уберу из репо.
Ладно, потестирую еще, а новую версию пока уберу из репо.
Поправил, спасибо.
Здорово, спасибо!
Давно ждал разрешения проблемы с Minifyx на феноме…
Давно ждал разрешения проблемы с Minifyx на феноме…
после обновления скрипты которые подключаются через fenom в теле страницы имеются только при первой загрузке, при повторной скриптов нет. Все шаблоны поломались(
pdotools_fenom_parser = 1
pdotools_fenom_parser = 1
<!DOCTYPE html>
<html lang="ru">
<head>
<title>[[*pagetitle]] - [[++site_name]]</title>
<base href="{$_modx->config.site_url}" />
<meta charset="{$_modx->config.modx_charset}" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
{include 'inc_meta'}
{$_modx->regClientScript($_modx->config.template_url ~ "js/item.min.js")}
{$_modx->regClientCSS($_modx->config.template_url ~ "components/minishop2/css/web/lib/fotorama.min.css")}
{$_modx->regClientScript($_modx->config.template_url ~ "components/minishop2/js/web/lib/fotorama.min.js")}
</head>
Пример подключения.
Ага, вижу проблему. Отключи пока у плагина событие перед сохранением кэша — чуть позже выпущу обновление.
Выложил новую версию, проверяй.
проверил, обновил, очистил кеш — всё равно такая же тема( какие данные предоставить?
s7308.h7.modhost.pro/
s3708
FhQIqQmo09Md
Твой код с подключением файлов в шаблоне, никуда не пропадает.
s3708
FhQIqQmo09Md
Твой код с подключением файлов в шаблоне, никуда не пропадает.
Тогда в чем может быть проблема?
i.imgur.com/GHAYgtF.png — Первый вход на страницу
i.imgur.com/fXq6LiN.png — Повторный
PS
Определил зависимость, если в теле есть больше одного include — проблема повторяется(
i.imgur.com/GHAYgtF.png — Первый вход на страницу
i.imgur.com/fXq6LiN.png — Повторный
PS
Определил зависимость, если в теле есть больше одного include — проблема повторяется(
<!DOCTYPE html>
<html lang="ru">
<head>
<title>[[*pagetitle]] - [[++site_name]]</title>
<base href="{$_modx->config.site_url}" />
<meta charset="{$_modx->config.modx_charset}" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
{include 'inc_meta'}
{$_modx->regClientScript($_modx->config.template_url ~ "js/item.min.js")}
{$_modx->regClientCSS($_modx->config.template_url ~ "components/minishop2/css/web/lib/fotorama.min.css")}
{$_modx->regClientScript($_modx->config.template_url ~ "components/minishop2/js/web/lib/fotorama.min.js")}
</head>
<body>
<div class="global-wrapper">
{*include 'inc_header'*}
<div class="container">
{*include 'com_breadcrumbs' catalog=true*}
</div>
{*$_modx->runSnippet('!msOptionsPrice.initialize')*}
</div>
{*include 'inc_modals'*}
{*include 'inc_footer'*}
</body>
</html>
если раскомментить inc_header, начинает у меня пропадать оО
А можно глупый вопрос? Почему
{if '0'|ismember:'Administrator'}1{/if}
возвращает 1? 0 — это же все неавторизованные, они никак не могут быть админами…
может корректнее использовать
{$_modx->hasSessionContext('web')}
?
Тогда уж mgr (и это, кстати, не дает понять кто в какой группе, а лишь говорит кто где залогинен), но вопрос про то, что с какой-то версии, скорее всего с 2.5.2
{0|ismember:'Administrator'}
сам по себе возвращает true для всех гостей…
Не глядя могу предположить, что ты залогинен в админке. Возможно модификатор проверяет текущего пользователя на связь с группой «Administrator».
Для эксперимента попробуй так
Для эксперимента попробуй так
{'Дональд Трамп'|ismember:'Administrator'}
Слазил в код. Там проверка на empty. А так как 0 — это empty, то подгружается текущий пользователь.
Думаю, в модификаторе проверку нужно доработать. Как минимум приводить к integer. Или самому делать проверку на 0.
П.С. Конечно, такой код не имеет смысла
Думаю, в модификаторе проверку нужно доработать. Как минимум приводить к integer. Или самому делать проверку на 0.
П.С. Конечно, такой код не имеет смысла
{0|ismember:'Administrator'}
Только если через переменную $_modx->user.id.
Я тоже слазил в код и пишу как раз о том, что для залогиненых всё ок, админы — админы, неадмины — нет, а вот на гостей такая проверка стала возвращать true… И, поскольку в pdoTools функция не менялась, то изменилось поведение самого xPDO и он начал возвращать 1. По кр. мере у меня так на нескольких сайтах на разных площадках.
P. S.: $_modx->user.id — это и есть текущий пользователь, т.е. 0|ismember и $_modx->user.id|ismember — эквивалентные записи.
P. S.: $_modx->user.id — это и есть текущий пользователь, т.е. 0|ismember и $_modx->user.id|ismember — эквивалентные записи.
P. P. S.: Пока проверяю по
{if $_modx->user.id && 0|ismember:'Administrator'}...{/if}
Но хотелось бы корректную проверку на принадлежность к группе для всех, в т.ч. и для гостей.
На всякий случай проверил на чистом тестовом — то же самое. Заходишь от гостя — получаешь единицы.
В стандартном модификаторе fuzzydate есть строки
Т.е. пользователя это может ввести в заблуждение по поводу даты публикации. Так задумывалось?
Не было бы вернее заменить %I на %k, чтобы вывело «сегодня в 0:13»?
Или я что-то упустил
if ($time >= strtotime('today')) {
$output = $modx->lexicon('today_at', array('time' => strftime('%I:%M %p', $time)));
} elseif ($time >= strtotime('yesterday')) {
$output = $modx->lexicon('yesterday_at', array('time' => strftime('%I:%M %p', $time)));
} else {
$output = strftime($format, $time);
}
Они выводят следующее, если дата публикации, к примеру 00:13, то получим: «сегодня в 12:13»Т.е. пользователя это может ввести в заблуждение по поводу даты публикации. Так задумывалось?
Не было бы вернее заменить %I на %k, чтобы вывело «сегодня в 0:13»?
Или я что-то упустил
Только начинаю въезжать в Fenom! Как правильней прописать несколько parents к pdoPage ???
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.