Personnalisation twig d'un formtype

Par Frank Drebin, il y a 10 ans


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

skp, il y a 10 ans

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

Frank Drebin, il y a 10 ans

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(), )); } }
skp, il y a 10 ans

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.

Frank Drebin, il y a 10 ans

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.

skp, il y a 10 ans

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

Frank Drebin, il y a 10 ans

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

:/

skp, il y a 10 ans

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

Frank Drebin, il y a 10 ans

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.