Как получить способ доставки, выбранный пользователем при оформлении заказа? - PullRequest
15 голосов
/ 17 мая 2011

Я хочу получить название способа доставки, выбранного пользователем при оформлении заказа. Кто-нибудь знает, как получить эту информацию?

В некоторой степени это будет получено, но оно кэшируется:

Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingDescription();

Когда я захожу на шаг и возвращаюсь к закладке доставки и меняю доставку, она все еще сохраняет старый способ доставки. Мне нужно выяснить, как получить текущий.

Ответы [ 5 ]

74 голосов
/ 07 мая 2012

Предисловие

Создано из Magento приложение / код / ​​ядро ​​/ Маг / Оформление заказа / Блокировка / Onepage / Доставка / Метод / Available.php и другие:

app / design / frontend / base / default / template / checkout / onepage / shipping_method / available.phtml использует этот код для определения выбранного способа доставки:

$this->getAddressShippingMethod()

app/code/core/Mage/Checkout/Block/Onepage/Shipping/Method/Available.php расширяет этот код до следующего:

return $this->getAddress()->getShippingMethod();

Давайте немного исследуем и расширим его еще глубже:

$this->getQuote()->getShippingAddress()->getShippingMethod();

Родительский блок раскрывает метод getQuote () :

return $this->getCheckout()->getQuote();

И глубже:

public function getChechout() {
    return Mage::getSingleton('checkout/session');
}

Объединение всего этого кода дает нам следующее:

Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingMethod()

Это дает вам код способа доставки .Предоставляя это, вы можете манипулировать этим так, как вы хотите.Эти данные хранятся в базе данных, поэтому при изменении метода доставки меняется и код.


Все глубже и глубже!

Если вы когда-либо создавали свой собственный метод доставкивы бы знали, что у него есть метод с именем collectRates () .

Заполняет набор shipping / rate_result_method моделей, сохраняет его в экземпляре shipping / rate_result модели и возвращает его (вы можете получить каждый экземпляр модели, используя Mage :: getModel (); ).

Тем не менее, обратите внимание: можно содержать несколько rate_result_method экземпляров, в то время как код метода доставки одинаков для всех этих экземпляров!

Таким образом, чтобы получить описание, вам нужно получить один из rate_result_method экземпляров и получить его methodTitle или carrierTitle .

После небольшого исследования я нашел, как получить все эти тарифы:

Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingRatesCollection()

Это предоставит вам коллекцию всех тарифов для выбранного способа доставки.Вы можете управлять им с помощью getItems () и получить хеш.Или вы можете использовать getFirstItem () и использовать его в качестве шаблона.

В любом случае, давайте предположим, что вы получили какой-то элемент из этой коллекции и сохранили его в переменной $ rate :

$rate->getCarrier(); // This will provide you with the carrier code
$rate->getCarrierTitle(); // This will give you the carrier title
$rate->getCode(); // This will give you **current shipping method** code
$rate->getMethod(); // This will provide you with the **shipping method** code
$rate->getMethodTitle(); // This will tell you current shipping method title
$rate->getMethodDescription(); // And this is the description of the current shipping method and **it could be NULL**

Вот и все, ребята!

Мне очень жаль мой плохой английский и странный поток мыслей.Надеюсь, это поможет вам или кому-то еще.Спасибо!

6 голосов
/ 07 сентября 2011

На всякий случай, если вам это все еще нужно.Вы можете получить способ доставки из заказа:

$order->getShippingMethod();

Конечно, как вы получите свой $ заказ зависит от контекста.Также вы можете получить описание по:

$order->getShippingDescription();
1 голос
/ 14 июля 2014
shipping method in magento

$methods = Mage::getSingleton('shipping/config')->getActiveCarriers();
$options = array();
foreach($methods as $_code => $_method)
{
    if(!$_title = Mage::getStoreConfig("carriers/$_code/title"))
        $_title = $_code;

    $options[] = array('value' => $_code, 'label' => $_title . " ($_code)");
}
echo "<xmp>";
print_r($options);
echo "</xmp>";
0 голосов
/ 18 мая 2011

Вы можете переопределить функцию saveShippingMethodAction() в Mage_Checkout_OnepageController или расширить ее и сохранить метод в реестре, вставив:

Mage::register('blahShippingMethod', $this->getRequest()->getPost('shipping_method'));  

и звоните по мере необходимости: Mage::registry('blahShippingMethod');

Не забудьте отключить его, когда он вам больше не нужен, так как вы столкнетесь с ошибкой, если попытаетесь сбросить ее, когда она уже установлена.

Mage::unregister('blahShippingMethod');
0 голосов
/ 17 мая 2011

В вашем контроллере проверки вам нужно добавить дополнительные шаги, чтобы сохранить вашу цитату, если вы хотите, чтобы эта информация была доступна вам.
Я добавил несколько '$ quote-> save ();'Записи, чтобы заставить это работать, однако, я не могу окончательно сказать, какая именно запись сделала исправление.Я также не могу найти ссылку на форумах Magento, однако, я надеюсь, что я дал вам представление о том, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...