Bonjour,

Je travail en ce moment sur un projet basé sur Symfony 2.7. , un framework que je ne connais pas encore bien.

J'ai actuellement un formulaire de registration généré par FOSUserBundle,
que j'ai pesonnalisé avec le FormType suivant :

<?php
// src/AppBundle/Form/RegistrationType.php

namespace CJ\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
       $builder
           ->add('roles', 'collection', array(
                   'type' => 'choice',
                   'options' => array(
                       'label' => false,
                       'choices' => array(
                           'ROLE_SALON' => 'Salon',
                           'ROLE_CV' => 'Utilisateur'
                       )
                   )
               )
           )
       ; 
    }

    public function getParent()
    {
        //return 'FOS\UserBundle\Form\Type\RegistrationFormType';

        // Or for Symfony < 2.8
        return 'fos_user_registration';
    }

    public function getBlockPrefix()
    {
        return 'app_user_registration';
    }

    // For Symfony 2.x
    public function getName()
    {
        return $this->getBlockPrefix();
    }
}

Ca permet à l'utilisateur de choisir un role qui va definir ses accès sur la platform.

Je souhaiterai pouvoir le personnaliser sous twig. Parceque actuellement il se présente sous la forme
d'un <select/><option/> mais j'aimerai le détaillé dans le twig, c 'est a dire pouvoir choisir par defaut une valeur
( <option selected> </option>) et ce en fonction d'un parametre que je reçoit en url. Donc pas de selection par defaut dans le formtype ou meme dans l'entité.

Un pti coup de pouce est le bien venu,
En vous remerciant

8 réponses


Frank Drebin
Auteur
Réponse acceptée

Je me suis tourné vers symfony 2.8 FOSUserBundle et PUGXMultiUserBundle pour pallier à ce soucis.

Avec PUGXMultiUserBundle j'ai donc deux entité qui étendent de User de FOSUserBundle et dans ces nouvelles entités
j'attribue le role par défaut que je souhaite qu'elles aient avec :

 public function __construct()
    {
        parent::__construct();
        // your own logic
        $this->roles = array('ROLE_PART);
    }

Je ne trouve pas la réponse à ce poste mais je me permet de la passé en résolu.

Bonsoir, peux-tu montrer le code du controller où tu crées ton formulaire.

Boujour skp,
C est le code du controller de FOSUserBundle, surchargable aussi, j'ai essayé d'y toucher mais sans succés. Le voici :

Je dois précisé que dans la registerAction, la première ligne $type = $request->query->get('type'); , je l'ai rajouté. Elle me permet de récupérer le paramétre d url de ma page de forulaire qui peut se présenter de la manière suivante : http://url.test/register/?type=ROLE_CV

namespace CJ\UserBundle\Controller;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use FOS\UserBundle\Model\UserInterface;

/**
 * Controller managing the registration
 *
 * @author Thibault Duplessis <thibault.duplessis@gmail.com>
 * @author Christophe Coevoet <stof@notk.org>
 */
class RegistrationController extends Controller
{
    public function registerAction(Request $request)
    {   
        $type = $request->query->get('type');

        /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
        $formFactory = $this->get('fos_user.registration.form.factory');
        /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
        $userManager = $this->get('fos_user.user_manager');
        /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
        $dispatcher = $this->get('event_dispatcher');

        $user = $userManager->createUser();
        $user->setEnabled(true);

        $event = new GetResponseUserEvent($user, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

        if (null !== $event->getResponse()) {
            return $event->getResponse();
        }

        $form = $formFactory->createForm();
        $form->setData($user);

        $form->handleRequest($request);

        if ($form->isValid()) {
            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

            $userManager->updateUser($user);

            if (null === $response = $event->getResponse()) {
                $url = $this->generateUrl('fos_user_registration_confirmed');
                $response = new RedirectResponse($url);
            }

            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

            return $response;
        }

        return $this->render('FOSUserBundle:Registration:register.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

Je ne connais pas assez FOSUserBundle, mais tu pourrais essayer de passer ta valeur dans les options du formulaire:

...
$form = $formFactory->createForm(["defaultRole" => $type]);
...

Après en récupérant cette option tu définies ta valeur par défaut.

Ce n'est peut-être pas la meilleure solution.

Alors j'ai testé plusieurs choses mais toutes bloquent pour la même raison.
A savoir que je reçois dans l url un parametre sur ma page register qui va définir le role.
Cependant lorsqu'on valide le formulaire il se relance en regardant si le formulaire est validé et complet, mais à ce moment il se relance avec l'url de base register sans mon paramètre dans l'url.
Il faudrait que j'arrive à garder mon paramètre en arrivant dans :

if ($form->isValid()) {
            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

            $userManager->updateUser($user);

            if (null === $response = $event->getResponse()) {
                $url = $this->generateUrl('fos_user_registration_confirmed');
                $response = new RedirectResponse($url);
            }

            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

            return $response;
        }

:/ je fais essayer d'autres, si jms tu vois une solution eventuelle je suis preneur ^^
C est pour ça que je voulais essayer de garder mon FormType avec le role a selectionner en option et une fois en twig le personnaliser pr mettre en choix présectionné celui qui m interesse.

Il faut peut-être régler l'attribut "action" de ton formulaire pour qui pointe sur l'url courante.

ha oui en effet c'est une solution, mais je ne sais pas comment faire ça.
l'attr action de mon form est "'action': path('fos_user_registration_register')"
et je ne peux pas lui mettre de paramètre à ce niveau. alors pour qu'il pointe vers l url en court, je ne sais pas faire.
Et malheuresement je ne sais pas en pointant vers l url courante il rechargera la controlleur ?

edit:

arf ça ne fonctionne pas, en revanche si je met l url en dure dans l attr action, ça marche.
Mais sinon en twig au debut oui, une fois le submit effectué il relance l action au controller mais cette fois avec l url interpreté

{{ app.request.uri }} directement ce qui donne :
app_dev.php/register/%7B%7B%20app.request.uri%20%7D%7D
au lieu de :
app_dev.php/register/?type=utilisateur

:/

tu peux tester "'action': path('fos_user_registration_register', {'type': varType})"