login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[Symfony] Checkboxen met rollen bij gebruiker (Opgelost)

Offline Martijn2008 - 03/07/2013 21:57 (laatste wijziging 03/07/2013 21:59)
Avatar van Martijn2008PHP beginner Hallo allemaal,

Een gebruiker kan in mijn applicatie 1 of meerdere rollen hebben: administrator, moderator en/of member

De relatie ziet er als volgt uit:
[Gebruiker] -- (1..1) -- <> --(0..N)-- [Heeft_een] --(0..N)-- <> --(1..1)-- [Rol]

Tabel met kolommen.
  1. Gebruiker : Id, Username, Firstname, Lastname, Password
  2. Rol : Id, Name
  3. Heeft_een : Id, FK_GebruikerID, FK_RolID


Wat wil ik? Ik wil een formulier bouwen waarmee ik de eigenschappen van een gebruiker kan beheren, bijvoorbeeld firstname, lastname en rollen. Globaal moet het er zo ongeveer uit komen te zien.

  1. Firstname [TextBox]
  2. Lastname [TextBox]
  3. Rollen
  4. [CheckBox] Administrator
  5. [CheckBox] Moderator
  6. [CheckBox] Member
  7.  
  8. [Button]


Weet iemand hoe ik dit bouw met het Symfony Framework? Het is daarbij belangrijk dat de juiste gegevens in de juiste tabel wordt opgeslagen en andersom.

Alvast bedankt.

Martijn.

11 antwoorden

Gesponsorde links
Offline WouterJ - 03/07/2013 22:36 (laatste wijziging 03/07/2013 22:38)
Avatar van WouterJ HTML gevorderde Gebruik het Entity field type.

Voor checkboxes zet je dan expanded op true, zoals beschreven op die pagina: "expanded - If set to true, radio buttons or checkboxes will be rendered (depending on the multiple value). If false, a select element will be rendered."

En een User kan maar 1 role hebben, maar doormiddel van role inheritance maak je het zo dat de moderator ook een member is en de admin ook een moderator en dus ook een member is.
Offline Martijn2008 - 04/07/2013 22:29 (laatste wijziging 05/07/2013 12:31)
Avatar van Martijn2008 PHP beginner
  1. $builder->add('??rollen??', 'entity', array(
  2. 'class' => 'MartijnCmsBundle:Rol',
  3. 'query_builder' => function(EntityRepository $er) {
  4. return $er->createQueryBuilder('r')
  5. ->orderBy('r.name', 'ASC');
  6. },
  7. ));


Hoe vul je dit goed in (zie vraagtekens)? Tussen tabel gebruiker en rol zit namelijk een koppeltabel.
Offline WouterJ - 05/07/2013 08:37
Avatar van WouterJ HTML gevorderde Daar komt gewoon de naam van de property van de User klasse, symfony en doctrine hebben allebei al door dat er een koppeltabel tussen zit, daar hoef jij je geen zorgen over te maken.
Offline Martijn2008 - 05/07/2013 12:30 (laatste wijziging 05/07/2013 12:32)
Avatar van Martijn2008 PHP beginner Bedankt, dat is handig. Helaas krijg ik m'n checkboxlist niet goed werkend. Ik krijg de ene na de andere foutmelding. Op Google heb ik het eea gevonden, momenteel ziet de code er zo uit..

Code van UserForm.php
  1. $builder->add('rollen', 'entity', array(
  2. "label" => "Rollen",
  3. "constraints" => array(new NotBlank()),
  4. "required" => false,
  5. "multiple" => true,
  6. "expanded" => true,
  7. 'property' => 'fkRolid.name',
  8. 'class' => 'MartijnCmsBundle:Rol',
  9. 'choices' => function(EntityRepository $er)
  10. {
  11. return $er->createQueryBuilder('r')
  12. ->orderBy('r.name', 'ASC');
  13. }
  14. ));
Offline WouterJ - 05/07/2013 15:26
Avatar van WouterJ HTML gevorderde en foutmelding?
Offline Martijn2008 - 06/07/2013 01:49
Avatar van Martijn2008 PHP beginner Foutmelding

  1. Neither property "rollen" nor method "getRollen()" nor method "isRollen()" exists in class "Martijn\CmsBundle\Entity\Rol"


Ik begrijp dat methode getRollen niet gevonden kan worden in entity Rol, want die staat in entity Gebruiker. Het is vast een simpele aanpassing, maar ik weet de oplossing niet.
Offline WouterJ - 06/07/2013 12:27
Avatar van WouterJ HTML gevorderde Waarschijnlijk begrijp je het helemaal verkeerd. Hoe het er ong. uit moet zien:
  1. use Martijn\CmsBundle\User;
  2.  
  3. $user = new User();
  4.  
  5. $builder = $this->createFormBuilder($user);
  6. $builder->add('roles', 'entity', array(
  7. 'class' => 'MartijnCmsBundle:Rol',
  8. 'property' => 'name',
  9. 'query_builder' => function(EntityRepository $er) {
  10. return $er->createQueryBuilder('r')
  11. ->orderBy('r.name', 'ASC');
  12. },
  13. ));
  14.  
  15. // met
  16. class User
  17. {
  18. /**
  19.   * @ORM\OneToMany(targetEntity="Rol")
  20.   */
  21. private $roles;
  22.  
  23. // ...
  24. }
  25.  
  26. class Rol
  27. {
  28. private $name;
  29.  
  30. public function getName() { ... };
  31. }
Offline Martijn2008 - 06/07/2013 13:22 (laatste wijziging 06/07/2013 13:23)
Avatar van Martijn2008 PHP beginner Great, weer een stapje dichterbij de oplossing. Ik zie nu alle verwachte checkboxen. Twee regels heb ik aan je code toegevoegd om de checkboxen te krijgen.

  1. $builder->add('roles', 'entity', array(
  2. 'class' => 'MartijnCmsBundle:Rol',
  3. 'property' => 'name',
  4. 'multiple' => true, // Deze
  5. 'expanded' => true, // en deze
  6. 'query_builder' => function(EntityRepository $er) {
  7. return $er->createQueryBuilder('r')
  8. ->orderBy('r.name', 'ASC');
  9. },
  10. ));


Echter, als ik er een paar aanvink en op submit druk, krijg ik de volgende foutmelding

  1. Found entity of type Martijn\CmsBundle\Entity\Rol on association Martijn\CmsBundle\Entity\Gebruiker#rollen, but expecting Martijn\CmsBundle\Entity\Heefteen


Het lijkt erop dat Symfony of Doctrine de relatie niet goed begrijpt.
Offline WouterJ - 06/07/2013 14:05
Avatar van WouterJ HTML gevorderde Waarom heb je een entity die HeeftEen heet? Laat eens de relevante entities zien.
Offline Martijn2008 - 06/07/2013 14:18
Avatar van Martijn2008 PHP beginner Dat is een koppeltabel. Zoals ik in mijn eerste post al aangaf, kan een gebruiker in mijn applicatie meerdere rollen hebben. Een vereenvoudigd voorbeeldje voor gebruiker Administrator.

Tabel Gebruiker
Id, Username
1, Administrator
2, Cindy
3, Wouter
4, Lisa
5, Martijn

Tabel Rol
Id, Name
1, Administrator
2, Moderator
3, Member

Tabel Heeft_een
Id, FK_GebruikerID, FK_RolID
1, 1, 1
1, 1, 2
1, 1, 3
etc.

Zoals je in tabel Heeft_een ziet, heeft gebruiker Administrator alle rollen.
Offline WouterJ - 06/07/2013 18:57
Avatar van WouterJ HTML gevorderde Ondertussen via een gesprek op IRC dit weten op te lossen. Het bleek dat Martijn niet precies begreep hoe relaties in Doctrine werken. Hij was opzoek naar deze relatie: http://docs.doc...irectional

Het gesprek is hier na te lezen: http://pastebin.com/eK2HyMsY
Bedankt door: Martijn2008
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.25s