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. Ну и в ближайшее время я поправлю документацию.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
modHelpers 4.0.0 — очень полезный компонент для modx. Активно его использую на всех своих сайтах.
Но сегодня выяснил, что часть функционала modHelpers не работает на php 8 и выше.
В частности «Менеджер HTTP запросов»
Очень важный для меня request()->checkCsrfToken() не работает. (ошибка 500 на сайте)
Если у автора будет время выпустить версию с поддержкой 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» — это мой аккаунт, я от него пароль забыл)