Javascript 如何通过代码更新SFCC中自定义属性(字符串枚举)的值?
要求:我想通过代码更新产品的自定义属性(名称:徽章)(类型:字符串枚举)的值。我想将“畅销书”的值设置为选中值。由于下面的代码不起作用,我应该如何进行更新 代码段:Javascript 如何通过代码更新SFCC中自定义属性(字符串枚举)的值?,javascript,jquery,demandware,Javascript,Jquery,Demandware,要求:我想通过代码更新产品的自定义属性(名称:徽章)(类型:字符串枚举)的值。我想将“畅销书”的值设置为选中值。由于下面的代码不起作用,我应该如何进行更新 代码段: function updateBestSeller() { var ProductMgr = require('dw/catalog/ProductMgr'); var Site = require('dw/system/Site'); var UUIDUtils = require('dw/util/UUIDUtils'); v
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');
函数updateBestSeller(){
var ProductMgr=require('dw/catalog/ProductMgr');
var站点=要求('dw/系统/站点');
var UUIDUtils=require('dw/util/UUIDUtils');
var CustomObjectMgr=require('dw/object/CustomObjectMgr');
var currentSite=Site.getCurrent();
var bestSellerOrderRunits=Object.hasOwnProperty.call(currentSite.preferences.custom,'BestSellerOrderRunits')?currentSite.getCustomPreferenceValue('BestSellerOrderRunits'):0;
试一试{
Transaction.wrap(函数(){
var计数=1;
var products=ProductMgr.queryAllSiteProducts();sni
var HashSet=require('dw/util/HashSet');
var badges=newhashset();
如果(products.count>0){
while(products.hasNext()&&count<5){
var product=products.next();
var徽章=[];
徽章。推送(“畅销书”);
if(Object.hasOwnProperty.call(product.custom,'badges')){
product.custom.徽章=徽章
}
计数++;
debug(“{0}”,product.ID);
}
}
products.close();
});
}捕获(ex){
Logger.error(例如toString());
返回新状态(Status.ERROR,“ERROR”,“UPDATE failed”);
}
返回新状态(Status.OK,‘OK’、‘更新成功’);
}我认为这里可能发生的情况是,您试图验证产品在
产品中是否有徽章密钥。自定义属性集合失败。这样可以防止发生更新
我建议删除以下行周围的条件:
product.custom.徽章=徽章代码>
如果不执行该行,则数据库的更新将永远不会发生
自定义属性的工作方式是,在为给定持久对象的属性设置值之前,它们永远不会存在。(例如:产品)因此,通过类似于:产品中的“徽章”的方式来检查它是否存在。即使存在自定义属性定义,自定义
(这是推荐的方式)通常也会是错误的
,因为许多产品从未设置过徽章值。一旦一个对象将一个值设置为一个特定的自定义属性,即使它现在被设置为null
,它也将存在
此外,代码中还有一些其他问题可能会导致问题。一个例子是在同一范围内两次定义badges
变量。另一个例子是sni
,它位于定义products
变量的行的末尾。这可能会导致代码中出现错误。最后,如果可以的话,最好避免使用queryalsiteproducts
方法。另一种选择可能是使用;这可能并不总是满足您的需要,但出于性能原因,在求助于queryalsiteproducts
之前,最好先排除它
需要考虑的是,如果<代码>徽章< /代码>当前有任何选定的值,那么您将用今天的代码重写这些值。考虑将<代码>徽章最初设置为<代码> []/Cord>,然后检查是否有该产品的值:
if ('badges' in product.custom && !empty(product.custom.badges) {
badges = product.custom.badges;
}
谢谢@sholsinger。”CSUTOMERPERTY'在product.custom中-重要检查,我们总是错过。