Anda telah menemukan salah satu masalah tersulit dengan bentuk Symfony. Untungnya, ada beberapa dokumentasi yang bagus. Biarkan saya meringkas langkah-langkah penting.
Anda benar:Entitas Orang perlu tahu tentang hubungannya dengan PersonJob jika Anda ingin memanipulasi hubungan itu dari sudut pandang Orang. Jadi, Anda perlu menambahkan properti:
// src/AppBundle/Entity/Person.php
/**
* @ORM\OneToMany(targetEntity="PersonJob", mappedBy="person")
*/
private $personJobs;
public function __construct()
{
$this->personJobs = new \Doctrine\Common\Collections\ArrayCollection();
}
dan kemudian Anda akan memiliki jenis formulir
// src/AppBundle/Form/PersonType.php
$builder
->add('name')
->add('firstname')
->add('personJobs', CollectionType::class, array(
'entry_type' => PersonJobType::class,
'allow_add' => true,
)
;
Perhatikan jenis personJobs
bidang. Karena seseorang dapat memiliki banyak PersonJobs, Anda memerlukan tipe formulir yang dapat menangani koleksi. Ini adalah tujuan dari CollectionType
. bawaan (lihat dokumentasinya!
). Anda juga memerlukan jenis formulir PersonJobType
, sehingga CollectionType
tahu cara membuat sub-formulir:
class PersonJobType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('comment')
->add('datestart', DateTimeType::class)
->add('dateend', DateTimeType::class)
->add('job') // requires Job::__toString() to be defined!
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\PersonJob'
));
}
}
Untuk tujuan debugging, ubah pengontrol Anda menjadi
public function testAction()
{
$person = new Person();
$form = $this->createForm(PersonType::class, $person);
$form->add('submit', SubmitType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
print '<pre>';
var_dump($form->getData());
die();
}
return $this->render('default/index.html.twig', [
'form' => $form->createView(),
]);
}
Sekarang lanjutkan dan salin &tempel kode Twig dan Javascript dari Menambahkan dan Menghapus Item
(Anda harus membuat perubahan kecil seperti mengganti form.emails
dengan form.personJobs
).
Formulir
Bentuknya akan terlihat seperti
Hanya formulir Person dengan “Tambahkan PersonJob lain” tautan:
Menambahkan PersonJob:
Menambahkan PersonJob lain:
Data diterima
Kirim formulir dan lihat output var_dump
:
object(AppBundle\Entity\Person)#247 (5) {
["id":"AppBundle\Entity\Person":private]=>
NULL
["name":"AppBundle\Entity\Person":private]=>
string(12) "Charles Dude"
["firstName":"AppBundle\Entity\Person":private]=>
string(7) "Charles"
["active":"AppBundle\Entity\Person":private]=>
bool(true)
["personJobs":"AppBundle\Entity\Person":private]=>
object(Doctrine\Common\Collections\ArrayCollection)#248 (1) {
["elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
array(2) {
[0]=>
object(AppBundle\Entity\PersonJob)#962 (6) {
["id":"AppBundle\Entity\PersonJob":private]=>
NULL
["comment":"AppBundle\Entity\PersonJob":private]=>
string(19) "Something important"
["datestart":"AppBundle\Entity\PersonJob":private]=>
object(DateTime)#1088 (3) { … }
["dateend": …] => …
["person":"AppBundle\Entity\PersonJob":private]=>
NULL
["job":"AppBundle\Entity\PersonJob":private]=>
object(AppBundle\Entity\Job)#1171 (2) {
["id":"AppBundle\Entity\Job":private]=>
int(2)
["name":"AppBundle\Entity\Job":private]=>
string(5) "Job 2"
}
}
[1]=> …
}
}
Masih ada dua hal yang harus dilakukan:
-
Setel
person
properti dariPersonJob
bersarang entitas dengan benar ke Orang baru (tetapi belum bertahan). -
Beri tahu Doctrine tentang
PersonJob
baru entitas dengan memanggil$em->persist(…)
pada mereka.