如何在ATG中修改当前订单中的commerceItem数量?

时间:2013-11-04 08:56:12

标签: atg

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

我已通过catalogRefId& new quantity 然后调用CartModifierFormHandler.setOrderByCommerceIdsetOrder 但除了我要修改的项目之外,它还修改了所有项目的数量。有人能告诉我什么是错的或怎么做?

4 个答案:

答案 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);