Как мне обновить значение настраиваемого атрибута (enum-of-strings) в SF CC с помощью кода? - PullRequest
0 голосов
/ 04 августа 2020

Требование: я хочу обновить значение настраиваемого атрибута (name: badges) (type: enum-of-strings) для Продукта с помощью кода. Я хочу установить значение 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');

}

1 Ответ

0 голосов
/ 05 августа 2020

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

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

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

Настраиваемые атрибуты работают так, что они никогда не будут существовать, пока не будет установлено значение для этого атрибута для данного постоянного объекта. (например: Product). Таким образом, проверка, существует ли он, с помощью чего-то вроде: '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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...