Salut les génies! Je bosse sur une application ou j'ai différents utilisateurs qui ne fournissent pas les mêmes informations à l'enregistrement donc j'ai utilisé PUGX pour ça. J'aimerais qu'une fois que l'administrateur créé un agent, ce dernier change son mot de passe à sa première connexion et j'ai une erreur bizarre à la connexion "An exception has been thrown during the compilation of a template ("Notice: Undefined variable: test") in "FOSUserBundle:ChangePassword:changePassword_content.html.twig". Cette variable n'exite pas je ne sais pas d'ou sa vient.
Au passage voici mon code:

<?php
/**
 * Created by PhpStorm.
 * User: coura
 * Date: 15/09/2015
 * Time: 10:44
 */

namespace App\UtilisateursBundle\Redirection;

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

class LoginListener
{
    private $security;
    private $router;
    private $dispatcher;

    public function __construct(SecurityContext $security, RouterInterface $router, EventDispatcherInterface $dispatcher)
    {
        $this->security    = $security;
        $this->router      = $router;
        $this->dispatcher  = $dispatcher;
    }

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
        //on teste si l'utilisateur s'est authentifié a partir du formulaire de login
        if($this->security->isGranted('IS_AUTHENTICATED_FULLY'))
        {
            $user = $event->getAuthenticationToken()->getUser();
            if($user->getLastLogin() == null)
            {
                $this->dispatcher->addListener(KernelEvents::RESPONSE, array(
                    $this,
                    'onKernelResponse'
                ));
            }
        }
    }

    public function onKernelResponse(FilterResponseEvent $event)
    {
        $response = new RedirectResponse($this->router->generate('fos_user_change_password'));
        $event->setResponse($response);
    }
}

8 réponses


podisto
Auteur
Réponse acceptée

Encore moi! Bon j'ai résolu mon problème en fait c'est pas seulement au niveau du changement du mot de passe c'est le même problème pour la modification des infos du profil. Voila ce que j'ai fait: j'ai redéfinis le controller changePassword et rediriger vers un template twig contenant le formulaire de modification du mot de passe. Ci dessous les codes:

<?php

namespace App\UtilisateursBundle\Controller;

use App\UtilisateursBundle\Entity\Agent;
use App\UtilisateursBundle\Form\ChangePasswordType;
use App\UtilisateursBundle\Form\ProfileAdministrateurType;
use App\UtilisateursBundle\Form\RegistrationAgentType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class AdminServiceController extends Controller
{
   public function registerAgentAction()
   {
      $agent = new Agent();
      $form = $this->get('form.factory')->create(new RegistrationAgentType(), $agent);

      return $this->render('@Utilisateurs/Utilisateurs/ajouteragent.html.twig', array(
         'form' => $form->createView(),
      ));
   }

   public function listeAgentAction()
   {
      return $this->render('@Utilisateurs/Utilisateurs/listeagent.html.twig');
   }

   /**
    * Change user password
    */
   public function changePasswordAction(Request $request)
   {
      $user = $this->getUser();
      if (!is_object($user) || !$user instanceof UserInterface) {
         throw new AccessDeniedException('This user does not have access to this section.');
      }

      /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
      $formFactory = $this->get('fos_user.change_password.form.factory');

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

      $form->handleRequest($request);

      if ($form->isValid()) {
         /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
         $userManager = $this->get('fos_user.user_manager');

         $event = new FormEvent($form, $request);

         $userManager->updateUser($user);

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

         return $response;
      }

      return $this->render('@Utilisateurs/Utilisateurs/agenteditpassword.html.twig', array(
          'form' => $form->createView(),
      ));
   }
}
<div class="col-md-10">
                    <div class="col-md-8 col-md-offset-2">
                        <form action="{{ path('adminservice_changepassword') }}" method="post" class="form-horizontal">
                            {{ form_widget(form) }}
                            <input type="submit" value="Valider" />
                        </form>
                    </div>
</div>

Florent si tu trouve autre chose je suis toujours partant. Merci nicovak

C'est dans la vue le problème FOSUserBundle:ChangePassword:changePassword_content.html.twig
Là tu nous colle ton Listener.

podisto
Auteur

Si c'est dans la vue mais ce qui est bizarre c'est que pas touché la vue j'ai juste surchargé voici la vue :

{% trans_default_domain 'FOSUserBundle' %}

<form action="{{ path('fos_user_change_password') }}" {{ form_enctype(form) }} method="POST" class="fos_user_change_password">
    {{ form_widget(form) }}
    <div>
        <input type="submit" value="{{ 'change_password.submit'|trans }}" />
    </div>
</form>

Ou va t-il chercher cette variable test ??

Salut.j'ai le même problème au même moment et je ne trouve pas de solution.je n'ai pas surchargé le formulaire.Je poste si je trouve et vice et versa (comme dit la chanson).
A bientot avec de meilleures news.

podisto
Auteur

Salut Florent! ok je vais m'y remettre ce soir j'avais implémenté ça dans un de mes projets mais la bas je n'avais pas utilisé de listener. J'avais ajouté un champ etat de type boolean sur la table user de fos et la je testai au login si c'est a false je le redirigeais vers le formulaire de changement de mot de passe. Mais je reconnais que c'était pas propre du tout!

Essai sans le

{% trans_default_domain 'FOSUserBundle' %}

Je crois avoir déja eu une erreur du genre, ca ne coute rien d'éssayer.

podisto
Auteur

Hum! Merci mais ça passe toujours pas! C'est vraiment bizarre !!

podisto
Auteur

Toujours pas de solution ??