Бонусные баллы

Приличное кол-во версий баг уже идет
foreach ($c_ids as $category_id) {
$__reward_points = fn_get_reward_points($category_id, $object_type, $auth[‘usergroup_ids’]);
if (!empty($__reward_points)) {
// get the “override point” setting
$_category_is_op = db_get_field(“SELECT is_op FROM ?:categories WHERE category_id = ?i”, $__reward_points[‘object_id’]);
if ($_category_is_op == ‘Y’) {
$category_is_op = $_category_is_op;
$_reward_points = $__reward_points;
break;
}
}
}

функция fn_get_reward_points может возвращать как строку так и массив, в итоге когда возвращает массив идет ошибка

Message
Undefined index: object_id

Error at
app/addons/reward_points/func.php, line: 727

Здравствуйте @z3r0
Спасибо за ваше обращение.
Уточните, пожалуйста, в какой версии вы сталкиваетесь с проблемой и предоставьте шаги для её воспроизведения.

Да во многих, достаточно открыть последнюю версию cs-cart там эта ошибка присутствует.
И суде по функции проблема когда $usergroup_ids не задан.
Когда встречу у клиентов, у кого не исправил эту часть кода напишу в каком месте формируется ошибка.

Что касается работы функции fn_get_reward_points - она всегда возвращает массив. В этой функции есть 3 return :

  1. return array(); возвращает пустой массив.
  2. return db_get_row( функция db_get_row всегда возвращает массив.
  3. return db_get_hash_array( функция db_get_hash_array всегда возвращает массив.

Упомянутая ошибка Undefined index: object_id говорит о том, что элемента object_id в этом массиве нет. Но такая ситуация не может произойти в чистой установке, для неё нет предпосылок, поскольку, если нужной записи не найдётся в БД при выборке, будет возвращён пустой массив и проверку в коде такой результат не пройдёт: if (!empty($__reward_points)) {
А если найдётся, то не может быть такой ситуации чтобы у этой записи не было object_id, это означает только то, что в БД уже лежат какие-то битые данные.

В любом случае, данный вопрос требует более детального рассмотрения. Если снова столкнётесь с данной проблемой, рекомендую обратиться в Help Desk для её исследования.

Простите поправлюсь, массив с 1 записью и многомерный массив, где нужен foreach чтобы перебрать все варианты из db_get_hash_array так как при db_get_hash_array object_id находится на уровень глубже и не доступен.
То есть многомерный массив проходит проверку на наличие, все хорошо, но object_id нет так как нужен foreach
И тут в зависимости от использования fn_get_reward_points нужно либо править функцию и выдавать db_get_array либо часть кода написанную выше.

Прошло 3 месяца!

Еще раз

$__reward_points = fn_get_reward_points($category_id, $object_type, $auth[‘usergroup_ids’]);

Из func.php

Функция может вернуть как многомерный массив, так и одномерный массив
if (!empty($usergroup_ids)) {
if (Registry::get(‘addons.reward_points.several_points_action’) == ‘minimal_absolute’) {
$order_by = ‘amount_type ASC, amount ASC’;
} elseif (Registry::get(‘addons.reward_points.several_points_action’) == ‘minimal_percentage’) {
$order_by = ‘amount_type DESC, amount ASC’;
} elseif (Registry::get(‘addons.reward_points.several_points_action’) == ‘maximal_absolute’) {
$order_by = ‘amount_type ASC, amount DESC’;
} elseif (Registry::get(‘addons.reward_points.several_points_action’) == ‘maximal_percentage’) {
$order_by = ‘amount_type DESC, amount DESC’;
}

    return db_get_row(
        "SELECT *, amount AS pure_amount FROM ?:reward_points"
        . " WHERE object_id = ?i AND object_type = ?s AND company_id = ?i"
            . " AND amount >$op_suffix 0 AND usergroup_id IN(?n)"
        . " ORDER BY ?p LIMIT 1",
        $object_id, $object_type, $company_id, $usergroup_ids, $order_by
    );
} else {
    return db_get_hash_array(
        "SELECT *, amount AS pure_amount FROM ?:reward_points"
        . " WHERE object_id = ?i AND object_type = ?s AND company_id = ?i AND amount >$op_suffix 0"
        . " ORDER BY usergroup_id",
        'usergroup_id', $object_id, $object_type, $company_id
    );
}

Вы все еще не пофиксили этот баг

В целом не понятно, зачем он это запускает при консольном обновлении ядра, тем более вот пример категории которая вызывает ошибку

Спасибо за предоставленные детали.

Действительно, судя по коду, описанная ситуация в самом деле может возникнуть, однако, я не смог подобрать рабочего сценария для её воспроизведения.

Я передал информацию о проблеме разработчикам, но всё же, если вы сможете описать сценарий её воспроизведения, это будет большим плюсом.

Спасибо.

Просто есть категория у которой вот такие настройки, при обновлении консольно она возникает, так же при переходе в режиме покупателя из админки, возможно это случается когда у админа самого в корзине товары из этой категории есть. Но тут без тестов ясна проблема, что нужен просто одинаковый ответ по глубине.

Здравствуйте! Сервис паки выходит, а проблема остается.

Здравствуйте, @z3r0!

Проблема исправлена, исправление войдет в следующий релиз CS-Cart и Multi-Vendor.
Для исправления проблемы собственными силами можно использовать патч:

О том, как применить патч, можно прочитать в нашей документации: https://www.cs-cart.ru/docs/latest/upgrade/apply_diff_file.html

Все отлично работает!