2013-08-21 9 views
6

私はSymfony2で非常に簡単なフォーラムを作成しようとしています。Symfony2で2つのフォームをマージするには

私のエンティティは以下のとおりです。 ForumCategory(名前、説明...) ForumTopic(CATEGORY_ID、タイトル) ForumPost(isFirstPost、ボディ、topic_id、AUTHOR_ID ...)

ユーザーが作成しようとするとトピック、トピックと最初の投稿メッセージを作成するために、同じページに1つのフォームしか表示しません。同様に:

  • 挿入トピックのタイトル:...
  • 挿入話題本体(関連ポスト本体):...

[...]

私がいることをどのように行うことができます?この場合、2つのフォームをマージすることは可能ですか?

答えて

12

両方のサブフォームを含むフォームタイプを作成します。お使いのコントローラで

class MergedFormType 

    $builder->add('topic', new TopicFormType()); 
    $builder->add('post', new PostFormType()); 

あなたは多くの1つまたは1対1の関係を持つ2つのエンティティのためのフォームをマージするために探している場合だけMergedFormType

包みなさい
public function myAction() 

    $formData['topic'] = $topic; 
    $formData['post'] = $post; 

    $form = $this->createForm(new MergedFormType(), $formData); 
+0

私はこれをやったが、私はフィールドを送信すると "このフォームは余分なフィールドを含めることはできません" というエラーを取得しています入れ子になったフォームの1つにあります。何か案は? – StampyCode

+1

symfony/form 3を使用しています。* MergedFormTypeの '' string ''型のExpected argumentを取得しました。任意のアイデアをどのようにこれを解決するには? – Keloo

+0

文書をチェックしましたか? S3では、フォームタイプのインスタンスの受け渡しはサポートされなくなりました。いくつかの重要なフォームの変更の1つ。 – Cerad

0

ます。また、複数のマージされた形と同じエンティティをマッピングすることができます。タスクエンティティは、多くのタグを持っている

class TaskType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('description'); 

     $builder->add('tags', 'collection', array('type' => new TagType())); 
    } 

レンダリングは、このよう

{{ form_start(form) }} 
    <h3>Tags</h3> 
    <ul class="tags"> 
     {# iterate over each existing tag and render its only field: name #} 
     {% for tag in form.tags %} 
      <li>{{ form_row(tag.name) }}</li> 
     {% endfor %} 
    </ul> 

さらに詳細に行うことができます。

$entity = new Form(); 

    $form = $this->get('form.factory')->create(FormType::class, [ 
     'form_builder' => $entity, 
     'submit_builder' => $entity, 
    ]); 

FormType.php

<?php 

namespace GenyBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use GenyBundle\Entity\Form; 

class FormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('form_builder', FormBuilderType::class, [ 
       'data_class' => Form::class, 
       'label' => false, // Important! 
      ]) 
      ->add('submit_builder', SubmitBuilderType::class, [ 
       'data_class' => Form::class, 
       'label' => false, 
      ]) 
      ->add('save', Type\SubmitType::class, [ 
       'label' => 'geny.type.form.save.label', 
      ]) 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'translation_domain' => 'geny', 
     ]); 
    } 
} 

FormBuilderType.php

<?php 

namespace GenyBundle\Form\Type; 

use GenyBundle\Base\BaseType; 
use Symfony\Component\Form\Extension\Core\Type; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class FormBuilderType extends BaseType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('title', Type\TextType::class, [ 
       'attr' => [ 
        'placeholder' => 'geny.type.form.title.placeholder', 
       ], 
       'empty_data' => $this->get('translator')->trans('geny.type.form.title.default', [], 'geny'), 
       'label' => 'geny.type.form.title.label', 
       'required' => true, 
      ]) 
      ->add('description', Type\TextareaType::class, [ 
       'attr' => [ 
        'placeholder' => 'geny.type.form.description.placeholder', 
       ], 
       'empty_data' => null, 
       'label' => 'geny.type.form.description.label', 
       'required' => false, 
      ]) 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'GenyBundle\Entity\Form', 
      'translation_domain' => 'geny', 
     ]); 
    } 
} 

SubmitBuilderType.php

<?php 

namespace GenyBundle\Form\Type; 

use GenyBundle\Base\BaseType; 
use Symfony\Component\Form\Extension\Core\Type; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class SubmitBuilderType extends BaseType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('submit', Type\TextType::class, [ 
       'attr' => [ 
        'placeholder' => 'geny.type.submit.submit.placeholder', 
       ], 
       'empty_data' => $this->get('translator')->trans('geny.type.submit.submit.default', [], 'geny'), 
       'label' => 'geny.type.submit.submit.label', 
       'required' => true, 
      ]) 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'GenyBundle\Entity\Form', 
      'translation_domain' => 'geny', 
     ]); 
    } 
} 

Form.php

<?php 

namespace GenyBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use JMS\Serializer\Annotation as Serializer; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* @ORM\Table(name="geny_form") 
* @ORM\Entity(repositoryClass="GenyBundle\Repository\FormRepository") 
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") 
* @Serializer\ExclusionPolicy("NONE") 
*/ 
class Form 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Id 
    * @Serializer\Exclude 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=128) 
    * @Assert\Length(min = 1, max = 128) 
    * @Serializer\Type("string") 
    */ 
    protected $title; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="description", type="text", nullable=true) 
    * @Assert\Length(min = 0, max = 4096) 
    * @Serializer\Type("string") 
    */ 
    protected $description; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Field", mappedBy="form", cascade={"all"}, orphanRemoval=true) 
    * @ORM\OrderBy({"position" = "ASC"}) 
    * @Assert\Valid() 
    * @Serializer\Type("ArrayCollection<GenyBundle\Entity\Field>") 
    */ 
    protected $fields; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="submit", type="text") 
    * @Assert\Length(min = 1, max = 64) 
    * @Serializer\Type("string") 
    */ 
    protected $submit; 
} 

結果:

result

関連する問題