Bạn đã gặp phải một trong những vấn đề khó khăn nhất với biểu mẫu Symfony. May mắn thay, có một số tài liệu tốt. Hãy để tôi tóm tắt các bước quan trọng.
Bạn nói đúng:Thực thể Person cần biết về mối quan hệ của họ với PersonJob nếu bạn muốn điều chỉnh mối quan hệ đó theo quan điểm của Người. Vì vậy, bạn cần thêm thuộc tính:
// src/AppBundle/Entity/Person.php
/**
* @ORM\OneToMany(targetEntity="PersonJob", mappedBy="person")
*/
private $personJobs;
public function __construct()
{
$this->personJobs = new \Doctrine\Common\Collections\ArrayCollection();
}
và sau đó bạn sẽ có loại biểu mẫu
// src/AppBundle/Form/PersonType.php
$builder
->add('name')
->add('firstname')
->add('personJobs', CollectionType::class, array(
'entry_type' => PersonJobType::class,
'allow_add' => true,
)
;
Lưu ý loại personJobs
đồng ruộng. Vì một người có thể có nhiều PersonJobs, bạn cần một loại biểu mẫu có thể xử lý các bộ sưu tập. Đây là mục đích của CollectionType
tích hợp sẵn (xem tài liệu của nó!
). Bạn cũng cần loại biểu mẫu PersonJobType
, để CollectionType
biết cách xây dựng các biểu mẫu con:
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'
));
}
}
Đối với mục đích gỡ lỗi, hãy thay đổi bộ điều khiển của bạn thành
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(),
]);
}
Bây giờ, hãy tiếp tục và sao chép &dán mã Twig và Javascript từ Thêm và Xóa các mục
(bạn phải thực hiện các thay đổi nhỏ như thay thế form.emails
với form.personJobs
).
Biểu mẫu
Biểu mẫu sẽ giống như
Chỉ là biểu mẫu Người với “Thêm một Người khác” liên kết:
Thêm một PersonJob:
Thêm người ẩn danh PersonJob:
Dữ liệu đã nhận
Gửi biểu mẫu và xem kết quả của 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]=> …
}
}
Còn hai việc phải làm:
-
Đặt
person
thuộc tính củaPersonJob
lồng nhau các thực thể phù hợp với Người mới (nhưng chưa tồn tại). -
Cho Doctrine biết về
PersonJob
mới các thực thể bằng cách gọi$em->persist(…)
trên chúng.