Skip Checkout in Magento for a downloadable product

前端 未结 3 1048
后悔当初
后悔当初 2020-12-03 05:56

I am using Magento to build an eBooks site. For the release, we plan to have a number of free downloadable books. We were hoping that it would be possible to use the normal

3条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-03 06:34

    This code will allow logged-in customers to "place an order" for a Free, Virtual product while bypassing checkout and redirect them straight to the My Downloads section of their account.

    Add the following line to your catalog/product/list.phtml in the spot you want it.

    isVirtual() && $_product->getFinalPrice()==0) { ?>
                    __('Download and Install') ?>
                
    

    Then create a new module with a controllers/CheckoutController.php containing this code:

    public function purchaseAction() {
    if (!Mage::getSingleton('customer/session')->isLoggedIn()) {
            $this->_redirectUrl(Mage::getBaseUrl().'customer/account');
            return;
     }
     $request = $this->getRequest();
     $id = $request->getParam('id');
     $product = Mage::getModel('catalog/product')
                    ->load($id)
                    ->setStoreId(Mage::app()->getStore()->getId());
     if(!($product->getIsVirtual() && $product->getFinalPrice() == 0)){
         Mage::getSingleton('checkout/session')->addError($this->__('Method only available for Free Downloadable Items'));
         return $this;
     }
     $onepage = Mage::getSingleton('checkout/type_onepage');
     /* @var $onepage Mage_Checkout_Model_Type_Onepage */
     try{
         $quote = $onepage->getQuote();
         /* @var $quote Mage_Sales_Model_Quote */
         $quote->addProduct($product);
         Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
         $onepage->initCheckout();
         $payment=array('method'=>'free');
         $onepage->savePayment($payment);   
         $onepage->saveOrder();
         $this->getResponse()->setRedirect('/downloadable/customer/products');
     }
     catch(Exception $e){
         $result = $e->getMessage();
         Mage::getSingleton('checkout/session')->addError($result);
     }
     }
    

    You'll need to handle the Exceptions a little better, but that should be functionally correct.

提交回复
热议问题