2

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

我已经通过catalogRefId&new quantity 然后调用了CartModifierFormHandler.setOrderByCommerceId或者setOrder 但它修改了所有项目的数量,除了我要修改的数量。有人可以告诉我出了什么问题或怎么做吗?

4

4 回答 4

3

如果您使用的是开箱即​​用的setOrderByCommerceId方法(这绝对是要走的路,因为它已经处理了所有与事务相关的代码),那么您需要牢记以下几点。

setOrderByCommerceId将调用modifyOrderByCommerceIdout-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给请求,否则您只需将每个commerceItems 的数量更新为相同的数量。

这是更新数量的简化版本:

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);
}

希望这可以帮助。

于 2013-11-08T05:31:59.383 回答
0

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

于 2013-11-14T17:28:43.937 回答
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);
于 2015-03-25T19:55:08.377 回答
0

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.

于 2013-11-16T07:55:39.263 回答