Страница 1 из 1

Баг: потеря ключа item в $options у fieldtype_users_approve

Добавлено: 20 авг 2026, 23:29
Vershik
Переносил сайт на хостинг reg.ru, после чего возникает warning при изменении записи, а именно: при добавлении пользователей в поле "Пользователи: Утвердить".
С помощью ИИ искал причину. Warning убирается.

Прошу ознакомиться с итогом:

Проблема
При запуске процесса корректировки (action=run) в поле типа «Согласование пользователей» (fieldtype_users_approve) возникали предупреждения PHP:

- Undefined array key "item" в строках 421 и 557

- Trying to access array offset on null

- Сбой редиректа из-за вывода предупреждений в браузер

Причина: в методах output() и check_button_filter() идёт прямое обращение к $options['item']['id'] без проверки существования ключа item. При вызове через процессы этот ключ отсутствует.

Решение на уровне сервера (временное)
Создан файл .user.ini в корне сайта с настройками:

Код: Выделить всё

display_errors = Off
error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING
Это скрыло вывод предупреждений, но не устранило первопричину.

Рекомендуемое решение на уровне CRM (постоянное)
Внести точечные правки в файл
/includes/classes/fieldstypes/fieldtype_users_approve.php:

1. Метод output(), строка ~421 (блок else):
Было:

Код: Выделить всё

$approved_users = approved_items::get_approved_users_by_field($options['field']['entities_id'], $options['item']['id'], $options['field']['id']);
Стало:

Код: Выделить всё

$item_id = isset($options['item']['id']) ? $options['item']['id'] : 0;
$approved_users = approved_items::get_approved_users_by_field($options['field']['entities_id'], $item_id, $options['field']['id']);
2. Метод check_button_filter(), строка ~557:
Было:

Код: Выделить всё

$listing_sql_query = "e.id='" . $options['item']['id'] . "'";
Стало:

Код: Выделить всё

$listing_sql_query = "e.id='" . (isset($options['item']['id']) ? $options['item']['id'] : 0) . "'";
Дополнительно
Аналогичные проверки isset() следует добавить во все места ядра, где используется $options['item'] без проверки.
В идеале — передавать item в $options при вызове output() из модуля процессов, чтобы ключ всегда существовал.

Код: Выделить всё

Итог
Исправление в коде делает систему устойчивой к отсутствию ключа item и не зависит от настроек сервера. Мы уже применили эти изменения на своём экземпляре — ошибки больше не возникают даже при включённом display_errors.

Код: Выделить всё

Во вложении файл с исправленным кодом (при необходимости).

Re: Баг: потеря ключа item в $options у fieldtype_users_approve

Добавлено: 21 авг 2026, 19:34
support
Ясно. Поправил. В архиве файл который войдет в версию 3.7.4
Я немного по другому реализовал.