我想使用CartModifierFormHandler修改当前订单中的commerceItem数量。
我已通过catalogRefId
& new quantity
然后调用CartModifierFormHandler.setOrderByCommerceId
或setOrder
但除了我要修改的项目之外,它还修改了所有项目的数量。有人能告诉我什么是错的或怎么做?
答案 0 :(得分:3)
如果您使用的是开箱即用的setOrderByCommerceId
方法(由于它已经处理了所有与事务相关的代码,这绝对是可行的方法),那么您需要牢记以下几点:
setOrderByCommerceId
会在开箱即用的modifyOrderByCommerceId
中致电CartModifierFormHandler
。这反过来调用getQuantity
public long getQuantity(String pCatalogRefId, DynamoHttpServletRequest pRequest, DynamoHttpServletResponse pResponse) throws ServletException, IOException, NumberFormatException {
Object value = pRequest.getParameter(pCatalogRefId);
if (value != null) {
return Long.parseLong(value.toString());
}
return getQuantity();
}
因此,从此代码段中可以清楚地看出,除非您将每个现有commerceItem
的个别数量传递给请求,否则您只需将每个commerceItem
的数量更新为相同的量。
以下是更新数量的简化版本:
public boolean handleUpdateItemQuantityToOrder(DynamoHttpServletRequest request, DynamoHttpServletResponse response) throws ServletException, IOException {
Order order = getOrder();
//Get All the Commerce Items on the Order
List<CommerceItem> commerceItems = order.getCommerceItems();
String currentSku = "";
// currentCommerceItem is the one that you passed from your JSP page
String currentId = getCurrentCommerceItem();
// Add all the existing commerce item quantities to the request
for (CommerceItem commerceItem : commerceItems) {
request.setParameter(commerceItem.getId(), commerceItem.getQuantity());
if (commerceItem.getId().equals(currentId)) {
currentSku = commerceItem.getCatalogRefId();
}
}
// the quantity element is from the JSP page. Set it to the Sku you want to change on the request.
request.setParameter(currentId, getQuantity());
// Set the new quantity for the commerce item being updated.
setCheckForChangedQuantity(true);
handleSetOrderByCommerceId(request, response); // Pass the order updates to a REAL ATG method so you don't have to write it yourself
return checkFormRedirect(getUpdateSuccessURL(), getUpdateErrorURL(), request, response);
}
希望这有帮助。
答案 1 :(得分:0)
modifyOrder和modifyOrderByCommerceId的javadoc解释了这一切 -
<强> modifyOrder 强>
修改订单(从
order
属性访问) 关于请求的变化。 此方法按顺序迭代每个当前CommerceItem并查找当前 提交的数量。此外,我们检查以确保甚至包括该项目 在订单中更长。如果数量大于零,我们调整CommerceItem中的数量 和ShippingGroupCommerceItemRelationship。否则我们删除CommerceItem和 关系。
<强> modifyOrderByCommerceId 强>
修改订单(从
order
属性访问) 基于的变化 请求。此方法按顺序迭代每个当前CommerceItem 查找提交的当前数量。注意,这取代了modifyOrder方法的使用 因为该方法利用catalogRefId来识别商业项目 修改而不是使用商业项目ID本身。另外我们检查以确保 该项目甚至应该包括在订单中。如果数量更大 我们调整CommerceItem中的数量而不是零 ShippingGroupCommerceItemRelationship。否则我们删除CommerceItem和 关系。
您还可以在
查看CartModifierFormHandler
的源代码
ATG_INSTALL_LOCATION \ DCS \ SRC \爪哇\ ATG \商业\顺序\购买
答案 2 :(得分:0)
如果您想要购物车页面中特定商品的更新数量,则需要按照以下说明传递数量:
<input type="text" maxlength="3" name="<dsp:valueof param='commerceItem.id'/>" value="<dsp:valueof param='commerceItem.quantity'/>">
更新购物车按钮:
<dsp:input bean="CartModifierFormHandler.moveToPurchaseInfoByCommerceId" type="submit" value="Update Cart" id="sbmtUpdateCart" />
上面代码中的moveToPurchaseInfoByCommerceId将通过来自请求参数的commerceItem Id获取数量,并使用数量更新tradeitem。
Atg确实:
int qty=request.getParameter(commerceItem.id);
commerceItem.setQuantity(qty);
并且更新了电子商品的数量。
答案 3 :(得分:0)
比@ radimpe的回答更简洁。我为“订单”添加了错误处理。我还期望单个请求参数,商业项目ID作为名称,数量作为值(例如“ci10000099”:“2”)。似乎没有必要调用 setCheckForChangedQuantity(true),除非我遗漏了什么。
Order order = getOrder();
if (order == null) {
String msg = formatUserMessage(MSG_NO_ORDER_TO_MODIFY, pRequest, pResponse);
throw new ServletException(msg);
}
// Add the commerce items and their quantities to the request so that they are not removed from the order
List<CommerceItem> commerceItems = order.getCommerceItems();
for (CommerceItem commerceItem : commerceItems) {
if (pRequest.getParameter(commerceItem.getId()) == null) {
pRequest.setParameter(commerceItem.getId(), commerceItem.getQuantity());
}
}
handleSetOrderByCommerceId(pRequest, pResponse);
return checkFormRedirect(getUpdateSuccessURL(), getUpdateErrorURL(), pRequest, pResponse);