Баг: потеря ключа item в $options у fieldtype_users_approve
Добавлено: 20 авг 2026, 23:29
Переносил сайт на хостинг 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 в корне сайта с настройками:
Это скрыло вывод предупреждений, но не устранило первопричину.
Рекомендуемое решение на уровне CRM (постоянное)
Внести точечные правки в файл
/includes/classes/fieldstypes/fieldtype_users_approve.php:
1. Метод output(), строка ~421 (блок else):
Было:
Стало:
2. Метод check_button_filter(), строка ~557:
Было:
Стало:
Дополнительно
Аналогичные проверки isset() следует добавить во все места ядра, где используется $options['item'] без проверки.
В идеале — передавать item в $options при вызове output() из модуля процессов, чтобы ключ всегда существовал.
Исправление в коде делает систему устойчивой к отсутствию ключа item и не зависит от настроек сервера. Мы уже применили эти изменения на своём экземпляре — ошибки больше не возникают даже при включённом display_errors.
С помощью ИИ искал причину. 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']);
Было:
Код: Выделить всё
$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() из модуля процессов, чтобы ключ всегда существовал.
Код: Выделить всё
ИтогКод: Выделить всё
Во вложении файл с исправленным кодом (при необходимости).