如果满足条件,则删除运输选项



如果满足特定条件,我想从运输方法中删除标准运输选项productmatrix_Standard。我认为我需要覆盖以下内容:

/**
 * One page checkout status
 *
 * @category   Mage
 * @category   Mage
 * @package    Mage_Checkout
 * @author      Magento Core Team <core@magentocommerce.com>
 */
class Mage_Checkout_Block_Onepage_Shipping_Method_Available extends Mage_Checkout_Block_Onepage_Abstract
{
    protected $_rates;
    protected $_address;
    public function getShippingRates()
    {
        if (empty($this->_rates)) {
            $this->getAddress()->collectShippingRates()->save();
            $groups = $this->getAddress()->getGroupedAllShippingRates();
            /*
            if (!empty($groups)) {
                $ratesFilter = new Varien_Filter_Object_Grid();
                $ratesFilter->addFilter(Mage::app()->getStore()->getPriceFilter(), 'price');
                foreach ($groups as $code => $groupItems) {
                    $groups[$code] = $ratesFilter->filter($groupItems);
                }
            }
            */
            return $this->_rates = $groups;
        }
        return $this->_rates;
    }
}

如何从该集合中删除现有的运送方法,或者清空它并手动重新构建它,跳过productmatrix_Standard选项?

您应该替代运输模型中的"function collectRates()"
例如内部/app/code/core/Mage/Shipping/Model/Carrier/Flatrate.php/app/code/Mage/Usa/Model/Shipping/Carrier/Ups.php

在每个运营商上运行collectRates()时,可以获得有关地址和购物车的所有详细信息。这使其成为过滤特定速率或更改其names/price. 的理想选择

我最终选择了

<?php
    public function getShippingRates() {
        if (empty($this->_rates)) {
            $this->getAddress()->collectShippingRates()->save();
            $groups = $this->getAddress()->getGroupedAllShippingRates();
            if ($this->someCondition()) {
                $badMethods = array('productmatrix_Standard');
                // Loop through groups (productmatrix)
                // pass by reference for unset later
                foreach ($groups as $code => &$groupItems) {
                    // Lopp through methods (standards, 2day)
                    foreach($groupItems as $key => $item) {
                        // Check for bad shipping methods
                        if (in_array($item->getCode(), $badMethods)) {
                            // Remove the method from the shipping groups
                            unset($groupItems[$key]);
                        }
                    }
                }
            }
            $this->_rates = $groups;
        }
        return $this->_rates;
    }

最新更新