2

ZF2フォームとDoctrineModuleハイドレーターを使用して、単純なCRUDシステムでエンティティを作成/更新するZF2アプリケーションに取り組んでいます。Zend\Form\Element\Collectionエンティティ (Union) は別のエンティティ (Team) との Doctrine OneToMany 関連付けを持っており、その関連付けはフォーム サイトの で表されます。新しいエンティティを作成するとき、またはフォームを使用して既存のエンティティを更新するときに、既存のエンティティの関連付けコレクションを空にするという 1 つのケースを除いて、すべてが問題なく動作します。コレクションのすべての要素を削除して [保存] をクリックすると、フォームが跳ね返され、コレクションの既存の各要素にエラーが表示されますValue is required and can't be empty

問題を示すビデオ: http://youtu.be/3ucRb6X61c8

コード:

問題は InputFilter に要約されるようですが、何が問題なのかを正確に突き止めることはできません。コレクションの N 個のエントリのうち (N-1) 個まで削除すると問題なく動作するため、InputFilter 構造自体には問題はありません。おそらく、POST されたコレクションが空の場合、コレクションZend\Formの各要素に割り当てられた既存の NotEmpty バリデーターを削除しないのteamsでしょうか?

Union フィールドセットにはカスタム入力フィルターが用意されていますが (こちらを参照teams)、コレクション要素には入力がリストされていません。また、カスタム InputFilter を完全に削除することと、teamsコレクションに適切な InputFilter 定義を追加することの両方を試みましたが、最終結果は同じです。

私がここで間違っていることについて何か洞察を持っている人はいますか?

4

2 に答える 2

1

これを回避するために、フォーム POST を受け取るコントローラーを更新して、クライアント側からコレクションが空になったことを検出し、エンティティのコレクションを手動で空にしました。

if ( !isset($data['union']['teams']) || empty($data['union']['teams']) ) {
    $entity->removeTeams($entity->getTeams());
}
于 2014-06-24T02:51:28.873 に答える
0

TeamFieldset実装を試してZend\InputFilter\InputFilterProviderInterfaceから、次のメソッドをフィールドセットに追加してください。

public function getInputFilterSpecification()
{
    return array(
        'id' => array(
            'required' => false,
        )
    );
}

変更TeamFieldset: https://gist.github.com/anonymous/08bf222baa5c250b4614

于 2014-04-16T23:29:43.620 に答える