首页 > 解决方案 > 如何通过代码更新 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');

}

标签: javascriptjquerydemandware

解决方案


我认为这里可能发生的事情是您尝试验证产品在属性集合中是否具有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;
}

推荐阅读