Pregunta

He agregado un nuevo módulo de método de envío para mi tienda Magento. Este módulo permite al usuario establecer tarifas de envío en función del país de la dirección de envío.
He agregado un observador en la dirección de envío del cliente. En config.xml Agregué un nuevo evento.

<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>

Después de eso he enviado el evento en OnepageController > SaveShipping método como,

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

Esto llama al observador cuando guardo mi dirección de envío. Pero no tengo idea de cómo cambiar el cargo del método de envío según el país de la dirección de envío.
He usado este hilo http://www.opencart60s.com/magento/changing-or-set-set-price-on-fly-from-event-or-observer-in-magento.html-13407.html Para cambiar el costo de envío. Pero sin éxito.
Necesito cambiar mi tarifa plana de envío según el país.
Ya he creado el módulo que almacenará los detalles del país y la tarifa de envío. Puedo obtener la tasa de envío con ese módulo. Ahora, solo tengo que actualizar el valor de la tarifa plana con el valor de la tarifa de envío personalizado. Ayúdame a establecer mi tarifa plana según el código de país. Gracias..

¿Fue útil?

Solución

I found the solution from this link here : http://www.magentocommerce.com/boards/viewthread/316685/
In my observer I added below code to change my shipping rates as per country selection in shipping address.

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();
                 }
        }
    }

}

Otros consejos

Thebod built a module which does this for you, might help: https://github.com/thebod/Thebod_Shippingrates

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top