あなたはSymfonyフォームで最も難しい問題の1つに遭遇しました。幸いなことに、いくつかの優れたドキュメントがあります。重要な手順を要約します。
その通りです。Personの観点からその関係を操作する場合、PersonはPersonJobとの関係について知る必要があります。したがって、プロパティを追加する必要があります:
// src/AppBundle/Entity/Person.php
/**
* @ORM\OneToMany(targetEntity="PersonJob", mappedBy="person")
*/
private $personJobs;
public function __construct()
{
$this->personJobs = new \Doctrine\Common\Collections\ArrayCollection();
}
次に、フォームタイプが表示されます
// src/AppBundle/Form/PersonType.php
$builder
->add('name')
->add('firstname')
->add('personJobs', CollectionType::class, array(
'entry_type' => PersonJobType::class,
'allow_add' => true,
)
;
personJobs
のタイプに注意してください 分野。人は多くのPersonJobを持つことができるため、コレクションを処理できるフォームタイプが必要です。これが組み込みのCollectionType
の目的です。 (そのドキュメントをチェックしてください!
)。フォームタイプPersonJobType
も必要です 、そのため、CollectionType
サブフォームの作成方法を知っています:
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'
));
}
}
デバッグの目的で、コントローラーを
に変更します。 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(),
]);
}
次に、アイテムの追加と削除
(form.emails
の置き換えなどの小さな変更を加える必要があります form.personJobs
を使用 。
フォーム
フォームは次のようになります
「別のPersonJobを追加」を含むPersonフォームのみ リンク:
PersonJobの追加:
別のPersonJobの追加:
受信したデータ
フォームを送信して、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]=> …
}
}
やるべきことが2つ残っています:
-
person
を設定します ネストされたPersonJob
のプロパティ エンティティは新しい(ただしまだ永続化されていない)人に適切に割り当てられます。 -
新しい
PersonJob
についてDoctrineに伝えます$em->persist(…)
を呼び出すことによるエンティティ それらに。