Esempio n. 1
0
  /*
   * The Heat Clinic does not show the cart when a product is added. Instead, when the product is added via an AJAX
   * POST that requests JSON, we only need to return a few attributes to update the state of the page. The most
   * efficient way to do this is to call the regular add controller method, but instead return a map that contains
   * the necessary attributes. By using the @ResposeBody tag, Spring will automatically use Jackson to convert the
   * returned object into JSON for easy processing via JavaScript.
   */
  @RequestMapping(value = "/add", produces = "application/json")
  public @ResponseBody Map<String, Object> addJson(
      HttpServletRequest request,
      HttpServletResponse response,
      Model model,
      @ModelAttribute("addToCartItem") AddToCartItem addToCartItem)
      throws IOException, PricingException, AddToCartException {
    Map<String, Object> responseMap = new HashMap<String, Object>();
    try {
      super.add(request, response, model, addToCartItem);

      if (addToCartItem.getItemAttributes() == null
          || addToCartItem.getItemAttributes().size() == 0) {
        responseMap.put("productId", addToCartItem.getProductId());
      }
      responseMap.put(
          "productName", catalogService.findProductById(addToCartItem.getProductId()).getName());
      responseMap.put("quantityAdded", addToCartItem.getQuantity());
      responseMap.put("cartItemCount", String.valueOf(CartState.getCart().getItemCount()));
      if (addToCartItem.getItemAttributes() == null
          || addToCartItem.getItemAttributes().size() == 0) {
        // We don't want to return a productId to hide actions for when it is a product that has
        // multiple
        // product options. The user may want the product in another version of the options as well.
        responseMap.put("productId", addToCartItem.getProductId());
      }
      if (useSku) {
        responseMap.put("skuId", addToCartItem.getSkuId());
      }
    } catch (AddToCartException e) {
      if (e.getCause() instanceof RequiredAttributeNotProvidedException) {
        responseMap.put("error", "allOptionsRequired");
      } else if (e.getCause() instanceof ProductOptionValidationException) {
        ProductOptionValidationException exception =
            (ProductOptionValidationException) e.getCause();
        responseMap.put("error", "productOptionValidationError");
        responseMap.put("errorCode", exception.getErrorCode());
        responseMap.put("errorMessage", exception.getMessage());
        // blMessages.getMessage(exception.get, lfocale))
      } else if (e.getCause() instanceof InventoryUnavailableException) {
        responseMap.put("error", "inventoryUnavailable");
      } else {
        throw e;
      }
    }

    return responseMap;
  }
Esempio n. 2
0
 @RequestMapping("/updateQuantity")
 public String updateQuantity(
     HttpServletRequest request,
     HttpServletResponse response,
     Model model,
     RedirectAttributes redirectAttributes,
     @ModelAttribute("addToCartItem") AddToCartItem addToCartItem)
     throws IOException, PricingException, UpdateCartException, RemoveFromCartException {
   try {
     String returnPath = super.updateQuantity(request, response, model, addToCartItem);
     if (isAjaxRequest(request)) {
       returnPath += " :: ajax";
     }
     return returnPath;
   } catch (UpdateCartException e) {
     if (e.getCause() instanceof InventoryUnavailableException) {
       // Since there was an exception, the order gets detached from the Hibernate session. This
       // re-attaches it
       CartState.setCart(orderService.findOrderById(CartState.getCart().getId()));
       if (isAjaxRequest(request)) {
         model.addAttribute(
             "errorMessage",
             "Not enough inventory to fulfill your requested amount of "
                 + addToCartItem.getQuantity());
         return getCartView() + " :: ajax";
       } else {
         redirectAttributes.addAttribute(
             "errorMessage",
             "Not enough inventory to fulfill your requested amount of "
                 + addToCartItem.getQuantity());
         return getCartPageRedirect();
       }
     } else {
       throw e;
     }
   }
 }
Esempio n. 3
0
 /*
  * The Heat Clinic does not support adding products with required product options from a category browse page
  * when JavaScript is disabled. When this occurs, we will redirect the user to the full product details page
  * for the given product so that the required options may be chosen.
  */
 @RequestMapping(
     value = "/add",
     produces = {"text/html", "*/*"})
 public String add(
     HttpServletRequest request,
     HttpServletResponse response,
     Model model,
     RedirectAttributes redirectAttributes,
     @ModelAttribute("addToCartItem") AddToCartItem addToCartItem)
     throws IOException, PricingException, AddToCartException {
   try {
     return super.add(request, response, model, addToCartItem);
   } catch (AddToCartException e) {
     Product product = catalogService.findProductById(addToCartItem.getProductId());
     return "redirect:" + product.getUrl();
   }
 }