2011-03-11 95 views
2

目前我正在使用Zend框架在網站上開發。需要幫助Zend表單驗證

我需要制定一個類似這裏找到位置字段:http://www.truelocal.com.au/

允許用戶輸入郵編值(由4個號碼)或郊區名稱

我被困在此刻在Zend表格驗證部分

基本上我需要確保郵政編碼值或郊區名稱存在於數據庫中。

我可以很容易地使用Zend_Validate_Db_RecordExists來檢查郵編是否存在於我的數據庫中。

$validator = new Zend_Validate_Db_RecordExists('postcodeTable', 'postcode'); 

但我怎麼也添加其他郊區名驗證檢查,如果郊區名稱存在於數據庫中(不與郵編驗證檢查相沖突)?

是否有一個明確和簡單的方法來實現這一目標?

我是否需要編寫自定義驗證程序?如果是這樣,我該怎麼做?

非常感謝提前:)

回答

1

我不認爲你可以別名驗證一樣可以裝飾,但你可以擴展Zend_Validate_Db_RecordExists,例如:

class App_Validate_Db_SuburbExists 
    extends Zend_Validate_Db_RecordExists 
{ 

} 

不要忘記將你的庫的驗證器prefixPath添加到元素,例如

$element->addPrefixPath('App_Validate_Db', 'App/Validate/Db', 'validate'); 

然後,您可以添加兩個驗證器與不同的選項。

$element->addValidator(
      new App_Validate_Db_SuburbExists('suburbTable', 'suburb')) 

     ->addValidator(
      new Zend_Validate_Db_RecordExists('postcodeTable', 'postcode')); 
+0

如果要添加驗證程序的具體實例,則可能不需要設置前綴路徑。但如果你想懶加載驗證器,那麼你將不得不提供路徑。 – gawpertron 2011-03-11 21:56:24

0

我想自定義驗證的這只是一個代理

像subvalidators這

$proxyValidator = new App_Validate_Proxy(); //implements Zend_Validate_Interface 
$proxyValidator->addValidator($validateDb1); 
$proxyValidator->addValidator($validateDb2); 

至少一個必須返回true考慮價值爲有效

$ proxyValidator :: isValid():

public function isValid($value) 
{ 
    foreach($this->_validators as $validator) { 
     $validator->isValid($value) ? return true : $this->_messages[] = $validator->getMessages(); 
    } 
    return false; 
}