2013-08-21 9 views
6

मैं Symfony2 के साथ एक बहुत ही सरल मंच बनाने की कोशिश कर रहा हूं।Symfony2 में 2 फॉर्म मर्ज कैसे करें

मेरे संस्थाओं हैं: ForumCategory (नाम, विवरण ...) ForumTopic (category_id, शीर्षक) ForumPost (isFirstPost, शरीर, topic_id, author_id ...)

एक उपयोगकर्ता एक बनाने के लिए प्रयास करते हैं विषय, मैं विषय और पहला पोस्ट संदेश बनाने के लिए एक ही पृष्ठ में केवल एक ही फ़ॉर्म प्रदर्शित करना चाहता हूं। जैसा:

  • विषय डालें शीर्षक: ...
  • विषय डालें शरीर (संबंधित पोस्ट का मुख्य भाग): ...

[...]

मैं कैसे ऐसा कर सकते हैं ? इस मामले में दो फॉर्म मर्ज संभव है?

उत्तर

12

एक फॉर्म प्रकार बनाएं जिसमें आपके दोनों उप फॉर्म शामिल हों।

class MergedFormType 

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

अपने नियंत्रक में सिर्फ MergedFormType को

public function myAction() 

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

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

मैं इस किया है, लेकिन त्रुटि हो रही है "यह फार्म अतिरिक्त क्षेत्रों शामिल नहीं होना चाहिए" जब मैं खेतों प्रस्तुत जो घोंसले रूपों में से एक में हैं। कोई विचार? – StampyCode

+1

सिम्फनी/फॉर्म 3 का उपयोग करना। * मुझे MergedFormType में 'प्रकार की अपेक्षित तर्क "स्ट्रिंग" 'मिलती है।इसे हल करने का कोई उपाय? – Keloo

+0

क्या आपने दस्तावेज़ों की जांच की है? एस 3 अब फॉर्म प्रकार के उदाहरण को पास करने का समर्थन नहीं करता है। कई महत्वपूर्ण रूपों में से एक बदलता है। – Cerad

1

यदि आपके कई लोगों के लिए एक या एक रिश्ते के लिए एक साथ 2 संस्थाओं के लिए रूपों विलय करने के लिए देख रहे हैं एक सरणी पारित; आपको सिम्फनी 2 घटक के फॉर्म संग्रह एक्सटेंशन का उपयोग करने की आवश्यकता होगी। उदाहरण के लिए: http://symfony.com/doc/2.7/cookbook/form/form_collections.html

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

संबंधित मुद्दे