Пропустить оформление заказа в Magento для загружаемого продукта
Я использую Magento для создания сайта электронных книг. Для выпуска мы планируем выпустить несколько бесплатных загружаемых книг. Мы надеялись, что можно будет использовать обычную функциональность "каталога" Magento для добавления категорий с товарами внизу. Однако, поскольку это бесплатные загружаемые продукты, на самом деле не имеет смысла отправлять пользователей через оформление заказа, когда они пытаются загрузить.
Кто-нибудь знает способ создания бесплатного загружаемого продукта, который обходит касса вообще? Я заметил, что для загружаемых продуктов есть опция "бесплатный образец", но я бы предпочел не использовать ее, если смогу, так как планирую использовать это поле по назначению при добавлении платных продуктов.
[ПРАВИТЬ] Я заметил, что некоторые из вас проголосовали против этого вопроса за "отсутствие ясности в вопросе". Для ясности я хочу:
- чтобы узнать, можно ли создать загружаемый продукт в Magento, который не требует, чтобы пользователи проходили через обычный процесс оформления заказа (так как он бесплатный)
- и которое не является полем "Бесплатный образец" загружаемого продукта
К сожалению, я не думаю, что могу спросить об этом более красноречиво. [/РЕДАКТИРОВАТЬ]
3 answers
Этот код позволит зарегистрированным клиентам "оформить заказ" на бесплатный виртуальный продукт, минуя оформление заказа, и перенаправит их прямо в раздел "Мои загрузки" своей учетной записи.
Добавьте следующую строку в свой 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 } ?>
Затем создайте новый модуль с 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);
}
}
Вам нужно будет немного лучше обрабатывать исключения, но это должно быть функционально правильно.
Мое лучшее слепое предположение (глядя на блоки и модели в 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>";
}
}
Если нет, я надеюсь, что это, по крайней мере, выведет вас на правильный путь.
Надеюсь, это поможет. Спасибо, Джо
Вы можете просмотреть список загружаемых ссылок и добавить ссылку для каждой из них.
$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>";
}