1

サブフォームが特定の状況でのみ必要となる Zend_Form があります。親フォームとサブフォームの両方に必須フィールドがあります。サブフォームは常に満たされるとは限りませんが、その要素のいずれかが満たされている場合、それらはすべて満たされるべきです。

<?php
class Cred extends Zend_Form
{

  public function init()
  {
    $title = new Zend_Form_Element_Text('Title');
    $title->setLabel('Title')
        ->setRequired(TRUE);
    $this->addElement($title);

    $award = new Zend_Form_Element_Text('Awarded');
    $award->setLabel('Awarded On')
        ->setRequired(TRUE)
        ->addValidator('date');
    $this->addElement($award);

    $subform = new Zend_Form_SubForm();

    $proof = new Zend_Form_Element_File('Documentation');
    $proof->setLabel('Documentation')
        ->setRequired(TRUE)
        ->addValidator('Size', false, 409600) // limit to 400K
        ->addValidator('Extension', false, 'pdf');
    $subform->addElement($proof);

    $lang = new Zend_Form_Element_Select('Language');
    $lang->setLabel('Language')->setRequired(TRUE);
    $subform->addElement($lang);

    $this->addSubForm($subform,'importForm');

    $submit = new  Zend_Form_Element_Submit('submitForm');
    $submit->setLabel('Save');
    $this->addElement($submit);


    $this->setAction('/cred/save')
        ->setMethod('post')
        ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
  }

}

を呼び出すと$form->isValid($_POST)、親フォームとサブフォームの両方が検証され、サブフォーム自体が不要な場合でもサブフォームの必須要素が空の場合はエラーが返されます。

関数をオーバーロードする以外isValid()に、親フォームのみを検証する方法はありますか?

4

1 に答える 1

0

Zend_Form の isValid() メソッドのソース コードを調べると、サブフォームでのバリデータの実行を防止する明示的なメカニズムがないことがわかります (2273 行目以降)。

とにかく、「サブフォームは常に満たされるとは限りませんが、その要素のいずれかが満たされると、すべてが満たされる必要があります。」という要件を理解していれば、あなたの問題は必ずしもサブフォーム自体と関係があるとは限りません。むしろ条件付き検証を使用します。これは、カスタム バリデータで簡単に解決できます: Zend_Form_Element_File または Zend_Form_Element_Text のいずれかが空でないことを検証する方法。

$contextの要素にはサブフォーム要素のみが含まれていることに注意してください。

于 2014-01-05T15:50:31.720 に答える