2011-03-11 98 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; 
}