pdoTools icon indicating copy to clipboard operation
pdoTools copied to clipboard

fix(Fetch.php): warning when preparing condition for log message

Open gitrequests opened this issue 4 months ago • 0 comments

Что оно делает?

Исправляет warning при подготовке сообщения для логирования

[2025-08-15 10:53:13] (ERROR @ /var/www/public/core/components/pdotools/src/Fetch.php : 229) PHP warning: Array to string conversion

Описание проблемы

Исходя из документации по xPDOQuery::where Этот запрос может быть комплексным и включать в себя многомерный массив. Из за этого функция implode принимает значения, которые не может обработать.

В качестве примера вот такой запрос WHERE отлично парсится и отрабатывает в MODX, но выдает WARNING в коде, который предназначен для подготовки WHERE запроса к логировалию (Смотрите пример предупреждения выше):

[
    [
        [
            "TVtags.value:LIKE" => "%hit%"
        ],
        [
            "OR:TVtags.value:LIKE" => "%promo%"
        ],
        [
            "OR:TVtags.value:LIKE" => "%sale%"
        ],
    ],
    [
        "TVprice.value:>=" => 104,
        "AND:TVprice.value:<=" => 140
    ],
    "modResource.parent:IN" => [5],
    "modResource.template:IN" => [3],
    "modResource.published" => 1,
    "modResource.deleted" => 0
]

Обратите внимание на различие TVprice и TVtags. Из за того, что TVtags могут иметь несколько значений, мы не можем иметь одну вложенность массива (иначе ключ "OR:TVtags.value:LIKE" будет повторяться, и значения будут переписаны, а не добавлены):

// Этот участок кода не работает из за повторяющегося ключа массива
 [
    [
        "TVtags.value:LIKE" => "%hit%",
        "OR:TVtags.value:LIKE" => "%promo%", //<-- Ключь массива установлен
        "OR:TVtags.value:LIKE" => "%sale%" //<-- Значение перепишет предыдущий ключь
    ]
]

Поэтому мы можем передать многомерный массив в xPDOQuery.

Парсер xPDOQuery обрабатывает такие массивы рекурсивно, с любым уровнем вложенности.


Предлагаю заменить логирование WHERE (и заодно и HAVING чуть ниже) на json_encode - это выведет в сообщения логов более четкую информацию о том, что именно попало в WHERE и так же снизит количество warning (и error в будущих версиях PHP).

gitrequests avatar Aug 15 '25 08:08 gitrequests