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

Любые критические ошибки будут исправлены в течение 24-48 часов.
Ответить
Vershik
Спонсор
Спонсор
Сообщения: 86
Зарегистрирован: 23 апр 2021, 00:47
Имя: Алексей
Откуда: Севастополь

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

Сообщение 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.

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

Во вложении файл с исправленным кодом (при необходимости).
Вложения
fieldtype_users_approve.php
(29.32 КБ) 44 скачивания
Аватара пользователя
support
Техническая поддержка
Сообщения: 7661
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

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

Сообщение support »

Ясно. Поправил. В архиве файл который войдет в версию 3.7.4
Я немного по другому реализовал.
Вложения
fieldtype_users_approve.zip
(5.91 КБ) 45 скачиваний
Ответить