26

私にはorderclientエンティティがあります。

実際のSymfony2フォームシステムで、次のことができる注文フォームを作成できるかどうか疑問に思っています。

  1. ドロップダウンから複数のクライアントを選択します(混合collectionentityフォームタイプ)
  2. collectionドロップダウンリストにない場合は、その場で新しいクライアントを作成します(タイプのデフォルトの方法)。

同じページに複数のフォームを作成する方法を見てきましたが、これは私が実現したい方法ではありません。

これを行うためのより良い方法はありますか?

4

5 に答える 5

7

私はあなたの解決につながる可能性のある同様の問題を抱えていました:

カテゴリとアイテムの関係 (多対 1) があり、既存のアイテムを選択するか、新しいアイテムを作成したいと考えていました。

私のフォームクラスでは:

    $builder->add('item', 'entity', array(
        'label' => 'Item',
        'class' => 'ExampleItemBundle:Item',
    ));

    $builder->add('itemNew', new EmbedItemForm(), array(
        'required' => FALSE,
        'mapped' => FALSE,
        'property_path' => 'item',
    ));

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
        $data = $event->getData();
        $form = $event->getForm();

        if (!empty($data['itemNew']['name'])) {
            $form->remove('item');

            $form->add('itemNew', new EmbedItemForm(), array(
                'required' => TRUE,
                'mapped' => TRUE,
                'property_path' => 'item',
            ));
        }
    }); 
于 2015-08-25T13:25:59.210 に答える
3

オプションを使用して、フォーム内の 2 つのフィールドを同じプロパティにマップできproperty_pathます。次に、フォーム イベントを使用して、送信されたデータを使用して決定を下し、フォームを変更して、フィールドの 1 つだけmappedtrue.

于 2014-07-07T12:43:21.077 に答える
1

私が理解した場合、現時点では「オンザフライ」でフォームに新しいクライアントを作成して保存する必要があります。JavaScript を使用してそれを行い、コントローラーに追加のアクションを設定する必要があると思います。

  1. JS -> イベントをキャプチャして、新しいクライアントをデータベースに追加します (つまり、[新規追加] ボタンのクリック イベント)
  2. JS -> このイベント内で、新しいクライアントの値を使用して、AJAX 経由でコントローラーを呼び出します。( FOSJsRoutingBundleを使用すると簡単に実行できます)
  3. Symfony2 -> 新しいアクション内で、新しいクライアントをデータベースに保存します。
  4. JS -> OnSuccess イベント、AJAX 呼び出しで、新しいクライアントを DropDownBox に追加します (ddb.append(new element tag)

新しいクライアントをデータベースに保存し、ドロップダウンボックスに追加するだけです

于 2012-08-03T07:49:14.790 に答える
0

Form タイプでは、属性collectionを使用してオンザフライで追加および削除できます。allow_addallow_delete

詳細については、次の 2 つのリンクを参照してください。

補足フォームを同じページに表示したくない場合は、それらをダイアログ ボックスに統合できます。ただし、新しいアイテムを作成するにはフォームが必要です。

于 2012-04-17T16:14:55.937 に答える