Ошибка в статусе заказа для цифрового товара в php 8.0

Где возникла проблема: Multi-Vendor 4.18.3.

я перешла на версию php 8.0 и возникла ошибка со статусами заказа после оплаты цифрового товара.

в чем проблема: $v[‘amount’] (количество товара) — где-то стал строкой (например, '1' вместо 1 ), а PHP 8+ не позволяет умножать строку на int без приведения типов.

получается надо функцию как-то поменять в ядре?

foreach ($order_info[‘products’] as $v) {
if (isset($v[‘amount’])) {
$v[‘amount’] = (int)$v[‘amount’];
}

}
из-за этого даже админ не может менять статусы заказов, статус всегда стоит как “неподтвержденный” даже если платежная система написала, что заказ подтвержден и на другой не меняется.

Пока вернулась обратно на 7.4, там всё работает. Подскажите в чём именно проблема?

1 лайк

Здравствуйте, @rumir! Спасибо за ожидание.
Мне не удалось воспроизвести описанную проблему, статус заказа с цифровым товаром меняется без ошибок.
Пожалуйста, уточните шаги для воспроизведения проблемы и пришлите текст PHP ошибки для лучшего понимания.

Здравствуйте.

Когда пытаешься менять статус товара на выполнен, оплачен или любой другой в логах вот это написано:

[php:notice] TypeError: Unsupported operand types: string * int in /var/www/www-root/data/var/www/www-root/data/www/сайт/app/functions/fn.cart.php:3095\nStack trace:\n#0 /var/www/www-root/data/var/www/www-root/data/www/сайт/app/functions/fn.cart.php(2935): fn_generate_ekeys_for_edp(Array, Array)\n#1 /var/www/www-root/data/var/www/www-root/data/www/сайт/app/controllers/backend/orders.php(119): fn_change_order_status(‘10000216’, ‘C’, ‘N’, Array)\n#2 /var/www/www-root/data/var/www/www-root/data/www/сайт/app/functions/fn.control.php(728): include(‘/var/www/www-ro…’)\n#3 /var/www/www-root/data/var/www/www-root/data/www/сайт/app/functions/fn.control.php(459): fn_run_controller(‘/var/www/www-ro…’, ‘orders’, ‘update_status’, ‘’, ‘’)\n#4 /var/www/www-root/data/var/www/www-root/data/www/сайт/admin.php(27): fn_dispatch()\n#5 {main}, referer: https://сайт/admin.php?dispatch=orders.manage

Если перейти на версию php 7.4, то такой ошибки не возникает и статусы заказов меняются как обычно. Это касается абсолютно всех заказов в админке.

я нашла проблему. у меня в поле “Период доступности ключа для скачивания цифровых товаров в часах:” не стояло ничего. Думала, что если не стоит, то может будет бесконечно. Поэтому php 8.0 ругался.

Строчка в файле app/functions/fn.cart.php выглядит вот так:

‘ttl’ => (TIME + (Registry::get(‘settings.General.edp_key_ttl’) * 60 * 60)),

может её переписать по типу:

'ttl' => (TIME + ((int) Registry::get('settings.General.edp_key_ttl') * 3600)),

чтобы строчка принудительно в число менялась?

Но, это как предложение.

Эта тема была автоматически закрыта через 3 дня после последнего ответа. В ней больше нельзя отвечать.

@rumir, спасибо за предоставленные детали, рада, что вы нашли причину ошибки.
Я воспроизвела проблему и сообщила о ней нашим разработчикам.
Для настройки бессрочного доступа к скачиваемым файлам я рекомендую вам использовать опцию Не ограниченная по времени загрузка, которая находится на странице редактирования товара на вкладке Общее.

Эта опция и так включена у нас в каждом цифровом товаре. Но она не спасала от указанной выше ошибки.

Пока вот не стояло время в админке, возникала ошибка, даже если в товаре стоит “не ограниченная по времени загрузка”. Вот как-то так.