Правило цены в корзине — примените бесплатную доставку для любого метода

У меня есть расширение для предоставления разных тарифов на доставку, у этого модуля есть опция в панели администратора, которая позволяет вам выбрать метод бесплатной доставки, если выполняется правило цены корзины (если соблюдаются требования правила цены корзины, установите этот метод как свободно).
Проблема в том, что я могу выбрать только один метод, но в одной стране я предлагаю 2 разных перевозчика для доставки посылки (самая низкая цена для разных регионов), и это проблема.
Расширение сохранить значение в core_config_data стол под pathзнак равноcarriers/premiumrate/free_method, Я не знаю, как magento получить доступ к этой информации, поэтому я запускаю эти команды через SSH:

grep -rnw 'app' -e "carriers/premiumrate/free_method"

без результата, поэтому я попытался:

grep -rnw 'app' -e "free_method"

Результаты:

app/code/core/Mage/Shipping/Helper/Data.php:159:        $freeMethod = Mage::getStoreConfig('carriers/' . $arr[0] . '/free_method', $storeId);
app/code/core/Mage/Shipping/Model/Carrier/Abstract.php:56:    protected $_freeMethod = 'free_method';

Следующий поиск:

grep -rnw 'app' -e "freeMethod"

Результат:

app/code/core/Mage/Shipping/Helper/Data.php:159:        $freeMethod = Mage::getStoreConfig('carriers/' . $arr[0] . '/free_method', $storeId);
app/code/core/Mage/Shipping/Helper/Data.php:160:        return $freeMethod == $arr[1];
app/code/core/Mage/Shipping/Model/Carrier/Abstract.php:343:        $freeMethod = $this->getConfigData($this->_freeMethod);
app/code/core/Mage/Shipping/Model/Carrier/Abstract.php:344:        if (!$freeMethod) {
app/code/core/Mage/Shipping/Model/Carrier/Abstract.php:351:                if ($item->getMethod() == $freeMethod) {
app/code/core/Mage/Shipping/Model/Carrier/Abstract.php:363:            $this->_setFreeMethodRequest($freeMethod);
app/code/core/Mage/Shipping/Model/Carrier/Abstract.php:373:                            && $rate->getMethod() == $freeMethod

И я открыл app/code/core/Mage/Shipping/Model/Carrier/Abstract.php и это строки (370378; Я добавил полную функцию внизу), что мне показалось интересным:

if (count($rates) > 1) {
foreach ($rates as $rate) {
if ($rate instanceof Mage_Shipping_Model_Rate_Result_Method
&& $rate->getMethod() == $freeMethod
) {
$price = $rate->getPrice();
}
}
}
  • Это правильное место, которое я должен отредактировать?
  • если я уберу if состояние, уничтожу ли я свой сайт?
  • Что я должен сделать, чтобы освободить любую доставку, если правило корзины
    активный / действительный?
  • Есть ли лучший способ узнать, что я должен редактировать
    вместо случайного grep?

    Полная функция:

    protected function _updateFreeMethodQuote($request)
    {
    if ($request->getFreeMethodWeight() == $request->getPackageWeight() || !$request->hasFreeMethodWeight()) {
    return;
    }
    
    $freeMethod = $this->getConfigData($this->_freeMethod);
    if (!$freeMethod) {
    return;
    }
    $freeRateId = false;
    
    if (is_object($this->_result)) {
    foreach ($this->_result->getAllRates() as $i=>$item) {
    if ($item->getMethod() == $freeMethod) {
    $freeRateId = $i;
    break;
    }
    }
    }
    
    if ($freeRateId === false) {
    return;
    }
    $price = null;
    if ($request->getFreeMethodWeight() > 0) {
    $this->_setFreeMethodRequest($freeMethod);
    
    $result = $this->_getQuotes();
    if ($result && ($rates = $result->getAllRates()) && count($rates)>0) {
    if ((count($rates) == 1) && ($rates[0] instanceof Mage_Shipping_Model_Rate_Result_Method)) {
    $price = $rates[0]->getPrice();
    }
    if (count($rates) > 1) {
    foreach ($rates as $rate) {
    if ($rate instanceof Mage_Shipping_Model_Rate_Result_Method
    && $rate->getMethod() == $freeMethod
    ) {
    $price = $rate->getPrice();
    }
    }
    }
    }
    } else {
    /**
    * if we can apply free shipping for all order we should force price
    * to $0.00 for shipping with out sending second request to carrier
    */
    $price = 0;
    }
    
    /**
    * if we did not get our free shipping method in response we must use its old price
    */
    if (!is_null($price)) {
    $this->_result->getRateById($freeRateId)->setPrice($price);
    }
    }
    

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]