簡體   English   中英

使用Zend Framework驗證多個可選表單字段

[英]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);
  }

}
?>

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類的解決方案,但是如果有人知道的話,我想有更好的解決方案。

簡而言之 - 如何驗證某些表單,強制用戶填寫幾個可選字段中的至少一個?

如果我理解正確,您希望不需要表單元素,但是使用自定義驗證器阻止它們為空(除非其中一個不為空)? 然后,為了不跳過驗證鏈,您需要在每個元素中調用方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM