CartModifierFormHandler を使用して、現在の注文の commerceItem の数量を変更したいと考えています。
パスしてから、または
いずれかを呼び出しcatalogRefId
まし
たが、変更したいアイテム以外のすべてのアイテムの数量が変更されました。誰かが何が間違っているのか、それを行う方法を教えてもらえますか?new quantity
CartModifierFormHandler.setOrderByCommerceId
setOrder
CartModifierFormHandler を使用して、現在の注文の commerceItem の数量を変更したいと考えています。
パスしてから、または
いずれかを呼び出しcatalogRefId
まし
たが、変更したいアイテム以外のすべてのアイテムの数量が変更されました。誰かが何が間違っているのか、それを行う方法を教えてもらえますか?new quantity
CartModifierFormHandler.setOrderByCommerceId
setOrder
すぐに使用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);
}
お役に立てれば。
@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);
カート ページの特定のアイテムの数量を更新する場合は、以下に示すように数量を渡す必要があります。
<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 によって数量をフェッチし、その数量で commerceitem を更新します。
Atg は次のことを行います。
int qty=request.getParameter(commerceItem.id);
commerceItem.setQuantity(qty);
と商品の数量が更新されます。