आप एक से अधिक मर्ज किए गए रूपों के लिए एक ही इकाई को मैप कर सकते हैं: जहां टास्क इकाई कई टैग है
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;
}
परिणाम:
मैं इस किया है, लेकिन त्रुटि हो रही है "यह फार्म अतिरिक्त क्षेत्रों शामिल नहीं होना चाहिए" जब मैं खेतों प्रस्तुत जो घोंसले रूपों में से एक में हैं। कोई विचार? – StampyCode
सिम्फनी/फॉर्म 3 का उपयोग करना। * मुझे MergedFormType में 'प्रकार की अपेक्षित तर्क "स्ट्रिंग" 'मिलती है।इसे हल करने का कोई उपाय? – Keloo
क्या आपने दस्तावेज़ों की जांच की है? एस 3 अब फॉर्म प्रकार के उदाहरण को पास करने का समर्थन नहीं करता है। कई महत्वपूर्ण रूपों में से एक बदलता है। – Cerad