如何不引人注目地向Magento checkout添加新的验证方法

时间:2011-12-05 23:23:07

标签: ajax validation magento shipping unobtrusive

我希望阻止客户将邮政信箱输入所选运输方式的运送地址(特别是在这种情况下为UPS)。我可以覆盖js/prototype/validation.js以插入新的验证模式,但我不想分叉这样的密钥文件。

是否有机制在不重写核心文件的情况下通过Javascript选择送货方式后,不显眼地验证客户的送货地址?

我看到Validation.add内部使用了validation.js,因此可以在核心文件之外添加新的验证方法吗?

我要申请的正则表达式是

\b([P|p](OST|ost)?\.?\s?[O|o|0](ffice|FFICE)?\.?\s)?([B|b][O|o|0][X|x])\s(\d+)

如果无法在JS中优雅地执行验证,我会对controller_action_predispatch_onepage_saveShippingMethod上的观察者感兴趣,该观察者检查数据并在必要时执行Ajax重定向回送货地址表单。

2 个答案:

答案 0 :(得分:7)

使用的库是Really Easy Field Validation,该页面确实解释了如何扩展它。我想你需要这样的东西:

Validation.add('address', 'Error message text', {
    pattern : /\b([P|p](OST|ost)?\.?\s?[O|o|0](ffice|FFICE)?\.?\s)?([B|b][O|o|0][X|x])\s(\d+)/
});

答案 1 :(得分:3)

简要介绍一下,无需调试结账

# Unfortunately Magento 1.3.2.3 - Find real postcode from debugging checkout
    public function saveShippingAction()

        {
            $this->_expireAjax();
            if ($this->getRequest()->isPost()) {
                $data = $this->getRequest()->getPost('shipping', array());
                $customerAddressId = $this->getRequest()->getPost('shipping_address_id', false);
                $result = $this->getOnepage()->saveShipping($data, $customerAddressId);

                $preg_search = '\b([P|p](OST|ost)?\.?\s?[O|o|0](ffice|FFICE)?\.?\s)?([B|b][O|o|0][X|x])\s(\d+)';
                $address = $this->getQuote()->getShippingAddress(); #find real postcode

                if(preg_match($preg_search, $address['postcode']){
                    $result = array(
                            'error' => 1,
                            'message' => Mage::helper('checkout')->__('Invalid PO Box postcode');
                        );
                }
                else{
                        if (!isset($result['error'])) {
                            $result['goto_section'] = 'shipping_method';
                            $result['update_section'] = array(
                                'name' => 'shipping-method',
                                'html' => $this->_getShippingMethodsHtml()
                            );
                        }
                }

                $this->getResponse()->setBody(Zend_Json::encode($result));
            }
        }