(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 ListnewCatalogRefIdsList = 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); }