2

次のような注釈ビルダーを使用して作成したフォームがあります。

$builder  = new AnnotationBuilder();
$fieldset = $builder->createForm(new \Application\Entity\Example());  
$this->add($fieldset);
$this->setBaseFieldset($fieldset);

コントローラでは、すべてが標準です。

$entity = new \Application\Entity\Example();
$form = new \Application\Form\Example();
$form->bind($entity);
if($this->getRequest()->isPost()) {
    $form->setData($this->getRequest()->getPost());
    if($form->isValid()) {
        // save ....
    }
}

問題は、空のフォームまたは無効なフォームが送信された場合でも、$ form-> isValid()が常にtrueを返すことです。さらに奇妙なのは、フォーム要素のエラーメッセージがすべて設定されており、それらが無効であることを示唆していることです。

ZF2 Form / InputFilter / Inputクラスを調べたところ、次のことがわかりました。Input-> isValid()が2回呼び出されます。1回はForm-> isValid()で、もう1回はForm-> bindValues()で呼び出されます。 Input-> isValid()($ this-> getValidatorChain)のバリデーターチェーンは空であり、(bindValuesからの)2番目の呼び出しでは正しいです。

何がうまくいかなかったのでしょうか?

PS。develバージョン2.1を使用する

4

2 に答える 2

1

何が原因か分かった。

注釈ビルダーは、このように動作することを意図していなかったことが判明しました。アノテーション ビルダは \Zend\Form\Form インスタンスを作成し、これをフィールドセットとしてベース フォームに配置しました。理由はわかりませんが、これが原因で基本フォームが検証されませんでした。したがって、上記のコードを機能させるためには、追加の Form クラスはなく、コントローラーには次のものが必要です。

$entity = new \Application\Entity\Example();
$builder  = new AnnotationBuilder();
$form = $builder->createForm($entity);  
$form->bind($entity);
if($this->getRequest()->isPost()) {
    $form->setData($this->getRequest()->getPost());
    if($form->isValid()) {
        // save ....
    }
}

将来的には AnnotationBuilder に createFieldset 関数が追加されるかもしれませんが、現時点ではこれが唯一の方法のようです。これが誰かに役立つことを願っています。:)

于 2012-12-15T13:27:44.710 に答える
0

私も同じ問題を経験しています。アノテーションを使用してフィールドセット@Annotation\Type("fieldset")をフォームに作成すると、isValid()は常に true を返します。

Zend\Form\Factoryのコードを見ると、Fieldset を作成しているときに、configureFieldset()関数は、フォーム仕様の一部として input_filterがある場合でも、prepareAndInjectInputFilter()を呼び出しません。

フォームを作成するときのみ、Zend\Form\Factory::configureForm()関数がprepareAndInjectInputFilter()を呼び出します。

したがって、入力フィルターと検証グループは、フォームを作成するようにタイプが設定されている場合にのみ AnnotationBuilder によって作成されるようです。

以下のコードをフォームに追加して、注釈から自分で入力フィルターを作成しました。

    $fspec = ArrayUtils::iteratorToArray($builder->getFormSpecification($entity));
    $outerfilter = new InputFilter();
    $iffactory = new \Zend\InputFilter\Factory ();
    $filter  = $iffactory->createInputFilter($fspec['input_filter']);
    $outerfilter->add($filter, 'shop');  // Use the name of your fieldset here.
    $this->setInputFilter($outerfilter);
于 2014-08-04T22:50:10.933 に答える