удалите все другие способы доставки, если есть способ с нулевой суммой доставки


Можно ли удалить все shipping methods, кроме того, у которого есть сумма доставки 0?

Может быть promotion rule, который вернет сумму 0 для доставки, поэтому его нельзя снимать.

conditional free shipping

Author: Mohammad Faisal, 2014-04-04

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;?>
 6
Author: Marius, 2014-04-04 11:36:13

Отображать только способы доставки с ценой 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;
    }

}
 2
Author: Mohammad Faisal, 2017-04-13 12:54:58

Обычно я бы предложил использовать событие $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;
}
 1
Author: David Manners, 2014-04-04 14:05:49