Как изменить ставку доставки на основе адреса доставки

magento.stackexchange https://magento.stackexchange.com/questions/10082

Вопрос

Я добавил новый модуль метода доставки для моего магазина Magento. Этот модуль позволяет пользователю устанавливать тарифы на доставку на основе страны доставки адреса.
Я добавил наблюдателя по адресу доставки клиента, код ниже. В config.xml Я добавил новое мероприятие.

<events>
             <checkout_controller_onepage_save_shipping_address_after>
                <observers>
                    <zones>
                        <type>model</type>
                        <class>zones/observer</class>
                        <method>getShippingMethods</method>
                    </zones>
                </observers>
            </checkout_controller_onepage_save_shipping_address_after>
        </events>

После этого я отправил мероприятие в OnepageController > SaveShipping метод, как,

Mage::dispatchEvent('checkout_controller_onepage_save_shipping_address_after', array('page' => $model, 'request' => $this->getRequest()));

Это вызывает наблюдателя, когда я сохраняю свой адрес доставки. Но я понятия не имею, как изменить плату метода доставки в соответствии с страной адреса доставки.
Я использовал эту ветку http://www.opencart60s.com/magento/changing-or-set-shipping-price-on-fry-from-event-or-observer-in-magento.html-13407.html Чтобы изменить стоимость доставки. Но без успеха.
Мне нужно изменить свою фиксированную ставку по доставке в соответствии с страной.
Я уже создал модуль, который будет хранить страну и детали скорости доставки. Я могу получить скорость доставки с помощью этого модуля. Теперь мне просто нужно обновить значение фиксированной ставки с помощью пользовательской стоимости доставки. Пожалуйста, помогите мне установить мою фиксированную ставку в соответствии с кодом страны. Спасибо..

Это было полезно?

Решение

Я нашел решение по этой ссылке здесь: http://www.magentocommerce.com/boards/viewthread/316685/
В своем наблюдателе я добавил ниже код, чтобы изменить свои ставки доставки в соответствии с выбором страны в адресу доставки.

class Pnk_Zones_Model_Observer
{
    public function getShippingMethods($observer)
    {
        $session = Mage::getSingleton('checkout/session');
        $quote=Mage::getSingleton('checkout/session')->getQuote();
        $quoteid=$quote->getId(); 
        if($quoteid) {                    
        try{
                $address=$quote->getShippingAddress();
                if($address->getAddressType()=='shipping'){
            //    echo '<pre>'; print_r($events->getQuoteAddress()->getData()); exit;
                //$price=40;
                $countryId = $address->getCountry();
                //Code to get Shipping rate from my zone module //
                $shippingRateCollection = Mage::getModel('zones/zones')->getCollection();
                $shippingRateCollection->addFieldToSelect('*');
                $shippingRateCollection->getSelect()->where("find_in_set('".$countryId."', `countries`)");


                foreach ($shippingRateCollection as $shipping){
                    $price = $shipping->getShippingRate();
                }
//              echo "Price = ".$price;
                // Find if our shipping has been included.
                $rates = $address->collectShippingRates()
                         ->getGroupedAllShippingRates();

                foreach ($rates as $carrier) {
                    foreach ($carrier as $rate) {
                        // Check with your custom shipping method code
                if($rate->getCode() == 'zones'){
                            $rate->setPrice($price);
                            $rate->save();
               }
                    }
                }
                    $this->collectTotals($quote,$price);
                }            
                $quote->collectTotals();
            } catch (Exception $e) {            
                Mage::logException($e);
                $response['error'] = $e->getMessage();
            }
        }
    }   

    public function collectTotals($quote,$price){
        $quoteid=$quote->getId(); 
        $shippingcode='freeshipping_freeshipping';
        if($quoteid) {                    
                try{
                $quote->setSubtotal(0);
                $quote->setBaseSubtotal(0);
                $quote->setSubtotalWithDiscount(0);
                $quote->setBaseSubtotalWithDiscount(0);
                $quote->setGrandTotal(0);
                $quote->setBaseGrandTotal(0);

                $quote->getShippingAddress()->setShippingMethod($shippingcode)/* ->collectTotals() */->save();
                $quote->save();
                foreach ($quote->getAllAddresses() as $address) {
                    $address->setSubtotal(0);
                    $address->setBaseSubtotal(0);

                    $address->setGrandTotal(0);
                    $address->setBaseGrandTotal(0);

                    $address->collectTotals();

                    $quote->setSubtotal((float) $quote->getSubtotal() + $address->getSubtotal());
                    $quote->setBaseSubtotal((float) $quote->getBaseSubtotal() + $address->getBaseSubtotal());

                    $quote->setSubtotalWithDiscount(
                        (float) $quote->getSubtotalWithDiscount() + $address->getSubtotalWithDiscount()
                    );
                    $quote->setBaseSubtotalWithDiscount(
                        (float) $quote->getBaseSubtotalWithDiscount() + $address->getBaseSubtotalWithDiscount()
                    );

                    $quote->setGrandTotal((float) $quote->getGrandTotal() + $address->getGrandTotal());
                    $quote->setBaseGrandTotal((float) $quote->getBaseGrandTotal() + $address->getBaseGrandTotal());

                    $address->setShippingAmount($price);
                    $address->setBaseShippingAmount($price);
                    $address->save();
                }

                    $response['message'] = 'Succcess';
                } catch (Exception $e) {            
                        Mage::logException($e);
                        $response['error'] = $e->getMessage();
                 }
        }
    }

}

Другие советы

Thebod построил модуль, который делает это для вас, может помочь:https://github.com/thebod/thebod_shippingrates

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top