いくつかのオプションフィールドがあるZend_Formを検証しようとしていますが、そのうちの少なくとも1つを入力する必要があります。私の場合、携帯電話、自宅、オフィスの電話番号があり、少なくとも1つを提供する必要があります。
Zend_Validate_Abstractを拡張するカスタムバリデーターを作成することにより、検証コンテキスト(ここで提案されている)を介してこれを達成しようとしています。問題は、すべてのオプションのフィールドが空の場合、それらはフォーム$ context(バリデータークラスに渡される)から欠落しており、この方法ではまったく検証されないことです。したがって、3つのオプション(モバイル、自宅、職場)のいずれかまたはいくつかを入力すると、すべて検証されます(これは問題ありませんが、カスタム検証ツールは必要ありません)が、いずれも入力しない場合は、顧客に少なくとも1つのフィールドに入力するように強制するオプションはありません(これが私の目標です)。
これが私が持っているものです:
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()は呼び出されません(これは防止したい)。
さらに調べてみると、空のフィールドを$ contextパラメーターに渡すことでZend_Validateクラスを拡張する解決策が見つかりましたが、誰かが知っている場合は、より良い解決策が必要です。
簡単に言えば、特定のフォームを検証し、ユーザーにいくつかのオプションフィールドから少なくとも1つを入力させる方法は?