过滤Magento地址的P.O Box

原因很简单,我们使用的快递是UPS,UPS是不送P.O.Boxes地址的。这就需要在支付填写地址时进行验证。

在自己动手之前,我找了一个解决方案preventing P.O. Boxes in shipping addresses 。这篇文章里面写得比较清楚。

只需要修改Customer/Model/Address/Abstract.php 和Checkout/Model/Type/Onepage.php 就行。在作者的基础上,我做了一点小的修改。原文是在新建一个validate_pobox的函数,我是直接把验证添加到validate函数里的。

找到文件

/app/code/core/Mage/Customer/Model/Address/Abstract.php

将下面这段代码加到validate函数的下面

if ($this->getCountryModel()->getRegionCollection()->getSize()
               && !Zend_Validate::is($this->getRegionId(), 'NotEmpty')) {
            $errors[] = $helper->__('Please enter the state/province.');
        }

添加验证代码之后就变成下面这样了

if ($this->getCountryModel()->getRegionCollection()->getSize()
   	&& !Zend_Validate::is($this->getRegionId(), 'NotEmpty')) {
    	$errors[] = $helper->__('Please enter the state/province.');
   }
   //add filter for P.O. Box
if( preg_match("/p\.* *o\.* *box/i", $this->getStreet(1))
      || preg_match("/p\.* *o\.* *box/i", $this->getStreet(2)) )
  {
      $errors[] = $helper->__('We cannot ship to PO boxes.');
  }

然后为了不修改Magento的Core文件,然后将文件移到local文件夹

/app/code/local/Mage/Customer/Model/Address/Abstract.php

下即可。

在参考这篇文章Adding validation to registration form in Magento后,我创建了一个插件 No PO Box Shipping。该插件是重写了Mage_Sales_Model_Quote_Address这个类实现的。在实现的过程中遇到无法重写abstract class的问题。Mage_Sales_Model_Quote_Address 是从Mage_Customer_Model_Address_Abstract 类继承过来的。validate函数是写在Mage_Customer_Model_Address_Abstract 这个抽象函数的,本来想直接重写这个类,后来失败了,在Magento中是无法重写Absract Class的,因为Magento在core里面是直接继承这个抽象类的,例如

class Matt_Nopobox_Model_Quote_Address extends Mage_Customer_Model_Address_Abstract

Magento 可以重写非class 主要是因为Magento使用的URI命名来实例化对象。

$helper = Mage::helper('mymodule/myclass');

但是abstract class是直接在php文件中继承,所以替换的时候并没有hook上.

文件app/code/core/Mage/Core/Model/Config.php的类Mage_Core_Model_Config.该类会在getGroupedClassName函数里,会检查是否被rewrite, 如果被重写过,就会返回重写后的对象.

 

插件下载地址:

No PO Box Shipping

 

参考资料

http://www.westwideweb.com/wp/2011/03/15/magento-prevent-entry-of-po-boxes-for-shipping-address/

http://www.fontis.com.au/blog/magento/preventing-po-box-shipping-addresses

http://www.magentocommerce.com/boards/viewthread/18494/P15/

http://www.webbitten.com/index.php?option=com_content&view=article&id=6&Itemid=2

http://inchoo.net/ecommerce/magento/how_to_override_magento_model_classes/