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