Как обновить значение пользовательского атрибута (перечисление строк) в SFCC с помощью кода?

Требование: я хочу обновить значение пользовательского атрибута (имя: значки) (тип: перечисление строк) для продукта с помощью кода. Я хочу установить значение bestSeller как выбранное. Как мне сделать это обновление, потому что приведенный ниже код не работает?

Скриншот пользовательского атрибута в Business Manager

Фрагмент кода:

function updateBestSeller() {
var ProductMgr = require('dw/catalog/ProductMgr');
var Site = require('dw/system/Site');
var UUIDUtils = require('dw/util/UUIDUtils');
var CustomObjectMgr = require('dw/object/CustomObjectMgr');
var currentSite = Site.getCurrent();
var bestSellerOrderUnits = Object.hasOwnProperty.call(currentSite.preferences.custom, 'bestSellerOrderUnits') ? currentSite.getCustomPreferenceValue('bestSellerOrderUnits') : 0;
try {
        Transaction.wrap(function () {
            var count = 1;
            var products = ProductMgr.queryAllSiteProducts();sni
            var HashSet = require('dw/util/HashSet');
             var badges = new HashSet();
            if (products.count > 0) {
                while (products.hasNext() && count < 5) {
                    var product = products.next();
                        var badges = [];
                        badges.push('bestSeller');
                        if (Object.hasOwnProperty.call(product.custom, 'badges')) {
                            product.custom.badges = badges
                        }
                        count++;
                        Logger.debug('{0}',product.ID);
                }
            }
            products.close();
        });
} catch (ex) {
    Logger.error(ex.toString());
    return new Status(Status.ERROR, 'ERROR', 'UPDATE failed');
}
return new Status(Status.OK, 'OK', 'UPDATE successful');

}


person BalMukund    schedule 04.08.2020    source источник


Ответы (1)


Я думаю, что, вероятно, здесь происходит то, что ваша попытка проверить, что продукт имеет ключ badges в наборе атрибутов product.custom, терпит неудачу. Это предотвращает обновление.

Я предлагаю удалить условие вокруг следующей строки: product.custom.badges = badges;

Если бы эта строка не выполнялась, обновление базы данных никогда не произошло бы.

Работа пользовательских атрибутов заключается в том, что они никогда не будут существовать, пока для этого атрибута не будет установлено значение для данного постоянного объекта. (например: Продукт). Таким образом, проверка его существования с помощью чего-то вроде: 'badges' in product.custom (что является рекомендуемым способом) часто будет false, даже если существует определение пользовательского атрибута, потому что для многих продуктов никогда не было установлено значение значка. Как только для объекта установлено значение определенного пользовательского атрибута, даже если сейчас установлено значение null, он будет существовать.

Кроме того, есть некоторые другие проблемы с кодом, которые могут вызывать проблемы. Одним из примеров является определение переменной badges дважды в одной и той же области. Другой пример — sni, который помещается в конце строки, где вы определяете переменную products. Вероятно, это вызывает ошибку в вашем коде. Наконец, рекомендуется по возможности избегать использования метода queryAllSiteProducts. Альтернативой может быть использование ProductSearchModel вместо этого; Это может не всегда соответствовать вашим потребностям, но рекомендуется исключить его, прежде чем прибегать к queryAllSiteProducts из соображений производительности.

Еще кое-что, что следует учитывать, это то, что если badges в настоящее время имеет какие-либо выбранные значения, вы будете перезаписывать эти значения кодом, который у вас есть сегодня. Сначала установите для badges значение [], а затем проверьте, есть ли значение для этого продукта, выполнив следующие действия:

if ('badges' in product.custom && !empty(product.custom.badges) {
  badges = product.custom.badges;
}
person sholsinger    schedule 05.08.2020
comment
Спасибо @sholsinger. 'csutomerperperty' в product.custom - важная проверка, которую мы всегда пропускаем. - person Pinaki Mukherjee; 23.10.2020