pdoTools3 для MODX3

Друзья!
Как вы все знаете (или почти все), @Mark Hamstra взял быка за рога и своим решением утвердил график выхода MODX3:
  • 3.0.0-alpha3 – 27 октября
  • 3.0.0-beta1 – 8 ноября
  • 3.0.0-beta2 – 22 ноября
  • 3.0.0-rc1 – 6 января 2022
  • 3.0.0-rc2 – 17 января
  • 3.0.0-pl – 31 января
Об этом недавно писал @Іван Клімчук. Пока всё идёт по графику и следующий релиз должен быть 6 января. Давайте поддержим Марка и поможем довести до логического завершения эту долгоиграющую историю. Это будет охренительный прорыв и даст новый толчок развитию MODX. Ведь многие из нас уже разочаровались увидеть при своей жизни MODX3.

Теперь по теме. Многие говорили, что для тестирования MODX3 им нужен адаптированный pdoTools, так как они ведут разработку исключительно с ним. Пару дней я назад выпустил новую версию этой библиотеки, предназначенную только для MODX3.

Список изменений получился такой
  • Requires MODX 3.
  • Requires PHP 7.2+.
  • Refactored to use PSR-4 autoload.
  • pdoTools snippet logs are stored now in the corresponding placeholder (#316).
  • Added system setting «pdotools_filter_path».
  • Removed anchor links in skip/empty templates (#303).
  • Removed «nestedChunkPrefix» parameter.
  • Removed the system settings «pdoTools.class», «pdotools_class_path», «pdoFetch.class» and «pdofetch_class_path».
  • Removed the «setOption» Fenom modifier.
  • Removed the snippet parameters «tplPath» and «elementsPath».
Итак, это версия исключительно для MODX3. А это значит, что она использует функционал MODX3. И в частности механизм контейнера зависимостей. И теперь получить, например, объект сервиса pdoTools можно так —
$modx->services->get('pdotools');
Также теперь для работы pdoTools требуется PHP версия не ниже 7.2. А классы имеют неймспейсы и загружаются по стандартам PSR-4. Базовое пространство имён — ModxPro\PdoTools.

Следующий важный момент — теперь все логи сниппетов будут писаться исключительно в плейсхолдер, а не в конец данных сниппета.
{'!pdoResources' | snippet : [
    ...,
    'showLog' => true,
]}
{'pdoResourcesLog' | placeholder}
Таким образом, не будет проблем в режиме, когда сниппет должен вернуть массив. Плюс плейсхолдер можно разместить в любом месте. Отсюда есть мысль про дебаг панель, чтобы можно было собирать эти данные в одном месте. Но это вопрос будущего.
Как нетрудно догадаться, название плейсхолдера образуется из название сниппета и суффикса Log.

В следующем пункте говорится о системной настройке «pdotools_filter_path». Она необходима для фильтрации путей файловых элементов, т.е. вырезает конструкцию "../". Эта конструкция дает большую гибкость при работе с файловыми элементами, но если что, позволяет админу держать под контролем свободу контент-менеджеров гулять по всему сайту.
Раз уж заговорили про файловые элементы, то хочу отметить, что теперь можно указывать любой путь в настройке «elements_path». Даже за пределами сайта (тут надо будет ещё помозговать). Раньше к файлу всегда добавлялся базовый путь сайта. Также можно указывать относительный путь к файловым элементам (относительно базового пути сайта) — "./elements/" => «путь/к/корню/сайта/elements».

Ещё поправлены ссылки в skip/empty шаблонах. Тег «a» заменён на «span». Это доработка Jako.

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

По пунктам с системными настройками — они удалены за ненадобностью. Так как теперь автозагрузкой управляет композер, то нет нужды указывать пути к классам.

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

Я старался максимально внимательно проверить базовую функциональность. Но понятно, что всё-всё проверить невозможно. Поэтому нужна ваша помощь в этом. Особенно желательно, чтобы при тестировании использовались максимально близкие фичи с рабочих проектов.

Пакет уже есть на modstore.pro. Пока MODX3 можно тестировать только на локалке, но @Илья Уткин обещал в ближайшее время сделать доступной такую возможность и на modhost.pro на тестовом тарифе.
Сергей Шлоков
09 декабря 2021, 10:54
modx.pro
1 812
+39
Поблагодарить автора Отправить деньги

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

Наумов Алексей
09 декабря 2021, 14:35
+2
Отличная работа!
Поставил для теста, вроде работает)))
    Наумов Алексей
    09 декабря 2021, 15:04
    +4
    Что-то не так…
    При очистке кеша вижу в консоли:
    Консоль запущена…
    PHP notice: Undefined property: MODX\Revolution\modX::$service
    и все…

    Ошибка в плагине pdoTools (id = 1):

    PHP notice: Undefined property: MODX\Revolution\modX::$service
    
    
    Fatal error:  Uncaught Error: Call to a member function get() on null in /var/www/modx3beta2/www/core/cache/includes/elements/modx/revolution/modplugin/1.include.cache.php:7
    Stack trace:
    #0 /var/www/modx3beta2/www/core/src/Revolution/modScript.php(88): include()
    #1 /var/www/modx3beta2/www/core/src/Revolution/modX.php(1706): MODX\Revolution\modScript->process()
    #2 /var/www/modx3beta2/www/core/src/Revolution/Processors/System/ClearCache.php(48): MODX\Revolution\modX->invokeEvent()
    #3 /var/www/modx3beta2/www/core/src/Revolution/Processors/Processor.php(189): MODX\Revolution\Processors\System\ClearCache->process()
    #4 /var/www/modx3beta2/www/core/src/Revolution/modX.php(1771): MODX\Revolution\Processors\Processor->run()
    #5 /var/www/modx3beta2/www/_easyComm/_build/build.transport.php(394): MODX\Revolution\modX->runProcessor()
    #6 {main}
      thrown in /var/www/modx3beta2/www/core/cache/includes/elements/modx/revolution/modplugin/1.include.cache.php on line 7
      Сергей Шлоков
      09 декабря 2021, 15:24
      +7
      Поправил. Спасибо!
      Банальная опечатка. Вместо $modx->services написал $modx->service.
      Павел Бигель
      09 декабря 2021, 16:13
      +5
      Предлагаю скинуться по рублю данному товарищу так как без его работы MODX 3 в принципе мог бы и не выходить
        Raimei
        09 декабря 2021, 16:17
        +3
        Хорошая идея. Скинул на кружку провинциального, но вкусного кофе.
        Сергей Шлоков
        10 декабря 2021, 07:28
        +5
        Спасибо за добрые слова! Но ради справедливости хочу сказать, что в нашем RU-сообществе контрибьютеров MODX есть люди, вклад которых не меньше (а то и больше) значителен. Ведь важно не только писать код. Важно всё. И умение организовать и мотивировать других. И поправить лексиконы или CSS класс. И даже просто подсказать правильный инструмент для работы.

        Немного пафосно прозвучало, да? %)
          Дима Сайт old см. профиль
          10 декабря 2021, 20:02
          +2
          Норм прозвучало. Молодцы все!

          Стыдно признаться, но не доходили руки тестить, потому что без pdoTools настоящий никакой проект не поднять, а голую установку MODX 3 тестить как-то грустно)

          И как раз выходные впереди… кажется, настало время!

          Спасибо за обновки
        Сергей Сергеевич
        11 декабря 2021, 11:20
        +1
        Сергей, спасибо за энтузиазм и развитие!
        Anton
        13 декабря 2021, 15:05
        +1
        Спасибо.
        Отправил.
        Wassi Wassinen
        13 декабря 2021, 20:04
        +4
        @Сергей Шлоков, прежде всего, хочется сказать, что вы и другие разработчики — молодцы.

        Небольшое пожелание.
        Если есть такая возможность — сделайте вариативным плейсхолдер для лога. На многих проектах на одной странице может быть, например, несколько pdoMenu. Как я понимаю, в таком варианте все логи сольются в единую портянку и это будет крайне не удобно. Добавьте возможность указать имя плейсхолдера, в который будем выгружать лог.

        Заранее благодарен.
          Сергей Шлоков
          14 декабря 2021, 19:34
          0
          Это сделать абсолютно не сложно. Добавлю в следующей версии. Просто интересно, зачем дебажить сразу 2 вызова одного и того же сниппета?
            Wassi Wassinen
            15 декабря 2021, 04:18
            0
            Сергей, спасибо за ответ.

            Самая главная беда — мы видим ошибки в общем логе MODx, но не знаем на какой странице сайта они вылезли. :) Поэтому, чаще всего, выявление ошибок происходит с помощью визуального осмотра сайта. Мы включаем дебаг и ползаем по страницам в поисках этой ошибки.

            Приведу один из примеров: есть сложная страница с несколькими «вкладками». Вкладки не разбиты на отдельные страницы, а свёрстаны как вкладки с помощью css-фреймворка. На каждую вкладку выводятся ресурсы с помощью pdoPage со своими отборами для каждой вкладки.
            Например, мы видим что страница «поехала» — что-то отображается не правильно.
            Как это работало в предыдущих версиях — мы видим дебаг под каждым сниппетом и понимаем, какой из них отрабатывает с ошибкой. Например, я добавил showLog=1 для всех сниппетов и на каждой вкладке (или под каждым местом, где должен быть вывод сниппета) вижу свой дебаг. Сразу понимаю, какой из сниппетов отработал неправильно.

            Когда мы можем вывести дебаг только в одном месте — сразу не понятно что и где «сломалось». Ошибка уже не привязана к вызову сниппета в вёрстке сайта и это не всегда удобно.

            Возможно, я ошибаюсь и все привыкли действовать по-другому. Можно добавить возможность указать плейсхолдер для вывода дебага, а если он не указан — выводить единым плейсхолдером. Если через пару версий выяснится, что этим никто не пользуется — значит я был не прав и эту возможность можно будет исключить.

            Еще раз спасибо, что откликнулись на предложение с позитивом.
          Константин Ильин
          16 декабря 2021, 16:32
          0
          С pdoMenu проблемы.
          В документации написано
          &tplOuter — Чанк оформления всего блока меню. По умолчанию: @INLINE <ul [[+classes]]>[[+wrapper]]
          При указании tplOuter работает неверно, он начинает использовать его для всех подменю.
          prnt.sc/239rcei

          Попробовал указать tplParentRow и у него указал ul, помогло.

          Решил сделать тест на модхосте, тоже самое
          s28405.h8.modhost.pro/

          Не могу утверждать данная проблема связана с последними изменениями, но она как видно есть либо в документации неверно написано.
          <ul class="test">
              {'!pdoMenu' | snippet : [
                  'parents' => 0,
                  'level' => 2,
                  'tplOuter' => '@INLINE {$wrapper}',
                  '-tplParentRow' => '@INLINE <li class="submenu_wrapp {$classnames}"><a href="{$link}" {$attributes}>{$menutitle}</a><ul>{$wrapper}<ul></li>'
              ]}
              <li>
                  <a href="#">Заказ звонка</a>
              </li>
          </ul>

          п.с. Раньше использовал такой «прием» и норм было.
            Сергей Шлоков
            16 декабря 2021, 21:29
            +2
            Спасибо за помощь в тестировании!
            Дело в том, что tplOuter также является и шаблоном для tplInner, если последний не указан. А по умолчанию он пустой. Поэтому так и получается.

            Вот тут можно подробнее почитать про параметры сниппета pdoMenu.

            Futuris
            18 декабря 2021, 09:40
            +2
            Спасибо за вашу работу! Сайты на трешке, которые без e-commerce, фактически заработали. Отправил на чашечку кофе))
              Сергей Шлоков
              18 декабря 2021, 12:43
              +1
              Спасибо, что тестируете!
                Иван Бочкарев
                19 декабря 2021, 22:18
                +1
                По факту если не нужен e-commerce не хватает только MIGX
                  Николай Савин
                  20 декабря 2021, 08:30
                  +2
                  ms3 будет в Январе. Ну и еще останется экосистему к нему подтягивать.
                  Futuris
                  23 января 2022, 18:27
                  +1
                  При тестировании блога на MODX 3 и pdoTools 3 сниппет pdoNeighbors выводит ссылки на все предыдущие и все последующие посты относительно текущего. Т.е. не так как должно быть. Пытались решить с помощью &limit=1 и &depth=1, никаких результатов.


                  При этом на MODX2 со старой версией pdoTools все работает и как положено, т.е. pdoNeighbors выводит ссылки на соседние ресурсы по одному: предыдущий пост слева, последующий пост справа. Можно с этим что-то сделать или просто лучше подождать стабильных версий MODX и pdoTools?
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  24