login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[Symfony2] User id beschikbaar in formtype

Offline Martijn2008 - 10/07/2013 16:54
Avatar van Martijn2008PHP beginner Hallo allemaal,

Deze vraag houd me al een tijdje bezig, vandaar dat ik het hier even post.

Ik maak gebruik van het Symfony2 Framework i.c.m. FOS Userbundle en een paar zelfgemaakte controllers.

Mijn vraag is, hoe kan ik aan de hand van het user id een paar dropdownlijsten vullen met mijn zelfgemaakte controller.

Ik heb verhalen gehoord over services, hulpklassen, overerven van namespace security.context in het formtype en meer.

Ik kom er niet uit. Iemand een oplossing?

Alvast bedankt.

Martijn

10 antwoorden

Gesponsorde links
Offline WouterJ - 10/07/2013 22:54
Avatar van WouterJ HTML gevorderde wat bedoel je met 'een paar dropdownlijsten vullen'?
Bedankt door: Martijn2008
Offline Martijn2008 - 11/07/2013 16:07 (laatste wijziging 11/07/2013 17:33)
Avatar van Martijn2008 PHP beginner Thanx. Met het vullen van de dropdownlisten bedoel ik het laden van de opties aan de hand van het user id. Dat user id wordt beschikbaar gesteld door de membershipprovider FOS UserBundle.

  1. $userid = $this->getUser()->getId();

Niet iedere gebruiker heeft dezelfde opties tot zijn/haar beschikking.

Het probleem waar ik nu tegenaan loop is dat het $this object niet in het FormType beschikbaar is, waardoor ik het user id en de daarbij horende opties niet kan ophalen: src/Martijn/CmsBundle/Form/TopicType.php

  1. $builder->add('groups', null, array(
  2. "label" => "Groep",
  3. "constraints" => array(new NotBlank()),
  4. "required" => true,
  5. 'class' => 'MartijnCmsBundle:Group',
  6. 'property' => 'name',
  7. 'query_builder' => function(EntityRepository $er) {
  8. return $er->createQueryBuilder('g')
  9. ->innerJoin('g.users', 'u')
  10. //->where('u.id=:userid')
  11. //->setParameter('userid', $this->getUser()->getId())
  12. ->orderBy('g.name', 'ASC');
  13. }
  14. ));


De where clausule kan niet worden uitgevoerd, doordat het $this object en daardoor het user id niet beschikbaar is. In de code is dit daarom uitgecomment. Ik heb het wel bijgevoegd, omdat ik denk dat dit het probleem verduidelijkt.
Offline WouterJ - 11/07/2013 23:45
Avatar van WouterJ HTML gevorderde Kijk in Symfony\Bundle\FrameworkBundle\Controller\Controller::getUser() om te zien waar die vandaan komt (uit mijn hoofd is het de getUser method van de security.context service). Include die service vervolgens in je form type door die als een service te definiëren en geef die service mee in je controller aan de form builder.

Maar laat ik voor opstellen dat dit me niet de juiste weg lijkt. Als een gebruiker geen toegang heeft tot een functie gebruik je de isGranted method van de security.context class of the is_granted Twig functie (eventueel icm security voters).
Bedankt door: Martijn2008
Offline Martijn2008 - 12/07/2013 00:04 (laatste wijziging 12/07/2013 00:16)
Avatar van Martijn2008 PHP beginner Ahh... dus het is vrij eenvoudig te fixen? Ok, dus als ik het volgens methode 1 wil doen (eerste alinea van je vorige post), hoe gaat dat dan?

Eerst even kijken waar die getUser() method vandaan komt.

  1. <?php
  2.  
  3. /**
  4.   * Get a user from the Security Context
  5.   *
  6.   * @return mixed
  7.   *
  8.   * @throws \LogicException If SecurityBundle is not available
  9.   *
  10.   * @see Symfony\Component\Security\Core\Authentication\Token\TokenInterface::getUser()
  11.   */
  12. public function getUser()
  13. {
  14. if (!$this->container->has('security.context')) {
  15. throw new \LogicException('The SecurityBundle is not registered in your application.');
  16. }
  17.  
  18. if (null === $token = $this->container->get('security.context')->getToken()) {
  19. return null;
  20. }
  21.  
  22. if (!is_object($user = $token->getUser())) {
  23. return null;
  24. }
  25.  
  26. return $user;
  27. }
  28.  
  29. ?>

Uit security.context dus.

Nu nog
1.) Service aanmaken in services.xml. Wat zet ik daar dan in?
2.) Die service meegeven in de controller van mijn form builder. Hoe zie je dat?
Ik heb mijn vragen achter de stappen gezet.

Een service heb ik wel is geschreven, maar vraag me af of je het op deze manier bedoelt...

Martijn/CmsBundle/Resources/config/services.xml
  1. <service id="martijn.cmsbundle.form.type.datetimepickertype" class="Martijn\CmsBundle\Form\Type\DateTimePickerType">
  2. <tag name="form.type" alias="cmsbundle_type_datetime_picker" />
  3. </service>
Offline WouterJ - 12/07/2013 00:52
Avatar van WouterJ HTML gevorderde En nu nog de security.context service meegeven via een setter of de constructor. Zie daarvoor http://symfony....ainer.html
Offline Martijn2008 - 12/07/2013 13:37 (laatste wijziging 12/07/2013 13:47)
Avatar van Martijn2008 PHP beginner Dankzij je tip met een link interessante documentatie heb ik wat code geschreven. De oplossing lijkt dichtbij te zijn.
Ik krijg nu de volgende foutmelding.

  1. FatalErrorException: Error: Call to undefined method Martijn\CmsBundle\Form\TopicType::get()


De configuratie

app/config/config.yml
  1. services:
  2. user_service:
  3. class: Martijn\CmsBundle\Service\UserService
  4. arguments: [security.context]


src/Martijn/CmsBundle/Service/UserService.php
  1. <?php
  2.  
  3. namespace Martijn\CmsBundle\Service;
  4.  
  5. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8.  
  9. class UserService extends Controller
  10. {
  11. protected $user;
  12.  
  13. public function __construct()
  14. {
  15. $this->user = $this->getUser();
  16. }
  17.  
  18. public function getUser()
  19. {
  20. return $this->getUser();
  21. }
  22. }
  23.  
  24. ?>


Zo probeer ik een user id op te halen.

src/Martijn/CmsBundle/Form/TopicType.php
  1. <?php
  2.  
  3. namespace Martijn\CmsBundle\Form;
  4.  
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\FormBuilderInterface;
  7. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  8. use Symfony\Component\Validator\Constraints\Length;
  9. use Symfony\Component\Validator\Constraints\NotBlank;
  10. use Doctrine\ORM\EntityRepository;
  11. use Martijn\CmsBundle\Service\UserService;
  12.  
  13. class TopicType extends AbstractType
  14. {
  15. public function buildForm(FormBuilderInterface $builder, array $options)
  16. {
  17. $userservice = $this->get('user_service');
  18. $user_id = $userservice->getId();
  19.  
  20. // ...
  21.  
  22. ?>

Offline WouterJ - 13/07/2013 13:56
Avatar van WouterJ HTML gevorderde Lees dat artikel nu eens rustig door... Je moet dit echt al veel beter door hebben na 1 keer een artikel lezen, anders kun je misschien beter wat anders gaan doen.
Offline Martijn2008 - 13/07/2013 14:30
Avatar van Martijn2008 PHP beginner Ik heb het artikel gelezen. Er wordt gesproken over het schrijven van een mailerservice die wordt opgehaald in een controller.
Echter wil ik het user id niet in mijn controller ophalen maar in het Form TopicForm.php. Daarover vind ik geen uitleg.
Offline WouterJ - 13/07/2013 15:25 (laatste wijziging 13/07/2013 15:26)
Avatar van WouterJ HTML gevorderde Die mailer service is in jouw geval de security.context service en als je het artikel verder leest lees je over een NewsletterManager en dat is in jouw geval de TopicForm class.

Mailer service en controller is ong. 1/4 van de tutorial... Die zijn niet voor niks geschreven.
Offline Martijn2008 - 14/07/2013 13:17 (laatste wijziging 14/07/2013 13:18)
Avatar van Martijn2008 PHP beginner Op Symfony IRC channel heeft WouterJ me stap voor stap de basis, het idee achter de service container uitgelegd. Daar zijn een paar voorbeeld scripts uit voortgekomen, deze post ik hier, zodat andere daar ook hun voordeel mee kunnen doen.

- script 1 (Review door WouterJ)
- script 2
- script 3
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.23s