Как изменить ставку доставки на основе адреса доставки
-
16-10-2019 - |
Вопрос
Я добавил новый модуль метода доставки для моего магазина 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