Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Skip Checkout in Magento for a downloadable product

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 Magento 'catalog' functionality to add categories with products underneath. However, since these are free downloadable products, it doesn't really make sense to send users through the checkout when they try to download.

Does anyone know of a way to create a free downloadable product which bypasses the checkout altogether? I have noticed that there is a 'free sample' option for downloadable products, but I would prefer not to use this if I can as I plan to use this field for its intended purpose when I add paid products.

[EDIT] I have noticed that some of you have voted this question down for 'lack of question clarity'. For clarity, I want:

  1. to know if it is possible to create a downloadable product in Magento which doesn't require users to go through the usual checkout process (since it is free)
  2. and which is not the 'Free Sample' field of a downloadable product

Unfortunately I don't think I can ask this any more eloquently. [/EDIT]

like image 444
Aaron Newton Avatar asked Apr 13 '10 04:04

Aaron Newton


2 Answers

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.

<?php if($_product->isVirtual() && $_product->getFinalPrice()==0) { ?>
                <a href="/modulename/checkout/purchase/id/<?php echo $_product->getId()?>"><?php echo $this->__('Download and Install') ?></a>
            <?php } ?>

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.

like image 66
Jonathan Day Avatar answered Oct 03 '22 07:10

Jonathan Day


My best blind guess (looking at the blocks and models in Mage_Downloadable) is using the product type instance. So, somewhere in your product templates, you may be able to do this:

// $_product is the current product
$links = $product->getTypeInstance(true)->getLinks();
if(count($links)) {
    foreach($links as $link) {
        print "<a href='". $this->getUrl('downloadable/download/link', array(
            'id'        => $item->getLinkHash(),
            '_secure'   => true,
            '_nosid'    => true
        )) . "'>Download</a>";
    }
}

If not, I hope that at least gets you on the right path.

Hope that helps. Thanks, Joe

like image 28
Joe Mastey Avatar answered Oct 03 '22 06:10

Joe Mastey