我试图验证Zend_Form的有哪几种可选字段,我希望他们中至少一个被填充。对我来说,我有手机,家庭和办公室的电话号码,我想提供它们中的至少一个。
我试图做到这一点,虽然校验上下文(如建议在这里通过创建延伸Zend_Validate_Abstract来定制的验证)。 问题是,如果所有可选字段都是空的,他们是从形式$语境缺失(传递给验证器类),并通过这种方式不进行验证的。 所以,如果您填写的三个选项(移动,家庭,工作),他们都将被验证的一项或若干项(这是好的,但对于这个不需要自定义验证),但如果你填写他们没有,有没有选项强制客户满山遍野的至少一个(这是我的目标)。
以下是我有:
1.我的表格
<?php
class Application_Form_Application extends Zend_Form {
public function init() {
$this->setName('application');
// attach sub forms to main form
$this->addSubForms(array(
'application' => $this->application(),
...
));
}
private function application() {
$application = new Zend_Form_SubForm();
// custom phone validation
$phone_validation = array('phone_mobile' => 'Mobile', 'phone_home' => 'Home', 'phone_work' => 'Work');
// phone mobile
$app['phone_mobile'] = new Zend_Form_Element_Text('phone_mobile');
$app['phone_mobile']->setLabel('Mobile')
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('Regex', false, array('/^[0-9]{8}$/i'))
->addValidator(new Application_Form_PhoneMobileHomeWork($phone_validation), false);
// phone home
$app['phone_home'] = new Zend_Form_Element_Text('phone_home');
$app['phone_home']->setLabel('Home')
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('Regex', false, array('/^[0-9]{8}$/i'))
->addValidator(new Application_Form_PhoneMobileHomeWork($phone_validation), false);
// phone work
$app['phone_work'] = new Zend_Form_Element_Text('phone_work');
$app['phone_work']->setLabel('Work')
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('Regex', false, array('/^[0-9]{8}$/i'))
->addValidator(new Application_Form_PhoneMobileHomeWork($phone_validation), false);
$application->AddElements($app);
}
}
?>
2.自定义的验证
<?php
class Application_Form_PhoneMobileHomeWork extends Zend_Validate_Abstract {
const NOT_PRESENT = 'notPresent';
protected $_messageTemplates = array(
self::NOT_PRESENT => 'At least one contact phone shall be provided!'
);
protected $_listOfFields;
public function __construct(array $listOfFields) {
$this->_listOfFields = $listOfFields;
var_dump($listOfFields);exit;
}
public function isValid($value, $context = null) {
var_dump($context);exit;
...
}
?>
验证总是通过,虽然第一转储($ listOfFields),但如果我删除它,isValid()的永远不会被调用,除非一些数据被输入到一些手机领域(我们要防止)的。
当我进一步检查我发现了一个解决方案,通过传递空字段到$上下文参数扩展Zend_Validate的类,但我想有一个更好的解决方案,如果有人知道任何。
总之结论是 - 如何验证某些形式,迫使用户填写至少一个出几个可选字段?