[英]Validating multiple optional form fields with Zend Framework
我正在嘗試驗證Zend_Form,它有幾個可選字段,我想要至少填寫其中一個。在我的情況下,我有手機,家庭和辦公室電話號碼,我想要至少提供其中一個。
我試圖做到這一點,雖然校驗上下文(如建議在這里通過創建延伸Zend_Validate_Abstract來定制的驗證)。 問題是,如果所有可選字段都為空,則表單$ context(傳遞給驗證器類)中缺少這些字段,這種方式根本沒有驗證。 因此,如果你填寫三個選項中的任何一個或幾個(移動,家庭,工作),他們都將被驗證(這很好,但為此不需要自定義驗證器),但如果你沒有填寫它們,那么沒有選擇強迫客戶填寫至少一個字段(這是我的目標)。
這是我有的:
<?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);
}
}
?>
<?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類的解決方案,但是如果有人知道的話,我想有更好的解決方案。
簡而言之 - 如何驗證某些表單,強制用戶填寫幾個可選字段中的至少一個?
如果我理解正確,您希望不需要表單元素,但是使用自定義驗證器阻止它們為空(除非其中一個不為空)? 然后,為了不跳過驗證鏈,您需要在每個元素中調用方法setAllowEmpty(false)
來阻止它們為空。
最后,在您的自定義驗證器中,您將得到以下內容:
foreach ($this->_listOfFields as $field) {
if (isset($context[$field]) AND $context[$field])
{
return true;
}
}
另外,請確保您的元素不是必需的( setRequired(false)
)。
問題是如果填寫了任何字段,表單中不存在multi_checkbox元素,那么它將不會被驗證。
一個解決方案如下:使用始終檢查的隱藏選項,並驗證是否始終檢查此更多其他選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.