我想使用 CartModifierFormHandler 修改当前订单中 commerceItem 的数量。
我已经通过catalogRefId
&new quantity
然后调用了CartModifierFormHandler.setOrderByCommerceId
或者setOrder
但它修改了所有项目的数量,除了我要修改的数量。有人可以告诉我出了什么问题或怎么做吗?
我想使用 CartModifierFormHandler 修改当前订单中 commerceItem 的数量。
我已经通过catalogRefId
&new quantity
然后调用了CartModifierFormHandler.setOrderByCommerceId
或者setOrder
但它修改了所有项目的数量,除了我要修改的数量。有人可以告诉我出了什么问题或怎么做吗?
如果您使用的是开箱即用的setOrderByCommerceId
方法(这绝对是要走的路,因为它已经处理了所有与事务相关的代码),那么您需要牢记以下几点。
setOrderByCommerceId
将调用modifyOrderByCommerceId
out-of-the-box 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
s 的数量更新为相同的数量。
这是更新数量的简化版本:
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);
}
希望这可以帮助。
modifyOrder 和 modifyOrderByCommerceId 的 javadoc 解释了这一切 -
修改订单
根据请求中的更改修改订单(从
order
属性访问)。此方法遍历订单中的每个当前 CommerceItems 并查找当前提交的数量。此外,我们会检查以确保该项目甚至应该包含在订单中。如果数量大于零,我们会调整 CommerceItem 和 ShippingGroupCommerceItemRelationship 中的数量。否则,我们删除 CommerceItem 和关系。
修改OrderByCommerceId
根据请求中的更改修改订单(从
order
属性访问)。此方法遍历订单中的每个当前 CommerceItems 并查找当前提交的数量。请注意,这取代了 modifyOrder 方法的使用,因为该方法使用 catalogRefId 来标识要修改的商业项目,而不是使用商业项目 id 本身。此外,我们会检查以确保该项目甚至应该包含在订单中。如果数量大于零,我们会调整 CommerceItem 和 ShippingGroupCommerceItemRelationship 中的数量。否则,我们删除 CommerceItem 和关系。
也可以看一下at的源CartModifierFormHandler
代码
ATG_INSTALL_LOCATION\DCS\src\Java\atg\commerce\order\purchase
比@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);
if you want update quantity of specific item in cart page you will need to pass quantity as stated below :
<input type="text" maxlength="3" name="<dsp:valueof param='commerceItem.id'/>" value="<dsp:valueof param='commerceItem.quantity'/>">
update cart button:
<dsp:input bean="CartModifierFormHandler.moveToPurchaseInfoByCommerceId" type="submit" value="Update Cart" id="sbmtUpdateCart" />
moveToPurchaseInfoByCommerceId in above code will fetch the quantity by commerceItem Id from request parameter and updates the commerceitem with the quantity.
Atg does:
int qty=request.getParameter(commerceItem.id);
commerceItem.setQuantity(qty);
and the quantity of comerce item is update.