• Блог
  • modHelpers 4.0.0. Что нового?

В новой версии библиотеки были обновлены зависимости, добавлено несколько функций и одна удалена. Указанные изменения повлекли нарушение обратной совместимости. Поэтому перед обновлением внимательно ознакомьтесь с изменениями.

Список изменений

  • Добавлена новая функция build_tree, формирующая древовидную структуру данных.
  • Добавлена новая функция reading_time для подсчёта времени чтения текста.
  • Добавлена новая функция sanitize_path, исключающая возможность манипулирования путями.
  • Добавлена новая функция value. Аналог одноимённому хелперу из Laravel, но позволяет указать дефолтное значение для null.
  • Удалена функция faker и соответствующая библиотека Faker.
  • Функция dumpтеперь может принимать несколько аргументов.
  • В функции login и logoutдобавлен параметр «ctx», позволяющий указать контекст.
  • Исправлен баг с добавлением вложений в классе Mailer (#2).

Давайте быстренько пробежимся по пунктам.

Функция build_tree()

Эта функция создаёт древовидную структуру из плоского массива данных.

Для наглядности используем простой пример вывода меню из корневых ресурсов. Для этого сначала создадим сниппет.

// BuildMenu
<?php
$query = $modx->newQuery('modResource', [
    'parent' => 0, 
    'deleted' => 0, 
    'hidemenu' => 0
];
if ($query->prepare() && $query->stmt->execute()) {
    $resources = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
}
return build_tree($resources);

На следующем шаге создадим HTML шаблон для меню, используя синтаксис Smarty из пакета ZoomX.

// MenuItem.html
{if isset($item['children'])}
<li>
  <a href="{$item['uri']}">{$item['pagetitle']}</a>
  <ul>
    {foreach $item['children'] as $child}
      {include 'MenuItem.html' item=$child}
    {/foreach}
  </ul>
</li>
{else}
<li>
  <a href="{$item['uri']}">{$item['pagetitle']}</a>
</li>
{/if}

Ну и осталось добавить их в шаблон страницы.

<head>
...
</head>
<body>
  <nav class="navbar">
    <ul class="main-menu">
      {$items = $modx->runSnippet('BuildMenu')}
      {foreach $items as $item}
        {include 'MenuItem.html' item=$item}
      {/foreach}
    </ul>
  </nav>
...
</body>

Функция reading_time()

Сейчас достаточно часто в интернете можно встретить ресурсы, в которых указывается время чтения статьи. Данная функция помогает вычислять это время. Использовать можно прямо на странице при условии, что вы используете PHP шаблонизатор.

<p>Время чтения: {reading_time('content'|resource)}</p>

Функция sanitize_path()

Предназначена для фильтрации указанного пути. Удаляет символы ../ из пути, а также возможные манипуляции в виде....//.

// Путь отфильтрован не полностью
str_replace('../', '', 'path/to/....//file.php'); // "path/to/../file.php"
// Полная фильтрация
sanitize_path('path/to/....//file.php'); // "path/to/file.php"

Функция value()

Одноимённая функция из Laravel. Функция может принимать как простые значения, так и замыкания. Если передать значение, то оно и вернётся. В случае замыкания вернётся результат. Но есть небольшое отличие от Laravel реализации — вторым параметром можно передать значение по-умолчанию, которое будет возвращено первый параметр имеет значение null.

$foo = null;
value($foo, 'Default value');  // "Default value"

Заключение

С остальным всё более менее понятно. Касательно удалённой библиотеки Faker, тут моя позиция следующая — она нужна в основном только на этапе разработки и её присутствие на продакшене совсем не требуется. Поэтому лучше вынести её в отдельный пакет. Кроме того, автор перестал её поддерживать и она находится в статусе архива. На просьбы сообщества передать репозиторий активным пользователям он отказался. Говорят из-за звёздочек. Поэтому для PHP8 нужно искать форки.

В планах дописать функционал для работы с регистром (очередями) и сообщениями. И добавить её как зависимость для ZoomX при разработке аналога pdoTools. Ну и в ближайшее время я поправлю документацию.

0   1906

Комментарии ()

  1. shock 03 мая 2021 # +1
    Спасибо, особенно за build_tree(). Постепенно приближаемся к альтернативе pdoTools, что радует новыми возможностями и подходами.
    1. Сергей Шлоков 03 мая 2021 # +1
      Мерси:E Как только школы у детей закончатся приступлю плотнее.
    2. Wooster 14 марта 2023 # 0
      Здравствуйте!
      modHelpers 4.0.0 — очень полезный компонент для modx. Активно его использую на всех своих сайтах.
      Но сегодня выяснил, что часть функционала modHelpers не работает на php 8 и выше.
      В частности «Менеджер HTTP запросов»
      Очень важный для меня request()->checkCsrfToken() не работает. (ошибка 500 на сайте)
      Если у автора будет время выпустить версию с поддержкой php 8 буду очень благодарен.
      Или кто ни будь подскажет как исправить ситуацию самостоятельно?
      1. Сергей Шлоков 16 марта 2023 # 0
        Добрый день!
        В логах что пишет?
        1. ivan 16 августа 2023 # 0
          Вот какая ошибка при использовании php 8+:
          Fatal error: Uncaught TypeError: str_contains(): Argument #2 ($needle) must be of type string, array given in /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Request.php:220 Stack trace: #0 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Request.php(220): str_contains() #1 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Request.php(486): modHelpers\Request->isJson() #2 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Request.php(67): modHelpers\Request->getInputSource() #3 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Request.php(43): modHelpers\Request::createFromBase() #4 /home/my_site/web/dev.my_site.com/public_html/core/cache/includes/elements/modplugin/5.include.cache.php(14): modHelpers\Request::capture() #5 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Container.php(170): modScript->{closure}() #6 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Container.php(133): modHelpers\Container->build() #7 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Container.php(104): modHelpers\Container->resolve() #8 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/functions/functions.php(1279): modHelpers\Container->make() #9 /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/functions/functions.php(1918): app() #10 /home/my_site/web/dev.my_site.com/public_html/core/cache/includes/elements/modsnippet/27.include.cache.php(11): request() #11 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modscript.class.php(76): include('...') #12 /home/my_site/web/dev.my_site.com/public_html/core/components/ajaxform/model/ajaxform/ajaxform.class.php(130): modScript->process() #13 /home/my_site/web/dev.my_site.com/public_html/core/cache/includes/elements/modsnippet/11.include.cache.php(66): AjaxForm->process() #14 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modscript.class.php(76): include('...') #15 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modparser.class.php(537): modScript->process() #16 /home/my_site/web/dev.my_site.com/public_html/core/components/pdotools/model/pdotools/pdoparser.class.php(273): modParser->processTag() #17 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modparser.class.php(251): pdoParser->processTag() #18 /home/my_site/web/dev.my_site.com/public_html/core/components/pdotools/model/pdotools/pdoparser.class.php(64): modParser->processElementTags() #19 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modresource.class.php(546): pdoParser->processElementTags() #20 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modresource.class.php(498): modResource->parseContent() #21 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modresponse.class.php(62): modResource->prepare() #22 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modrequest.class.php(138): modResponse->outputContent() #23 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modrequest.class.php(122): modRequest->prepareResponse() #24 /home/my_site/web/dev.my_site.com/public_html/core/model/modx/modx.class.php(1461): modRequest->handleRequest() #25 /home/my_site/web/dev.my_site.com/public_html/index.php(54): modX->handleRequest() #26 {main} thrown in /home/my_site/web/dev.my_site.com/public_html/core/components/modhelpers/classes/Request.php on line 220

          Как исправить? я не пойму к сожалению. Очень бы хотелось, чтобы работал на php 8, новые проекты хочется запускать на свежих версиях php ))

          «wooster» — это мой аккаунт, я от него пароль забыл)
      2. ivan 16 августа 2023 # 0
        del

        Вы должны авторизоваться, чтобы оставлять комментарии.

        Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.