Как получить способ доставки, который пользователь выбрал во время оформления заказа?

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

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

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

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

Ответы

Ответ 1

Предисловие

Построено из Magento app/code/core/Mage/Checkout/Block/Onepage/Shipping/Method/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 и возвращает его (вы можете получить экземпляр каждой модели с помощью Мага:: getModel (< модель я названа > );).

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

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

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

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

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

В любом случае, предположим, что u've получил некоторый элемент этой коллекции и сохранил его в переменной $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**

Что все, люди!

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

Ответ 2

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

$order->getShippingMethod();

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

$order->getShippingDescription();

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

Mage::unregister('blahShippingMethod');