[Symfony 3] Form velden met entity met meerdere niveaus

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Met de formbuilder probeer ik een form op te bouwen die gelinkt is aan een entity (Card). Deze entity heeft zelf meerdere fields die op zich ook entities zijn (compositie). De entity Card heeft een field van het type CardEffect dat op zich weer een field van het type CardEffectType heeft.

Bij het invullen van mijn form moet ik het name field van CardEffect invullen en ook een lijst van opties geven voor het CardEffectType.

In mijn formbuilder heb ik het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
$builder
    ->add('cardEffectName', TextType::class, array(
        'required' => false,
        'error_bubbling' => true
    ))
    ->add('cardEffectType', EntityType::class, array(
        'class' => 'AppBundle:CardEffectType',
        'choice_label' => 'name',
        'multiple' => false,
        'expanded' => false,
        'required' => false,
        'error_bubbling' => true
    ))


Het probleem hierbij is echter dat de cardEffectName en cardEffectType fields niet bestaan in de Card entity. Ze zitten namelijk in meerdere niveaus onder het cardEffect field van Card.

Mapped op false zetten is een optie, maar dan moet ik manueel de ingevulde waarden koppelen aan Card. Een betere oplossing lijkt me rechtstreeks een cardEffectName en cardEffectType getter/setter aanmaken in Card.

Beiden oplossingen lijken me niet ideaal en ik vraag me af of hier geen betere manier voor bestaat die ik over het hoofd zie?

[ Voor 8% gewijzigd door egonolieux op 19-02-2017 08:19 ]

Beste antwoord (via egonolieux op 19-02-2017 21:03)


  • Jorick
  • Registratie: November 2001
  • Laatst online: 09-10 19:49
Moet je niet gewoon een form maken voor je CardEffect entiteit (CardEffectType) met daarin dus je 'Name' veld en 'CardEffectType' entiteit die ook weer een eigen form krijgt. Zowel In je CardEffectType als in je CardEffectTypeType verwijs je in de configureOptions-functie middels de 'data_class'-optie naar de bijbehorende entiteit en Symfony vogelt de rest voor je uit. Zie voor een voorbeeld http://symfony.com/doc/current/form/embedded.html en http://symfony.com/doc/current/form/form_collections.html.

Het enige alternatief is dus om handmatig in je CardType alles handmatig af te vangen, valideren en toe te kennen maar dat is, zoals je zelf ook al aangeeft, niet wenselijk/optimaal.

[ Voor 6% gewijzigd door Jorick op 19-02-2017 19:53 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je hebt geen setters nodig in dat laatste geval, toch? Alleen getters zou genoeg moeten zijn volgens mij, een met wat extra getters voor gebruiksgemak is niet echt wat mis.

offtopic:
Waarom mix je eigenlijk twee notaties? Op de ene regel gebruik je EntityType::class een op de volgende 'AppBundle:CardEffectType'. Ik zou dat gelijk trekken. :)

[ Voor 10% gewijzigd door NMe op 19-02-2017 11:52 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
NMe schreef op zondag 19 februari 2017 @ 11:51:
Je hebt geen setters nodig in dat laatste geval, toch? Alleen getters zou genoeg moeten zijn volgens mij, een met wat extra getters voor gebruiksgemak is niet echt wat mis.
Ik denk wel dat ik setters nodig heb aangezien Symfony de velden van de formbuilder rechtstreeks mapt naar de gebruikte entity:

code:
1
2
3
4
5
6
7
8
9
    $card = new Card();

    $form = $this->createForm(CardType::class, $card);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid())
    {
        dump($card);
    }


Daar ging mijn probleem juist om; er bestaat geen $cardEffectName op Card zelf, die zit onder $card->getCardEffect()->getName().

offtopic:
NMe schreef op zondag 19 februari 2017 @ 11:51:
Waarom mix je eigenlijk twee notaties? Op de ene regel gebruik je EntityType::class een op de volgende 'AppBundle:CardEffectType'. Ik zou dat gelijk trekken. :)

Omdat dit de enige plaats is waar ik deze class gebruik en ik was op het moment van typen te lui om AppBundle\Entity\CardEffectType::class te typen ipv 'AppBundle:CardEffectType' ;)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom zou je een setter nodig hebben? Dat formulier heeft die waardes toch alleen nodig voor weergave?
egonolieux schreef op zondag 19 februari 2017 @ 17:38:
offtopic:
Omdat dit de enige plaats is waar ik deze class gebruik en ik was op het moment van typen waarschijnlijk te lui om AppBundle\Entity\CardEffectType::class te typen ipv 'AppBundle:CardEffectType' ;)
offtopic:
Van een extra use bovenaan de file gaat niemand dood. :P Stukje consistentie is altijd fijn, en in tegenstelling tot het gebruik van een string heb je met WhateverType::class geen kans op tikfouten. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
NMe schreef op zondag 19 februari 2017 @ 18:29:
Waarom zou je een setter nodig hebben? Dat formulier heeft die waardes toch alleen nodig voor weergave?
Zowel voor het toevoegen als bewerken van Card.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Jorick
  • Registratie: November 2001
  • Laatst online: 09-10 19:49
Moet je niet gewoon een form maken voor je CardEffect entiteit (CardEffectType) met daarin dus je 'Name' veld en 'CardEffectType' entiteit die ook weer een eigen form krijgt. Zowel In je CardEffectType als in je CardEffectTypeType verwijs je in de configureOptions-functie middels de 'data_class'-optie naar de bijbehorende entiteit en Symfony vogelt de rest voor je uit. Zie voor een voorbeeld http://symfony.com/doc/current/form/embedded.html en http://symfony.com/doc/current/form/form_collections.html.

Het enige alternatief is dus om handmatig in je CardType alles handmatig af te vangen, valideren en toe te kennen maar dat is, zoals je zelf ook al aangeeft, niet wenselijk/optimaal.

[ Voor 6% gewijzigd door Jorick op 19-02-2017 19:53 ]


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Jorick schreef op zondag 19 februari 2017 @ 19:33:
Moet je niet gewoon een form maken voor je CardEffect entiteit (CardEffectType) met daarin dus je 'Name' veld en 'CardEffectType' entiteit die ook weer een eigen form krijgt. Zowel In je CardEffectType als in je CardEffectTypeType verwijs je in de configureOptions-functie middels de 'data_class'-optie naar de bijbehorende entiteit en Symfony vogelt de rest voor je uit. Zie voor een voorbeeld http://symfony.com/doc/current/form/embedded.html en http://symfony.com/doc/current/form/form_collections.html.

Het enige alternatief is dus om handmatig in je CardType alles handmatig af te vangen, valideren en toe te kennen maar dat is, zoals je zelf ook al aangeeft, niet wenselijk/optimaal.
Aha, exact wat ik nodig heb :)
Pagina: 1