如何在ATG中修改当前订单中商业项目的数量?

如何在ATG中修改当前订单中商业项目的数量?,atg,Atg,我想使用CartModifierFormHandler修改当前订单中commerceItem的数量 我已通过了catalogRefId&新数量 然后调用CartModifierFormHandler.setOrderByCommerceId或setOrder 但它修改了所有项目的数量,除了我想修改的项目。有人能告诉我出了什么问题或者怎么做吗?如果您使用的是开箱即用的setOrderByCommerceId方法(这是一种绝对可行的方法,因为它已经处理了所有与交易相关的代码),那么您需要记住以下几点

我想使用CartModifierFormHandler修改当前订单中commerceItem的数量

我已通过了catalogRefId&
新数量
然后调用
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);