目前正在使用Zend框架在网站上开发。
我需要开发一个类似于此处的位置字段:http://www.truelocal.com.au/
允许用户输入PostCode值(由4个数字组成)或郊区名称
我目前在Zend表单验证部分中停留了
基本上我需要确保数据库中存在邮政编码值或郊区名称。
我可以轻松地使用Zend_Validate_Db_RecordExists
检查我的数据库中是否存在邮政编码。
$validator = new Zend_Validate_Db_RecordExists('postcodeTable', 'postcode');
但是我怎样才能添加另一个郊区名称Validation以检查数据库中是否存在郊区名称(不与邮政编码验证检查冲突)?
有没有明确而简单的方法来实现这一目标?
我是否需要编写自定义验证器?如果是这样我该怎么办?
事先非常感谢:)
答案 0 :(得分:1)
我不认为你可以使用别名验证器,就像装饰器一样,但你可以扩展Zend_Validate_Db_RecordExists,例如:
class App_Validate_Db_SuburbExists
extends Zend_Validate_Db_RecordExists
{
}
不要忘记将库的验证器前缀路径添加到元素中,例如
$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'));
答案 1 :(得分:0)
我认为自定义验证器只是一个代理
类似这样的事情
$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;
}