Inheritance: extends AddProductForm
 public function setUpOnce()
 {
     if (!ShoppingCart_Controller::has_extension('ShoppingCartAjax')) {
         ShoppingCart_Controller::add_extension('ShoppingCartAjax');
     }
     if (!VariationForm::has_extension('ShoppingCartAjax')) {
         VariationForm::add_extension('ShoppingCartAjax');
     }
     if (!Controller::has_extension('AjaxControllerExtension')) {
         Controller::add_extension('AjaxControllerExtension');
     }
     parent::setUpOnce();
 }
 /**
  * Update the variations of a product (Cart Page)
  *
  * @see 'addtocart' function of VariationForm ($this->owner)
  * @param SS_HTTPRequest $request
  * @param AjaxHTTPResponse $response
  * @param Buyable $variation [optional]
  * @param int $quantity [optional]
  * @param VariationForm $form [optional]
  */
 public function updateVariationFormResponse(&$request, &$response, $variation = null, $quantity = 1, $form = null)
 {
     if ($request->isAjax()) {
         if (!$response) {
             $response = $this->owner->getResponse();
         }
         $response->removeHeader('Content-Type');
         $response->addHeader('Content-Type', 'application/json; charset=utf-8');
         $shoppingcart = ShoppingCart::curr();
         $shoppingcart->calculate();
         // recalculate the shopping cart
         $data = array('id' => (string) $variation->ID, 'message' => array('content' => $form->Message(), 'type' => $form->MessageType()));
         $form->clearMessage();
         // include totals if required
         if ($shoppingcart) {
             $data['subTotal'] = $shoppingcart->SubTotal();
             $data['grandTotal'] = $shoppingcart->GrandTotal();
         }
         $this->owner->extend('updateVariationFormResponseShopJsonResponse', $data, $request, $response, $variation, $quantity, $form);
         $response->setBody(json_encode($data));
     }
 }