在Zend form Validation方面需要帮助

时间:2011-03-11 18:00:39

标签: zend-framework forms

目前正在使用Zend框架在网站上开发。

我需要开发一个类似于此处的位置字段:http://www.truelocal.com.au/

允许用户输入PostCode值(由4个数字组成)或郊区名称

我目前在Zend表单验证部分中停留了

基本上我需要确保数据库中存在邮政编码值或郊区名称。

我可以轻松地使用Zend_Validate_Db_RecordExists检查我的数据库中是否存在邮政编码。

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

但是我怎样才能添加另一个郊区名称Validation以检查数据库中是否存在郊区名称(不与邮政编码验证检查冲突)?

有没有明确而简单的方法来实现这一目标?

我是否需要编写自定义验证器?如果是这样我该怎么办?

事先非常感谢:)

2 个答案:

答案 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;
}