4

いくつかのオプションフィールドがある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つを入力させる方法は?

4

2 に答える 2

1

問題は、いずれかのフィールドが入力されている場合、フォームに multi_checkbox 要素が存在せず、検証されないことです。

1つの解決策は次のとおりです。常にチェックされている非表示のオプションを使用し、これが常にチェックされていることを検証します。

于 2013-03-27T10:07:42.890 に答える
1

私があなたを正しく理解していれば、カスタムバリデーターを使用して、フォーム要素を必須にせずに(そのうちの1つが空でない場合を除いて)空にならないようにしたいですか? 次に、検証チェーンをスキップしないためにsetAllowEmpty(false)、各要素でメソッドを呼び出してそれらが空になるのを防ぐ必要があります。

最後に、カスタム バリデータでは、次のようになります。

foreach ($this->_listOfFields as $field) {
    if (isset($context[$field]) AND $context[$field])
    {
        return true;
    }
}

また、要素が必須でないことを確認してください ( setRequired(false))。

于 2012-04-16T09:24:11.093 に答える