3

Zend Framework 2フォームを送信して検証するときに、奇妙な動作が発生します。意味を示すためにフォームを3つの要素に切り詰めましたが、他の要素にも問題があります。

私には2つの要素があります。電子メールと性別。フォームにを指定していないInputFilterので、ロジックはフォームが有効になることを示しています。ただし、フォームを送信して検証チェックを行うと、電子メールと性別の要素でValue is required and can't be emptyエラーが発生します。ただし、それらが必須であり、空にすることはできないと明示的には述べていません。

私の電子メール要素はそのタイプであり、それと関係があるのZend\Form\Element\Emailではないかと思います。これをに変更するとZend\Form\Element\Text、すべてが正常になるからです。しかし、必須ではない電子メールフィールドが必要な場合はどうなりますか?

次に、性別選択要素で同じエラーが発生します。空のオプションを設定しましたが、これは「性別を選択」などのデフォルト値を使用するためだけのものだと思いましたが、必要な制約は追加されていません。この空のオプションを削除しても、このエラーは発生しないようです。このエラーについても非常に奇妙なのは、性別を選択せず​​にフォームを送信すると、ポストバックのドロップダウンで別のオプションが選択されることです。この場合、空のオプション(「性別を選択」)を使用してフォームを送信していますが、フォームが更新されると、選択したオプションが「女性」に変わります。「女性」オプションの値は0ですが、たとえば値を3に変更すると、正常に機能します。しかし、オプションの1つで値を0にする必要がある場合はどうなりますか?多分それ' ■型変換などが原因です。本当にわかりません。

以下は私のコードです。わかりやすいようにコメントを書きました。

フォームクラスの抜粋:

// E-mail (generates "Value is required and can't be empty" - but what if the field should be optional? Where is this validator added?
        $email = new Element\Email('email'); // If I change to "Element\Text", there are no problems
        $email->setLabel('E-mail address');

        $email->setLabelAttributes(array(
                                        'for' => $email->getName(),
                                        'class' => 'some class'
                                   ));

        $email->setAttributes(array(
                                   'id' => $email->getName(),
                                   'placeholder' => 'E.g. andy@gmail.com',
                                   'class' => 'some class'
                              ));

// Gender dropdown (generates "Value is required and can't be empty error")
        $gender = new Element\Select('gender');
        $gender->setLabel('Gender');
        $gender->setEmptyOption('Choose your gender'); // Remove this and the error disappears

        $gender->setLabelAttributes(array(
                                    'for' => $gender->getName(),
                                    'class' => 'some class'
                               ));

        $gender->setAttributes(array(
                                    'id' => $gender->getName(),
                                    'class' => 'some class'
                               ));

        $gender->setValueOptions(array(
                                      '1' => 'Male',
                                      '0' => 'Female' // This is selected on postback when the empty option is selected. If I change the value to 3, for instance, it works fine
                                 ));

$this->add($email);
        $this->add($gender);

コントローラ:

public function registerAction() {
        $registerForm = new RegisterForm();
        $request = $this->getRequest();

        if ($request->isPost()) {
            $registerForm->setData($request->getPost());

            if ($registerForm->isValid()) {
                // Nothing here yet
            }

        }

        return new ViewModel(array('form' => $registerForm));
    }

スクリプトの抜粋を表示:

$form = $this->form;
$email = $form->get('email');
$gender = $form->get('gender');

// E-mail
echo $this->formLabel()->openTag($email) . $email->getLabel() . $this->formLabel()->closeTag();
echo $this->formInput($email);
echo $this->formElementErrors($email);

// Gender
echo $this->formLabel()->openTag($gender) . $gender->getLabel() . $this->formLabel()->closeTag();
echo $this->formSelect($gender);
echo $this->formElementErrors($gender);

問題を十分に説明できなかったことをお詫びしますが、私にはとても奇妙に思えるので、説明するのは本当に難しいです。ドキュメントを調べましたが、有用なものは見つかりませんでした(ZF2ドキュメントはまだかなり貧弱だと思います)。

4

4 に答える 4

4

次のように、フォーム コンストラクターの最後に配置することもできます。

public function __construct($name = 'user') {
   ...
   $this->getInputFilter()->get('first_name')->setRequired(false);
}
于 2013-12-30T16:52:05.537 に答える
1

必須のようなデフォルトのバリデーターがあると思います。

やってみました:

->setAllowEmpty(false)

また

->setRequired(false)

この他のそう質問から。

于 2012-11-28T23:11:12.190 に答える
0

上記の方法のいずれも機能しなかったため、この問題に対する回答を投稿します。

次のようにバリデータを追加します。

@Form\Validator({"name":"NotEmpty", "options":{"type":"string"}})

「0」と「1」の両方の値で機能します

于 2016-06-28T07:40:56.803 に答える