如何在ATG中修改当前订单中商业项目的数量?
我想使用CartModifierFormHandler修改当前订单中commerceItem的数量 我已通过了catalogRefId&如何在ATG中修改当前订单中商业项目的数量?,atg,Atg,我想使用CartModifierFormHandler修改当前订单中commerceItem的数量 我已通过了catalogRefId&新数量 然后调用CartModifierFormHandler.setOrderByCommerceId或setOrder 但它修改了所有项目的数量,除了我想修改的项目。有人能告诉我出了什么问题或者怎么做吗?如果您使用的是开箱即用的setOrderByCommerceId方法(这是一种绝对可行的方法,因为它已经处理了所有与交易相关的代码),那么您需要记住以下几点
新数量
然后调用CartModifierFormHandler.setOrderByCommerceId
或setOrder
但它修改了所有项目的数量,除了我想修改的项目。有人能告诉我出了什么问题或者怎么做吗?如果您使用的是开箱即用的
setOrderByCommerceId
方法(这是一种绝对可行的方法,因为它已经处理了所有与交易相关的代码),那么您需要记住以下几点
setOrderByCommerceId
将在开箱即用的CartModifierFormHandler
中调用modifyOrderByCommerceId
。这依次调用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);
}
public boolean handleUpdateItemQuantityToOrder(DynamoHttpServletRequest请求,DynamoHttpServletResponse响应)抛出ServletException,IOException{
Order=getOrder();
//获取订单上的所有商业项目
List commerceItems=order.getCommerceItems();
字符串currentSku=“”;
//currentCommerceItem是您从JSP页面传递的项目
字符串currentId=getCurrentCommerceItem();
//将所有现有商业项目数量添加到请求中
用于(商业项目:商业项目){
setParameter(commerceItem.getId(),commerceItem.getQuantity());
if(commerceItem.getId().equals(currentId)){
currentSku=commerceItem.getCatalogRefId();
}
}
//quantity元素来自JSP页面。将其设置为您希望在请求时更改的Sku。
setParameter(currentId,getQuantity());
//为正在更新的商业项目设置新数量。
setCheckForChangedQuantity(真);
handleSetOrderByCommerceId(请求、响应);//将订单更新传递给真正的ATG方法,这样您就不必自己编写了
返回checkFormRedirect(getUpdateSuccessURL(),getUpdateErrorURL(),请求,响应);
}
希望这有帮助。modifyOrder的javadoc和modifyOrderByCommerceId解释了这一切- 修改顺序 基于以下内容修改订单(从
订单
属性访问)
关于请求中的更改。
此方法按顺序迭代每个当前商业项,并查找当前
提交的数量。此外,我们检查以确保该项目甚至应包括在内
再也不按顺序了。如果数量大于零,我们调整商业项目中的数量
以及ShippingGroupCommerceitem关系。否则,我们将删除CommerceItem和
关系
修改OrderByCommerceid
修改订单(从order
属性访问)
基于
请求。此方法按顺序和遍历每个当前商业项
查找当前提交的数量。注意,这将取代modifyOrder方法的使用
因为该方法使用catalogRefId来标识要创建的商业项目
已修改,而不是使用商业项目id本身。此外,我们会检查以确保
该项目甚至应再包含在订单中。如果数量更大
如果大于零,则调整商业项目和
ShippingGroupCommerceItemRelationship。否则,我们将删除CommerceItem和
关系
您还可以查看CartModifierFormHandler
的源代码
ATG\U安装位置\DCS\src\Java\ATG\commerce\order\purchase如果您想更新购物车页面中特定商品的数量,您需要传递如下所述的数量:
<input type="text" maxlength="3" name="<dsp:valueof param='commerceItem.id'/>" value="<dsp:valueof param='commerceItem.quantity'/>">
comerce项目的数量正在更新。比@radimpe的答案更简洁。我为“订单”添加了错误处理。我还希望有一个单一的请求参数,商业项目ID作为名称,数量作为值(例如“ci1000099”:“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);
Order-Order=getOrder();
if(order==null){
字符串msg=formatUserMessage(msg\u NO\u ORDER\u TO\u MODIFY、pRequest、pResponse);
抛出新的ServletException(msg);
}
//将商业项目及其数量添加到请求中,以便它们不会从订单中删除
List commerceItems=order.getCommerceItems();
用于(商业项目:商业项目){
if(pRequest.getParameter(commerceItem.getId())==null){
setParameter(commerceItem.getId(),commerceItem.getQuantity());
}
}
无手柄命令命令Commerceid(请求前、响应前);
返回checkFormRedirect(getUpdateSuccessURL(),getUpdateErrorURL(),pRequest,pResponse);
您应该使用setCheckForChangedQuantity
标志通知formhandler从请求而不是从项目本身读取新数量。如果不设置此项,它将执行一个项。getQuantity()
。因此,查看您上面给出的代码,它也会做同样的事情,您从commerceItem
中读取数量,而不是从请求中读取数量,因此您不会更改订单上的数量。
int qty=request.getParameter(commerceItem.id);
commerceItem.setQuantity(qty);
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);