2017-08-18 10 views
0

(ユーザが0、1、2または3を完了することができます)私は3つのフォームのページを持っており、それらはすべてが独立している:同じページに3つのフォームを扱うにはどうすればいいですか?

  • ユーザーが呼ばれることを望んでいる場合は、最初に電話番号を要求します。
  • ユーザーがSMSに連絡したい場合は、2番目の操作は同じです。ユーザーがこの状況に対処するための最良の方法は何解説

を追加したい場合は

  • 第三は、使用されていますか?

    私は私のコントローラに私のコード3回繰り返すべきでしょうか?

    小枝
    public function myPageAction(Request $request) 
    { 
        // First one 
        $form = $this->createFormBuilder() 
        ->add... 
        ->getForm(); 
    
        $form->handleRequest($request); 
    
        if ($form->isSubmitted() && $form->isValid()) { 
        // some code 
        } 
    
        // Second one 
        $form2 = $this->createFormBuilder() 
        ->add... 
        ->getForm(); 
    
        $form2->handleRequest($request); 
    
        if ($form2->isSubmitted() && $form2->isValid()) { 
        // some code 
        } 
    
        // Third one 
        $form3 = $this->createFormBuilder() 
        ->add... 
        ->getForm(); 
    
        $form3->handleRequest($request); 
    
        if ($form3->isSubmitted() && $form3->isValid()) { 
        // some code 
        } 
    } 
    

    そして

    私は、ユーザーがクリックする=最初のもののためのモーダルを持っていると、フォームでのモーダルがポップアップ表示さ:

    このため同じ
    {{ form_start(form) }} 
    {{ form_widget(form) }} 
    {{ form_end(form) }} 
    

    1つ、他のモーダル:

    {{ form_start(form2) }} 
    {{ form_widget(form2) }} 
    {{ form_end(form2) }} 
    

    は三番目は、ページの一番下にある:

    {{ form_start(form3) }} 
    {{ form_widget(form3) }} 
    {{ form_end(form3) }} 
    

    私はそれが多くのコードだと思うし、私はあまり自分自身を繰り返して、私が何を「最適化」することができますか? 私の第一のフォームと第二のフォームが同じであるという事実は、それらを「再グループ化」することができますか?私は "PhoneType"フォームを作成することができますが、コントローラで2回呼び出す以外の方法はありませんか?

    申し訳ありませんが、ここで多くの質問がありますが、このように要約できます:同じページで複数のフォームを処理するベストプラクティスは何ですか?

  • 答えて

    1

    (私のコントローラと私の見解では)私はあなたの目標を達成するための次の方法を参照してください。

    1. 使用化合物の形(グローバルフォーム内の埋め込み形式)、
    2. をマルチのようなものを使用してみてください-stepフォーム、以下を参照してください。動的https://github.com/craue/CraueFormFlowBundle
    3. イベントを使用してフォームを変更します。https://symfony.com/doc/current/form/dynamic_form_modification.html

    しかし、なぜあなたは上のすべてのこれらのフィールドを埋め込むことはできません電子フォーム?唯一の3つのフィールドを分割することは、大砲を使って蜂に射撃するようなものです。私は最も簡単な方法なので、3番目の方法をお勧めします。

    +0

    私は自分の質問を編集しますが、フォームは同時に表示されません。最初のものはモーダル、2番目は同じ、3番目は下にあります。ユーザーは、同じページ上で0,1,2,3のフォームを完成させることができ、それらは互いに依存しません –

    +0

    これらは一度にすべて有効である必要はありません。 – eRIZ

    0

    私は3つのフィールドを持つ1つのフォームを作成する必要がありますと思います。行単位で表示することができます。

    {{ form_row(nameOfRow)}} 
    
    +0

    いいえ、私は質問を編集しますが、それは明らかではないかもしれませんが、私の3つのフォームは「同じ時間に」表示されません。私は2つのモーダル(1番目と2番目のフォーム用)を持ち、3番目はページの最後にあります。だから私はそれぞれを制御する必要があります! –

    0

    フォームは互いに独立している場合は、3つの小枝のfuntions(小枝拡張子)を行うための各フォームがsubmitedハンドル用のテンプレートと3つの異なるアクションコントローラでフォームをレンダリングすることができます。

    小枝拡張

    class FormExtension extends \Twig_Extension{ 
    
        private $formFactory; 
    
        public function __construct(FormFactoryInterface $formFactory) 
        { 
         $this->formFactory = $formFactory; 
        } 
    
        public function getFunctions() 
        { 
         return [ 
          new \Twig_SimpleFunction('get_form_1', array($this, 'getFormOne')), 
          new \Twig_SimpleFunction('get_form_2', array($this, 'getFormtwo')) 
         ]; 
        } 
    
        public function getFormOne() 
        { 
         $form = $this->formFactory->create(FormOneType::class,null,[]); 
    
         return $form->createView(); 
        } 
    
        public function getFormTwo() 
        { 
         $form = $this->formFactory->create(FormTwoType::class,null,[]); 
    
         return $form->createView(); 
        } 
    
    } 
    

    template.html.twig

    {% if formOne is not defined %} 
        {% set formOne = get_form_1() %} 
    {% endif %} 
    {{ form_start(formOne, {'action': path('route_handle_form_1')) }} 
    {{ form_row(formOne.field1) }} 
    {{ form_row(formOne.field2) }} 
    {{ form_row(formOne._token) }} 
    {{ form_end(formOne) }} 
    
    {% if formTwo is not defined %} 
        {% set formTwo = get_form_2() %} 
    {% endif %} 
    {{ form_start(formTwo , {'action': path('route_handle_form_2')) }} 
    {{ form_row(formTwo.field1) }} 
    {{ form_row(formTwo.field2) }} 
    {{ form_row(formTwo._token) }} 
    {{ form_end(formTwo) }} 
    

    コントローラ

    class FormController extends Controller{ 
    
    
    /** 
    * @Route("/form-1", name="route_handle_form_1") 
    * @Method("POST") 
    */ 
    public function handleFormOneAction(Request $request) 
    { 
        $form = $this->formFactory->create(FormOneType::class,null,[]); 
        $form->handleRequest($request); 
    
        if ($form->isValid()) { 
         //do some action, persist object... 
         //create a flashbag 
         //redirect to some page 
        } 
        return $this->render("template.html.twig",array(
         'formOne' => $form->createView(), 
        )); 
    } 
    
    /** 
    * @Route("/form-2", name="route_handle_form_2") 
    * @Method("POST") 
    */ 
    public function handleFormTwoAction(Request $request) 
    { 
        $form = $this->formFactory->create(FormTwoType::class,null,[]); 
        $form->handleRequest($request); 
    
        if ($form->isValid()) { 
         //do some action, persist object... 
         //create a flashbag 
         //redirect to some page 
    
        } 
        return $this->render("template.html.twig",array(
         'formTwo' => $form->createView(), 
        )); 
    } 
    
    } 
    

    私はすべてのテンプレートで3つのフォームを使いたいと思うので、私はあなたがそれを必要としない場合は、twigの拡張を避け、ページをレンダリングするコントローラで3つのフォームフォームです

    関連する問題