Доставка (Shipping) по умолчанию в Magento?

Возникла проблема из настройкой оплаты за доставку в Мадженто. Суть в том, что система рассчитывает стоимость доставки после чекаута, а до этого она просто не выводит соответствующего поля в Summary корзинки.


Что есть? Стоимость доставки фиксированная, всегда одинаковая, и для всей корзинки (невзирая ни на количество ни на стоимость товаров в ней).


Что нужно? Как только я зашел в корзину, я должен видеть соответствующее поле, не дожидаясь чекаута. Вроде что-то доставки по умолчанию.


Для тех кто знает, возможно, задача пустяковая, но мне она уже портит нервы. Буду признателен за помощь.
  • Вопрос задан
  • 3876 просмотров
Пригласить эксперта
Ответы на вопрос 3
@blainer
Если я правильно понял, то доставку по-умолчанию можно реализовать, отредактировав файл app/design/frontend/default/default/template/checkout/onepage/shipping_method/available.phtml

Найдите:

<?php foreach ($_rates as $_rate): ?>

Добавьте такой код (в данном случае проверяем, есть ли бесплатная доставка):

<?php if ($_rate->getCode()=='freeshipping_freeshipping' && !$this->getAddress()->getShippingMethod()) {
$this->getAddress()->setShippingMethod($_rate->getCode());
} ?>
Ответ написан
@Den4ik_k

Для того чтобы стоимость доставки отображалась в корзине вам необходимо, чтобы данный метод был активирован для данной корзины. Для этого достаточно добавить обсервер на событие checkout_cart_save_after и в коде реализовать добавление:


$_shippingMethod = 'freeshipping_freeshipping';
$_session = Mage::getSingleton('checkout/session');
$_quote = $_session->getQuote();
$_address = $_quote->getShippingAddress();

$_sessionCost = $_session->getQuoteShippingCost();
$_sessionCountry = $_session->getQuoteShippingCountry();

if ((!$_sessionCost || $_sessionCost == 0)) {
$_country = null;
$_customerSession = Mage::getSingleton('customer/session');
if ($_customerSession->isLoggedIn()) {
 $_customerAddress = $_customerSession->getCustomer()->getDefaultShippingAddress();
if ($_customerAddress != null) {
if ($_customerAddress->getId()) $_country = $_customerAddress->getCountryId();
}
}
if ($_country == null) $_country = 'US';

$_address->setCountryId($_country);
if ($this->_getRequest()->getParam('zip_code')) {
$_address->setPostcode($this->_getRequest()->getParam('zip_code'));
}
$_address->setCollectShippingRates(true)->collectShippingRates();
$_quote->setShippingMethod($_shippingMethod)->save();

$_method = $_quote->getShippingMethod();

if ($_method) {
foreach ($_address->getAllShippingRates() as $_rate) {
if ($_rate->getCode() == $_method) {
$_session->setQuoteShippingCost($_address->getQuote()->getStore()->convertPrice($_rate->getPrice(), false));
Mage::getSingleton('checkout/type_onepage')->getQuote()->getShippingAddress()->setCountryId($_country)->setShippingMethod($_method)->save();
                  break;
}
}
                }
$_session->getQuote()->save();
$_session->resetCheckout();

 } else {
  //log
 }

Код может незначительно отличаться, но принцип таков

Ответ написан
Комментировать
Hide
@Hide
инженер-программист
Есть готовое решение на базе модуля Mage_Autoquote. Проверил его работу на базе Magento 1.8.1.0
Так выглядит страница с настройками в бэкэнде:
9c0baf4abadd45079c6fe977bb23830f.jpg
Скрин фронта сразу после добавления продукта в корзину при включенном расширении:
0a44f635749b4a95ae78c7be0d7497d7.jpg

А здесь можно ознакомиться с ответами на аналогичный вопрос на инглише.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы