Magento - 以编程方式设置运输国家/地区的单页结帐设置

时间:2014-02-26 17:30:16

标签: magento magento-1.7 checkout

我收到了客户的请求,他们希望在Magento中添加额外的国家/地区。 例如,与“英国”一起,我们添加了“威尔士”,“苏格兰”,“英格兰”。

我已遵循指南:http://www.magentoworks.net/how-to-add-new-country-in-magento 并在管理面板中设置新国家/地区以进行送货。 这很好并且有效,但是指南提到需要在数据库中使用唯一的国家代码。

出现的问题是网站使用的支付网关只接受默认的Magento网站,因为网站上添加的国家是装饰性的,我认为最好的想法是在结账时,一旦发货地址选择然后我可以检查任何新的国家/地区代码,然后将它们设置为“英国”国家/地区代码。

我在尝试让它发挥作用时遇到了问题。通过查看shipping.phtml,选择的国家/地区将被调用:

   <label for="shipping:country_id" class="required"><em>*</em><?php echo $this->__('Country') ?></label>
        <div class="input-box">
            <?php echo $this->getCountryHtmlSelect('shipping') ?>
        </div>

我已经找到了这个功能:

public function getCountryHtmlSelect($type)

以下是:

Mage/Checkout/Block/Onepage/Abstract.php

从这里我试图覆盖并自定义该功能,这样如果国家代码是自定义代码之一,那么它将设置为'GB',我希望它可以工作:

public function getCountryHtmlSelect($type)
{
    $countryId = $this->getAddress()->getCountryId();

    if($countryId == 'ZD' || $countryId == 'ZB' || $countryId == 'ZC'):

        $newCountryId = "GB";

    else:

        $newCountryId = $countryId;

    endif;

    if (is_null($countryId)) {
        $countryId = Mage::helper('core')->getDefaultCountry();
    }
    $select = $this->getLayout()->createBlock('core/html_select')
        ->setName($type.'[country_id]')
        ->setId($type.':country_id')
        ->setTitle(Mage::helper('checkout')->__('Country'))
        ->setClass('validate-select')
        ->setValue($newCountryId)
        ->setOptions($this->getCountryOptions());
    if ($type === 'shipping') {
        $select->setExtraParams('onchange="if(window.shipping)shipping.setSameAsBilling(false);"');
    }

    return $select->getHtml();
}

但是,当我通过结账和付款网关时,我收到了失败(因为它仍在发送自定义国家/地区代码。

当用户刚刚完成结帐的“送货”步骤时,更改单页结帐中的送货国家/地区代码的最佳方法是什么?

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

试试这个:

  1. 在结帐时,请隐藏字段`
  2. 创建另一个字段以选择国家/地区列表(或者只是将当前当前选择器重命名为name =“billing [country_id2]”
  3. 您将始终将GB视为国家/地区。

    要做#2,你必须覆盖Mage_Checkout_Block_Onepage_Shipping并添加以下功能。

    public function getCountryHtmlSelect($type)
    {
        $countryId = $this->getAddress()->getCountryId();
        if (is_null($countryId)) {
            $countryId = Mage::helper('core')->getDefaultCountry();
        }
        $select = $this->getLayout()->createBlock('core/html_select')
            ->setName($type.'[country_id2]')
            ->setId($type.':country_id')
            ->setTitle(Mage::helper('checkout')->__('Country'))
            ->setClass('validate-select')
            ->setValue($countryId)
            ->setOptions($this->getCountryOptions());
        if ($type === 'shipping') {
            $select->setExtraParams('onchange="if(window.shipping)shipping.setSameAsBilling(false);"');
        }
    
        return $select->getHtml();
    }
    

    注意更改行->setName($type.'[country_id2]')。仅供参考,在Mage_Checkout_Block_Onepage_Abstract中定义的功能之上,我们只是在这里重新发货。

    您还需要在客户地址上添加其他属性以保存country_id2值。您可以轻松完成此http://www.magentocommerce.com/magento-connect/customer-attributes-manager-1.html

    这样的扩展