2009-12-29 38 views
2

如何将多个表单元素合并到一个验证器中?我有包括地址信息如何将多个元素组合到一个验证器中?

  • 街道地址
  • 邮政编码
  • 邮局

如果我添加验证他们每个人作为streetValidator,zipCodeValidator,postOfficeValidator我结束了问题:在某处可以有foostreet(验证可以),10101某处(验证也可以)以及barOffice在某处(验证也可以)。但所有的地址信息结合起来,没有地址“foostreet,10101,barOffice”。

现在您有:

<?php 
$f = new Zend_Form(); 

$street = new Zend_Form_Element_Text('street'); 
$f->addElement($street); 

$zip = new Zend_Form_Element_Text('zip'); 
$f->addElement($zip); 

$office = new Zend_Form_Element_Text('office'); 
$f->addElement($office); 

但它应该是:

$f = new Zend_Form(); 
// All three fields are still seperated 
$address = new My_Address_Fields(); 
$address->addValidator(new addressValidator()); 
$f->addElement($address); 

验证是一样的东西

class addressValidator extends Zend_Validator_Abstract 
{ 
    public function isValid() 
    { 
    //$street = ???; 
    //$zip = ???; 
    //$office = ???; 

    // XMLRPC client which does the actual check 
    $v = new checkAddress($street, $zip, $office); 
    return (bool)$v->isValid(); 
    } 
} 
+0

我想这是关于如何创建MyAddressField导致问题的部分。你必须为你的装饰器创建一个复合的表单元素。看看[这个](http://weierophinney.net/matthew/archives/212-The-simplest-Zend_Form-decorator.html)[系列](http://weierophinney.net/matthew/archives/213-From- [articles](http://weierophinney.net/matthew/archives/217-Creating-composite-elements.html#extended)[在表单装饰器上]的[inside-out-How-to-layer-decorators.html) (http://devzone.zend.com/article/3450)。特别是链接为'articles'的文章,应该让你进入 – Gordon 2009-12-29 10:59:04

回答

1

当验证一个表单元素,验证给出所有形式值,在$context参数内河所以,你的验证器是这个样子:

public function isValid($value, $context = null) 
    { 
    $street = (isset($context['street']))? $context['street'] : null; 
    $zip = (isset($context['zip']))? $context['zip'] : null; 
    $office = (isset($context['office']))? $context['office'] : null; 

    // XMLRPC client which does the actual check 
    $v = new checkAddress($street, $zip, $office); 
    return (bool)$v->isValid(); 
    } 

然后,验证添加到您的street元素,说。

缺点:这个验证器是一个有点独立,附加到一个特定的元素,但不是真的。

优点:它会工作。

+0

因为没有'Zend_Validate_Abstract :: __ construct()'需要注意,所以可以使用该方法进行映射,即'Your_Validate :: __ construct($ mapping = array())'这将会像'$ mapping ['streetElementId'] ='street''这样的方法'Your_Validate :: isValid()'会知道哪些规则来验证每个元素。 – chelmertz 2010-01-05 09:17:54

相关问题