удалите все другие способы доставки, если есть способ с нулевой суммой доставки
Можно ли удалить все shipping methods
, кроме того, у которого есть сумма доставки 0?
Может быть promotion rule
, который вернет сумму 0 для доставки, поэтому его нельзя снимать.
3 answers
Вот быстрый (иш) и грязный способ сделать это.
Вам необходимо изменить шаблон способов доставки в процессе оформления заказа. (checkout/onepage/shipping_method/available.phtml
и checkout/multishipping/shipping.phtml
).
Идея заключается в том, что перед печатью доступных способов доставки вы можете просмотреть их и посмотреть, есть ли один с ценой 0
.
Поэтому добавьте этот фрагмент кода прямо перед <dl class="sp-methods">
.
<?php
$hasZeroRate = false;
$groupsToShow = array();
foreach ($_shippingRateGroups as $code => $_rates) :
foreach ($_rates as $_rate) :
if ($_rate->getPrice() == 0) :
$hasZeroRate = true;//found a zero rate
$groupsToShow[] = $code; //remember to show only this group
endif;
endforeach;
endforeach;
?>
Теперь вам нужно отредактировать список тарифов на доставку.
Итак, ниже этой строки:
<?php $_sole = count($_shippingRateGroups) == 1; foreach ($_shippingRateGroups as $code => $_rates): ?>
Добавить
<?php if ($hasZeroRate && !in_array($code, $groupsToShow)) : //if there is a rate with the price 0 and not in this group then skip the group. ?>
<?php continue;?>
<?php endif;?>
Под
<?php $_sole = $_sole && count($_rates) == 1; foreach ($_rates as $_rate): ?>
Добавьте это:
<?php if ($hasZeroRate && $_rate->getPrice() != 0) : //if there is a zero rate but the price for the current rate is not 0 skip it.?>
<?php continue;?>
<?php endif;?>
Отображать только способы доставки с ценой 0 (ноль), если таковые имеются
Я решил эту проблему, создав пользовательский модуль, в то время как другой ответ Мариуса также работает, если вы не хотите создавать модуль.
В своем модуле я переопределил блок Mage_Checkout_Block_Onepage_Shipping_Method_Available
следующим образом:
Config.xml
<global>
<blocks>
<checkout>
<rewrite>
<onepage_shipping_method_available>Excellence_Subscription_Block_Checkout_Onepage_Shipping_Method_Available</onepage_shipping_method_available>
</rewrite>
</checkout>
</blocks>
</global>
Превосходство_подписка_блок_проверка_онепаге_поставка_метод_доступен
<?php
class Excellence_Subscription_Block_Checkout_Onepage_Shipping_Method_Available extends Mage_Checkout_Block_Onepage_Shipping_Method_Available {
public function getShippingRates() {
$groups = parent::getShippingRates();
$free = array();
foreach ($groups as $code => $_rates) {
foreach ($_rates as $_rate) {
if (!$_rate->getPrice() > 0) {
$free[$code] = $_rates;
}
}
}
if (!empty($free)) {
return $this->_rates = $free;
}
return $groups;
}
}
Обычно я бы предложил использовать событие $this->_eventPrefix.'_load_after
для внесения некоторых изменений в коллекцию после ее загрузки, но в случае коллекции, прикрепленной к sales/quote_address_rate
, у нее нет префикса события, который я могу видеть:(
Что вы могли бы сделать, так это прослушать событие core_collection_abstract_load_after
и проверить экземпляр коллекции.
public function salesRateAfter($observer) {
$collection = $observer->getCollection();
if ($collection instanceof Mage_Sales_Model_Resource_Quote_Address_Rate_Collection) {
// Check for the entry you want and remove all others
}
}
Поскольку за всеми кодами тарифов на доставку, похоже, просто загружается коллекция на основе фильтра адресов.
public function getShippingRatesCollection()
{
if (is_null($this->_rates)) {
$this->_rates = Mage::getModel('sales/quote_address_rate')->getCollection()
->setAddressFilter($this->getId());
if ($this->getQuote()->hasNominalItems(false)) {
$this->_rates->setFixedOnlyFilter(true);
}
if ($this->getId()) {
foreach ($this->_rates as $rate) {
$rate->setAddress($this);
}
}
}
return $this->_rates;
}