• Блог
  • 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   407

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

  1. shock 03 мая 2021, 19:39 # +1
    Спасибо, особенно за build_tree(). Постепенно приближаемся к альтернативе pdoTools, что радует новыми возможностями и подходами.
    1. Сергей Шлоков 03 мая 2021, 20:17 # +1
      Мерси:E Как только школы у детей закончатся приступлю плотнее.

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

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