[pdoTools] 2.7.0 - улучшения 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 — их заменят функции в новой версии. Так что обновите свои вызовы, если нужно.
Василий Наумкин
05 ноября 2016, 08:42
modx.pro
4
3 325
+10
Поблагодарить автора Отправить деньги

Комментарии: 22

Володя
05 ноября 2016, 15:03
0
Привет.
Пока не авторизовался было вот так
joxi.ru/D2P6LEMIdM4K6r
    Василий Наумкин
    05 ноября 2016, 16:16
    0
    На этом сайте Fenom работает только в чанках, для страниц он отключен — так что вряд ли это связано с обновлением.

    Повторить пока не могу, но буду наблюдать, спасибо.
      Fi1osof
      05 ноября 2016, 16:18
      +2
      Проблема действительно есть. Еще утром заметил (до моих каких-то экспериментов), но не стал писать, думал ты итак заметишь. В анонимной сессии: joxi.ru/823OeZKC6ow5V2
        Василий Наумкин
        05 ноября 2016, 16:22
        +1
        Ага, вижу. Явно что-то с кэшированием скриптов.

        Ладно, потестирую еще, а новую версию пока уберу из репо.
      Василий Наумкин
      05 ноября 2016, 17:12
      +2
      Поправил, спасибо.
      Василий Столейков
      06 ноября 2016, 22:09
      1
      0
      Здорово, спасибо!
      Давно ждал разрешения проблемы с Minifyx на феноме…
        lexikon
        09 ноября 2016, 14:00
        +1
        после обновления скрипты которые подключаются через fenom в теле страницы имеются только при первой загрузке, при повторной скриптов нет. Все шаблоны поломались(
        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>
        Пример подключения.
          Василий Наумкин
          09 ноября 2016, 14:38
          +2
          Ага, вижу проблему. Отключи пока у плагина событие перед сохранением кэша — чуть позже выпущу обновление.
            Василий Наумкин
            10 ноября 2016, 10:10
            0
            Выложил новую версию, проверяй.
              lexikon
              10 ноября 2016, 10:18
              0
              проверил, обновил, очистил кеш — всё равно такая же тема( какие данные предоставить?
                Василий Наумкин
                10 ноября 2016, 10:22
                0
                s7308.h7.modhost.pro/
                s3708
                FhQIqQmo09Md

                Твой код с подключением файлов в шаблоне, никуда не пропадает.
                  lexikon
                  10 ноября 2016, 10:38
                  0
                  Тогда в чем может быть проблема?
                  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, начинает у меня пропадать оО
            Droug
            15 ноября 2016, 18:26
            0
            А можно глупый вопрос? Почему
            {if '0'|ismember:'Administrator'}1{/if}
            возвращает 1? 0 — это же все неавторизованные, они никак не могут быть админами…
              lexikon
              19 ноября 2016, 17:39
              -1
              может корректнее использовать
              {$_modx->hasSessionContext('web')}
              ?
                Droug
                19 ноября 2016, 22:05
                0
                Тогда уж mgr (и это, кстати, не дает понять кто в какой группе, а лишь говорит кто где залогинен), но вопрос про то, что с какой-то версии, скорее всего с 2.5.2
                {0|ismember:'Administrator'}
                сам по себе возвращает true для всех гостей…
                  Сергей Шлоков
                  19 ноября 2016, 23:11
                  0
                  Не глядя могу предположить, что ты залогинен в админке. Возможно модификатор проверяет текущего пользователя на связь с группой «Administrator».
                  Для эксперимента попробуй так
                  {'Дональд Трамп'|ismember:'Administrator'}
                    Сергей Шлоков
                    19 ноября 2016, 23:19
                    0
                    Слазил в код. Там проверка на empty. А так как 0 — это empty, то подгружается текущий пользователь.
                    Думаю, в модификаторе проверку нужно доработать. Как минимум приводить к integer. Или самому делать проверку на 0.

                    П.С. Конечно, такой код не имеет смысла
                    {0|ismember:'Administrator'}
                    Только если через переменную $_modx->user.id.
                      Droug
                      20 ноября 2016, 00:18
                      0
                      Я тоже слазил в код и пишу как раз о том, что для залогиненых всё ок, админы — админы, неадмины — нет, а вот на гостей такая проверка стала возвращать true… И, поскольку в pdoTools функция не менялась, то изменилось поведение самого xPDO и он начал возвращать 1. По кр. мере у меня так на нескольких сайтах на разных площадках.

                      P. S.: $_modx->user.id — это и есть текущий пользователь, т.е. 0|ismember и $_modx->user.id|ismember — эквивалентные записи.
                        Droug
                        20 ноября 2016, 00:30
                        0
                        P. P. S.: Пока проверяю по
                        {if $_modx->user.id && 0|ismember:'Administrator'}...{/if}
                        Но хотелось бы корректную проверку на принадлежность к группе для всех, в т.ч. и для гостей.
                          Droug
                          23 ноября 2016, 11:45
                          0
                          На всякий случай проверил на чистом тестовом — то же самое. Заходишь от гостя — получаешь единицы.
                  Григорий Коленько
                  15 ноября 2016, 18:30
                  0
                  В стандартном модификаторе fuzzydate есть строки

                  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»?
                  Или я что-то упустил
                    Владимир
                    24 февраля 2017, 20:01
                    +1
                    Только начинаю въезжать в Fenom! Как правильней прописать несколько parents к pdoPage ???
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      22