Nested CollectionType - одна форма для создания нескольких объектов - PullRequest
0 голосов
/ 08 февраля 2020

Я бы очень признателен за любую помощь в этом. Я посмотрел, что делает CollectionType c, но я не вижу ничего, что относится к моему конкретному случаю, и я не могу найти много документации по вложенному CollectionType.

In my " я хочу иметь возможность создать клиента с ОДНЫМ телефоном и в то же время создать ОДНОГО контакта, у которого также будет ОДИН телефон.

Ниже работает за исключением телефон для контакта.

CustomerController

/**
 * @Route("/new", name="customer_new", methods={"GET","POST"})
 */
public function new(Request $request): Response
{
    $customer = new Customer();

    $phone = new Phone();
    $customer->getPhones()->add($phone);

    $contact = new Contact();
    $customer->getContacts()->add($contact);

    $form = $this->createForm(CustomerType::class, $customer);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($customer);
        $entityManager->persist($phone);
        $entityManager->persist($contact);
        $entityManager->flush();

        return $this->redirectToRoute('customer_show', [
            'customer' => $customer,
        ]);
    }

    return $this->render('customer/new.html.twig', [
        'customer' => $customer,
        'form' => $form->createView(),
    ]);
}

Клиент

 /**
 * @ORM\Column(type="string", length=255)
 */
private $name;

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Contact", mappedBy="customer")
 */
private $contacts;

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Phone", mappedBy="customer")
 */
private $phones;

Контакт

/**
 * @ORM\Column(type="string", length=255)
 */
private $firstName;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Customer", inversedBy="contacts")
 */
private $customer;

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Phone", mappedBy="contact")
 */
private $phones;

Телефон

 /**
 * @ORM\Column(type="string", length=255)
 */
private $value;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Customer", inversedBy="phones")
 */
private $customer;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Contact", inversedBy="phones")
 */
private $contact;

CustomerType

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('phones', CollectionType::class, [
            'entry_type' => PhoneType::class,
            'entry_options' => ['label' => false],
            'allow_add' => true,
        ])
        ->add('contacts', CollectionType::class, [
            'entry_type' => ContactType::class,
            'entry_options' => ['label' => false],
            'allow_add' => false,
        ])
    ;
}

ContactType

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('firstName')
        ->add('phones', CollectionType::class, [
            'entry_type' => PhoneType::class,
            'entry_options' => ['label' => false],
            'allow_add' => true,
        ])
    ;
}

PhoneType

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('value')
        ->add('status', HiddenType::class, [
            'data' => '0',
        ])
    ;
}

_form. html .twig {{{form_start (form)}}

{{ form_label(form.name, 'Name') }}
{{ form_widget(form.name, {'attr': {'class': 'form-control'}}) }}

{{ form_label(form.phones[0], 'Phone') }}
{{ form_widget(form.phones[0].value, {'attr': {'class': 'form-control'}}) }}
{{ form_widget(form.phones[0].status, {'attr': {'class': 'form-control'}}) }}

{{ form_label(form.contacts[0].firstName, 'First name') }}
{{ form_widget(form.contacts[0].firstName, {'attr': {'class': 'form-control'}}) }}

// How do I display the phone for the contact?
...