Я бы очень признателен за любую помощь в этом. Я посмотрел, что делает 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?