如何获得用户在结账时选择的送货方式?

时间:2011-05-17 15:08:07

标签: magento

我想知道用户在结帐时选择的送货方式的名称。有谁知道如何检索该信息?

这将在某种程度上得到它,但它被缓存:

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

当我在一步结账时,我回到运输标签并更改运费,它仍然保持旧的运输方式。我需要弄清楚如何获得当前的。

5 个答案:

答案 0 :(得分:74)

前言

由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 模型的实例中并返回它(您可以使用<获取每个模型'实例em> Mage :: getModel(&lt; model我已命名为&gt;); )。

但是,请注意:可以包含多个 rate_result_method 实例,而所有这些实例的送货方式代码相同!

因此,为了获得描述,您需要获取其中一个 rate_result_method 实例并检索其 methodTitle carrierTitle 。< / p>

经过一番小小的研究后,我发现了如何检索所有这些费率:

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

这就是全部,伙计们!

对于我可怜的英语和奇怪的思维流,我感到非常抱歉。希望这会帮助你或其他人。谢谢!

答案 1 :(得分:6)

万一你还需要它。您可以通过以下方式获得送货方式:

$order->getShippingMethod();

当然,如何获得$ order取决于上下文。 您也可以通过以下方式获取说明:

$order->getShippingDescription();

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您希望自己可以访问此信息,则需要在结帐控制器中添加额外步骤以保存报价。
我添加了一些'$ quote-&gt; save();'但是,我无法明确说明哪个条目是执行修复的条目。我也找不到Magento论坛上的链接,但是,我希望我能帮助你了解正在发生的事情。

答案 4 :(得分:0)

您可以覆盖saveShippingMethodAction()中的Mage_Checkout_OnepageController函数,或对其进行扩展,并通过插入以下方法将该方法保存到注册表中:

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

并在您需要时致电:Mage::registry('blahShippingMethod');

不要忘记在不再需要它时取消设置它,因为如果您在设置时尝试重置,则会遇到错误。

Mage::unregister('blahShippingMethod');