3

私は使用してAnnotationFormsおり、チュートリアルの標準の編集アクションを変更して、標準のフォームではなく注釈を使用するようにしました。

$form->bind()値が入力されないことを除いて、すべてが機能します。フォーム フィールドは空のままです。

バインドする必要がある変数を確認しましたが、設定されていて見栄えがします。

これが私の行動です:

    $id = (int)$this->getEvent()->getRouteMatch()->getParam('id');
    if (!$id) {
        return $this->redirect()->toRoute('album', array('action'=>'add'));
    }
    $album = $this->getEntityManager()->find('Album\Entity\Album', $id);

    $builder = new AnnotationBuilder();
    $form    = $builder->createForm(new \Album\Entity\Album());
    $form->add(new \MyVendor\Form\MyFieldset());
    $form->setBindOnValidate(false);
    $form->bind($album);
4

2 に答える 2

2

よし、これは簡単だった!

トリックは、オブジェクトを配列に変換し、setData()バインドの代わりに使用することです。

ここで解決策のヒントを見つけました。

bind()変更を保存する必要があります。省略してもエラーにはなりませんが、保存もされません。

 $album = $this->getEntityManager()->find('Album\Entity\Album', $id);
 ...
 $form->bind($album);
 $form->setData($album->getArrayCopy());
于 2012-12-24T09:28:50.173 に答える
2

ハイドレーターはバインド時に実際に機能しますClassMethodsが、フォーム要素名は小文字アンダースコア形式に一致する必要があります (例: object property $moduleDisplayNameClassMethodsおよびObjectPropertyハイドレーターはフォーム要素 Name を期待します) module_display_name

Zend\Form\Annotationデフォルトでは、 は という名前のフォーム要素を生成しますmoduleDisplayName。したがって、フォームへのオブジェクトの抽出は機能しません。

@Name解決策 1: 機能するように、注釈をプロパティに追加しますClassMethods

例:

/**
* @Form\Name("module_display_name")
protected $moduleDisplayName

解決策 2:ClassMethodsオプションのパラメーターunderScoreSeperatedKeysfalse(デフォルトはtrue) に設定するか、 を使用してハイドレーターをインスタンス化しますClassMethods::setUnderScoreSeperatedKeys(false)。その後ClassMethods、他のハイドレーターと同じように動作します。

ハイドレーターは、ObjectProperty宣言されたプロパティでのみ機能しますpublicArraySerializableただし、名前付けは(プロパティ$moduleDisplayName、フォーム要素 Nameなど)と同じmoduleDisplayNameです。

ハイドレーターはすべてのReflectionプロパティで機能します。ネーミングは と同じArraySerializableです。

結論:ClassMethodsは、異なるフォーム要素の命名スキームを期待する 4 つのハイドレーターのうちの 1 つです。クールすぎない。

于 2013-10-27T20:52:09.170 に答える