2011-12-05 55 views
3

我想阻止客戶將郵政信箱輸入到所選送貨方式(本例中爲UPS)的送貨地址。我可以覆蓋js/prototype/validation.js插入一個新的驗證模式,但我不想分叉這樣的密鑰文件。如何悄悄地將新的驗證方法添加到Magento結帳

有沒有一種機制來悄悄地驗證客戶的送貨地址後,他們選擇通過Javascript的運輸方法,而不覆蓋核心文件?

我看到在validation.js裏使用Validation.add,所以有可能在覈心文件之外添加一個新的驗證方法?

,我想申請的正則表達式是

\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請求重定向回觀察員如果需要的話,請寄到送貨地址表。

回答

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+)/ 
}); 
+0

不錯。很高興看到它的澳大利亞貢獻! :) –

+0

輝煌的答案。通過這種方法,我希望爲英國郵政編碼添加一個正則表達式,但似乎你在一個字段上不能有多個validate-class,所以我有一個'alert'框,而只有當該國是英國時才觸發。我使用的正則表達式來自維基百科郵政編碼頁面,如果從結尾沒有一個3個字符並將其重新拼接,我會拼接一個空格。 –

+0

回覆:「只有一個領域的驗證級」。我不知道這一點,將不得不進一步調查。 – clockworkgeek

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)); 
      } 
     }