
(Photo: Red Cart Conga, Baby by It’sGreg)
ATG’s CartModifierFormHandler has a handle method for adding multiple items to the shopping cart, handleAddMultipleItemsToOrder.
<dsp:input type="submit" bean="CartModifierFormHandler.addMultipleItemsToOrder" />
What is required is that in the request you set the product ID and SKU ID (catalogRefId) for each product you want to add.
<dsp:input bean="CartModifierFormHandler.productIds" paramvalue="product.id" type="hidden" />
<dsp:input bean="CartModifierFormHandler.catalogRefIds" paramvalue="sku.id" type="hidden" />
Seems pretty-straightforward, right? Well there are a couple of tricks.
Trick #1: Setting the quantity
Setting the quantity of the amount of each SKU you want added to the cart requiring naming the quantity input using the SKU iD.
<input type="text" name="<dsp:valueof param="sku.id"/>" />
Trick #2: Handling zero quantity inputs
When the handleAddMultipleItemsToOrder tries to add something that has a quantity of zero or less you it will output an error message that the quantity is zero or less. If you have a input form where the user does not have to add all the items on the page then this will be problematic.
To get around this restriction I overrode the preAddMultipleItemsToOrder method. My method sets the productIds and catalogRefIds properties to only have items that have a quantity greater than zero.
public void preAddMultipleItemsToOrder(DynamoHttpServletRequest pReq,
DynamoHttpServletResponse pRes) throws ServletException,
IOException {
// get the SKU ID's and product ID's set in the form
String[] oldCatalogRefIds = getCatalogRefIds();
String[] oldProductIds = getProductIds();
// make sure that the SKU ID's and product ID's are valid and of the
// same length
if (oldCatalogRefIds == null || oldCatalogRefIds.length == 0)
return;
if (oldProductIds == null || oldCatalogRefIds.length != oldProductIds.length) {
return;
}
// initialize list for the SKU ID's and product ID's that we will add to
// the shopping cart
List newCatalogRefIdsList = new ArrayList(
oldCatalogRefIds.length);
List newProductIdsList = new ArrayList(
oldCatalogRefIds.length);
// iterate through original SKU ID's
for (int ii = 0; ii < oldCatalogRefIds.length; ii++) {
// get next SKU ID
String catalogRefId = oldCatalogRefIds[ii];
// get quantity requested for that SKU ID
long qty;
try {
qty = getQuantity(catalogRefId, pRequest, pResponse);
} catch (NumberFormatException exc) {
if (isLoggingDebug())
logDebug("invalid quantity for catalogRefId=" + catalogRefId, exc);
qty = 0;
}
// if quantity > 0 then save this SKU ID and it's product ID
if (qty > 0) {
newCatalogRefIdsList.add(catalogRefId);
String productId = oldProductIds[ii];
newProductIdsList.add(productId);
}
}
// set the catalog ID's property to only have the SKU ID's of things
// that are being ordered
String[] newCatalogRefIds = new String[newCatalogRefIdsList.size()];
newCatalogRefIdsList.toArray(newCatalogRefIds);
if (isLoggingDebug()) {
logDebug("old catalogRefIds=" + Arrays.toString(oldCatalogRefIds)
+ ", new catalogRefIds="
+ Arrays.toString(newCatalogRefIds));
}
setCatalogRefIds(newCatalogRefIds);
// set the product ID's property to only have the product ID's of things
// that are being ordered
String[] newProductIds = new String[newProductIdsList.size()];
newProductIdsList.toArray(newProductIds);
if (isLoggingDebug()) {
logDebug("old productIds=" + Arrays.toString(oldProductIds)
+ ", new productIds="
+ Arrays.toString(newProductIds));
}
setProductIds(newProductIds);
}