问题 在Magento中跳过Checkout,获取可下载的产品


我正在使用Magento建立一个电子书网站。对于发布,我们计划提供一些免费下载的书籍。我们希望能够使用正常的Magento“目录”功能来添加下面的产品类别。但是,由于这些是免费下载的产品,因此在用户尝试下载时通过结帐发送用户并没有多大意义。

有没有人知道如何创建一个免费下载产品,完全绕过结账?我注意到可下载产品有一个“免费样本”选项,但是如果可以的话我不想使用它,因为我计划在添加付费产品时将此字段用于其预期目的。

[编辑] 我注意到你们中的一些人因为“缺乏清晰度问题”而对这个问题进行了投票。为清楚起见,我想:

  1. 知道是否可能 创建一个可下载的产品 Magento不需要用户 通过通常的结账 过程(因为它是免费的)
  2. 和 这不是'免费样品'字段 可下载的产品

不幸的是,我认为我不能再雄辩地提出这个问题了。 [/编辑]


7573
2018-04-13 04:46


起源

我的猜测是人们可能不喜欢这个头衔。它听起来有点像垃圾邮件。也许就像“Magento的Skip Checkout”一样? - statenjason
很好的反馈, - 我已经更新了标题。 - Aaron Newton
您是要将下载记录为“订单”还是仅允许人们抓取它们。作为订单,您可以看到谁下载它的历史... - Jonathan Day


答案:


此代码将允许登录的客户在绕过结帐时“下订单”免费虚拟产品,并将其直接重定向到其帐户的“我的下载”部分。

将以下行添加到您的 catalog/product/list.phtml 在你想要的地方。

<?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 } ?>

然后使用a创建一个新模块 controllers/CheckoutController.php 包含此代码:

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

您需要更好地处理异常,但这应该在功能上正确。


6
2018-02-21 08:01



我已经尝试过您的代码,但我无法进行自定义订单。 - Maniprakash Chinnasamy


我最好的盲目猜测(查看Mage_Downloadable中的块和模型)是使用产品类型实例。因此,在产品模板中的某个位置,您可以执行以下操作:

// $_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>";
    }
}

如果没有,我希望至少让你走上正确的道路。

希望有所帮助。谢谢, 乔


3
2018-04-15 02:24



谢谢。看起来我的一位同事设法用可配置的产品做到了这一点,但我不确定如何。如果我发现我会在这里发布。 - Aaron Newton


您可以循环浏览可下载链接列表,并为每个链接添加链接。

$links=Mage::getModel('downloadable/link')
        ->getCollection()
        ->addFieldToFilter('product_id',array('eq'=>$_product->getId()));

foreach($links as $link){
    echo "<a href='" . $link->getLink_url() . "'>Download</a>";
}

1
2018-01-30 18:19