]> Raphaƫl G. Git Repositories - userbundle/blobdiff - Controller/DefaultController.php
Add recover form directly on login page on failure
[userbundle] / Controller / DefaultController.php
index 11c7afbb0ca30d70c67e8c86976e5f579f300f6a..4bab49ba9dbdcaa48d6d240ca9345da42ed79635 100644 (file)
@@ -10,8 +10,9 @@ use Symfony\Component\Form\FormError;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
 use Symfony\Component\Mailer\MailerInterface;
-use Symfony\Component\Mime\NamedAddress;
+use Symfony\Component\Mime\Address;
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RouterInterface;
 use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
 use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
 use Symfony\Component\Translation\TranslatorInterface;
@@ -23,34 +24,89 @@ class DefaultController extends AbstractController {
        //Translator instance
        protected $translator;
 
-       public function __construct(ContainerInterface $container, TranslatorInterface $translator) {
+       public function __construct(ContainerInterface $container, TranslatorInterface $translator, RouterInterface $router) {
                //Retrieve config
                $this->config = $container->getParameter($this->getAlias());
 
                //Set the translator
                $this->translator = $translator;
+
+               //Get current action
+               //XXX: we don't use this as it would be too slow, maybe ???
+               #$action = str_replace(self::getAlias().'_', '', $container->get('request_stack')->getCurrentRequest()->get('_route'));
+
+               //Inject every requested route in view and mail context
+               foreach($this->config as $tag => $current) {
+                       //Look for entry with route subkey
+                       if (!empty($current['route'])) {
+                               //Generate url for both view and mail
+                               foreach(['view', 'mail'] as $view) {
+                                       //Check that context key is usable
+                                       if (isset($current[$view]['context']) && is_array($current[$view]['context'])) {
+                                               //Process every routes
+                                               foreach($current['route'] as $route => $key) {
+                                                       //Skip recover_mail route as it requires some parameters
+                                                       if ($route == 'recover_mail') {
+                                                               continue;
+                                                       }
+                                                       //Check that key is empty
+                                                       if (!isset($current[$view]['context'][$key])) {
+                                                               //Generate the route
+                                                               $this->config[$tag][$view]['context'][$key] = $router->generate(
+                                                                       $this->config['route'][$route]['name'],
+                                                                       $this->config['route'][$route]['context'],
+                                                                       //Generate absolute url for mails
+                                                                       $view=='mail'?UrlGeneratorInterface::ABSOLUTE_URL:UrlGeneratorInterface::ABSOLUTE_PATH
+                                                               );
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
        }
 
        public function login(Request $request, AuthenticationUtils $authenticationUtils) {
                //Create the LoginType form and give the proper parameters
-               $form = $this->createForm($this->config['login']['view']['form'], null, [
+               $login = $this->createForm($this->config['login']['view']['form'], null, [
                        //Set action to login route name and context
                        'action' => $this->generateUrl($this->config['route']['login']['name'], $this->config['route']['login']['context']),
                        'method' => 'POST'
                ]);
 
+               //Init context
+               $context = [];
+
+               //Last username entered by the user
+               if ($lastUsername = $authenticationUtils->getLastUsername()) {
+                       $login->get('mail')->setData($lastUsername);
+               }
+
                //Get the login error if there is one
                if ($error = $authenticationUtils->getLastAuthenticationError()) {
                        //Get translated error
                        $error = $this->translator->trans($error->getMessageKey());
 
                        //Add error message to mail field
-                       $form->get('mail')->addError(new FormError($error));
-               }
+                       $login->get('mail')->addError(new FormError($error));
 
-               //Last username entered by the user
-               if ($lastUsername = $authenticationUtils->getLastUsername()) {
-                       $form->get('mail')->setData($lastUsername);
+                       //Create the RecoverType form and give the proper parameters
+                       $recover = $this->createForm($this->config['recover']['view']['form'], null, [
+                               //Set action to recover route name and context
+                               'action' => $this->generateUrl($this->config['route']['recover']['name'], $this->config['route']['recover']['context']),
+                               'method' => 'POST'
+                       ]);
+
+                       //Set mail from login form
+                       $recover->get('mail')->setData($login->get('mail')->getData());
+
+                       //Add recover error
+                       $recover->addError(new FormError(
+                               $this->translator->trans('Use this form to recover your account')
+                       ));
+
+                       //Add recover form to context
+                       $context['recover'] = $recover->createView();
                }
 
                //Render view
@@ -58,7 +114,7 @@ class DefaultController extends AbstractController {
                        //Template
                        $this->config['login']['view']['name'],
                        //Context
-                       ['form' => $form->createView(), 'error' => $error]+$this->config['login']['view']['context']
+                       ['login' => $login->createView()]+$context+$this->config['login']['view']['context']
                );
        }
 
@@ -87,7 +143,7 @@ class DefaultController extends AbstractController {
                                        $mail =& $this->config['recover']['mail'];
 
                                        //Generate each route route
-                                       foreach($mail['route'] as $route => $tag) {
+                                       foreach($this->config['recover']['route'] as $route => $tag) {
                                                //Only process defined routes
                                                if (empty($mail['context'][$tag]) && !empty($this->config['route'][$route])) {
                                                        //Process for recover mail url
@@ -118,7 +174,7 @@ class DefaultController extends AbstractController {
                                        $subjectContext = [];
 
                                        //Process each context pair
-                                       foreach($mail['context'] as $k => $v) {
+                                       foreach($mail['context']+$this->config['recover']['view']['context'] as $k => $v) {
                                                //Reinsert each context pair with the key surrounded by %
                                                $subjectContext['%'.$k.'%'] = $v;
                                        }
@@ -129,10 +185,10 @@ class DefaultController extends AbstractController {
                                        //Create message
                                        $message = (new TemplatedEmail())
                                                //Set sender
-                                               ->from(new NamedAddress($this->config['contact']['mail'], $this->config['contact']['name']))
+                                               ->from(new Address($this->config['contact']['mail'], $this->config['contact']['name']))
                                                //Set recipient
                                                //XXX: remove the debug set in vendor/symfony/mime/Address.php +46
-                                               ->to(new NamedAddress($mail['context']['recipient_mail'], $mail['context']['recipient_name']))
+                                               ->to(new Address($mail['context']['recipient_mail'], $mail['context']['recipient_name']))
                                                //Set subject
                                                ->subject($mail['subject'])
 
@@ -141,7 +197,7 @@ class DefaultController extends AbstractController {
                                                ->textTemplate($mail['text'])
 
                                                //Set context
-                                               ->context(['subject' => $mail['subject']]+$mail['context']);
+                                               ->context(['subject' => $mail['subject']]+$mail['context']+$this->config['recover']['view']['context']);
 
                                        //Try sending message
                                        //XXX: mail delivery may silently fail
@@ -185,14 +241,11 @@ class DefaultController extends AbstractController {
                //Get doctrine
                $doctrine = $this->getDoctrine();
 
-               //Init not found
-               $notfound = 1;
+               //Init found
+               $found = false;
 
                //Retrieve user
-               if (($user = $doctrine->getRepository($this->config['class']['user'])->findOneByMail($slugger->unshort($recipient))) && $hash == $slugger->hash($user->getPassword())) {
-                       //User was found
-                       $notfound = 0;
-
+               if (($user = $doctrine->getRepository($this->config['class']['user'])->findOneByMail($slugger->unshort($recipient))) && $found = ($hash == $slugger->hash($user->getPassword()))) {
                        if ($request->isMethod('POST')) {
                                //Refill the fields in case the form is not valid.
                                $form->handleRequest($request);
@@ -223,7 +276,7 @@ class DefaultController extends AbstractController {
                                        $hash = $slugger->hash($encoded);
 
                                        //Generate each route route
-                                       foreach($mail['route'] as $route => $tag) {
+                                       foreach($this->config['recover_mail']['route'] as $route => $tag) {
                                                //Only process defined routes
                                                if (empty($mail['context'][$tag]) && !empty($this->config['route'][$route])) {
                                                        //Process for recover mail url
@@ -253,7 +306,7 @@ class DefaultController extends AbstractController {
                                        $subjectContext = [];
 
                                        //Process each context pair
-                                       foreach($mail['context'] as $k => $v) {
+                                       foreach($mail['context']+$this->config['recover_mail']['view']['context'] as $k => $v) {
                                                //Reinsert each context pair with the key surrounded by %
                                                $subjectContext['%'.$k.'%'] = $v;
                                        }
@@ -264,10 +317,10 @@ class DefaultController extends AbstractController {
                                        //Create message
                                        $message = (new TemplatedEmail())
                                                //Set sender
-                                               ->from(new NamedAddress($this->config['contact']['mail'], $this->config['contact']['name']))
+                                               ->from(new Address($this->config['contact']['mail'], $this->config['contact']['name']))
                                                //Set recipient
                                                //XXX: remove the debug set in vendor/symfony/mime/Address.php +46
-                                               ->to(new NamedAddress($mail['context']['recipient_mail'], $mail['context']['recipient_name']))
+                                               ->to(new Address($mail['context']['recipient_mail'], $mail['context']['recipient_name']))
                                                //Set subject
                                                ->subject($mail['subject'])
 
@@ -276,7 +329,7 @@ class DefaultController extends AbstractController {
                                                ->textTemplate($mail['text'])
 
                                                //Set context
-                                               ->context(['subject' => $mail['subject']]+$mail['context']);
+                                               ->context(['subject' => $mail['subject']]+$mail['context']+$this->config['recover_mail']['view']['context']);
 
                                        //Try sending message
                                        //XXX: mail delivery may silently fail
@@ -289,14 +342,14 @@ class DefaultController extends AbstractController {
                                        //Catch obvious transport exception
                                        } catch(TransportExceptionInterface $e) {
                                                //Add error message mail unreachable
-                                               $form->get('mail')->addError(new FormError($this->translator->trans('Account password updated but unable to contact: %mail%', array('%mail%' => $mail['context']['recipient_mail']))));
+                                               $form->get('password')->get('first')->addError(new FormError($this->translator->trans('Account password updated but unable to contact: %mail%', array('%mail%' => $mail['context']['recipient_mail']))));
                                        }
                                }
                        }
                //Accout not found
                } else {
                        //Add error message to mail field
-                       $form->get('mail')->addError(new FormError($this->translator->trans('Unable to find account: %mail%', ['%mail%' => $slugger->unshort($recipient)])));
+                       $form->addError(new FormError($this->translator->trans('Unable to find account: %mail%', ['%mail%' => $slugger->unshort($recipient)])));
                }
 
                //Render view
@@ -304,7 +357,7 @@ class DefaultController extends AbstractController {
                        //Template
                        $this->config['recover_mail']['view']['name'],
                        //Context
-                       ['form' => $form->createView(), 'sent' => $request->query->get('sent', 0), 'notfound' => $notfound]+$this->config['recover_mail']['view']['context']
+                       ['form' => $form->createView(), 'sent' => $request->query->get('sent', 0), 'found' => $found]+$this->config['recover_mail']['view']['context']
                );
        }
 
@@ -318,7 +371,7 @@ class DefaultController extends AbstractController {
                ));
 
                if ($request->isMethod('POST')) {
-                       // Refill the fields in case the form is not valid.
+                       //Refill the fields in case the form is not valid.
                        $form->handleRequest($request);
 
                        if ($form->isValid()) {
@@ -329,7 +382,7 @@ class DefaultController extends AbstractController {
                                $mail =& $this->config['register']['mail'];
 
                                //Generate each route route
-                               foreach($mail['route'] as $route => $tag) {
+                               foreach($this->config['register']['route'] as $route => $tag) {
                                        if (empty($mail['context'][$tag]) && !empty($this->config['route'][$route])) {
                                                $mail['context'][$tag] = $this->get('router')->generate(
                                                        $this->config['route'][$route]['name'],
@@ -349,7 +402,7 @@ class DefaultController extends AbstractController {
                                $subjectContext = [];
 
                                //Process each context pair
-                               foreach($mail['context'] as $k => $v) {
+                               foreach($mail['context']+$this->config['register']['view']['context'] as $k => $v) {
                                        //Reinsert each context pair with the key surrounded by %
                                        $subjectContext['%'.$k.'%'] = $v;
                                }
@@ -360,10 +413,10 @@ class DefaultController extends AbstractController {
                                //Create message
                                $message = (new TemplatedEmail())
                                        //Set sender
-                                       ->from(new NamedAddress($this->config['contact']['mail'], $this->config['contact']['name']))
+                                       ->from(new Address($this->config['contact']['mail'], $this->config['contact']['name']))
                                        //Set recipient
                                        //XXX: remove the debug set in vendor/symfony/mime/Address.php +46
-                                       ->to(new NamedAddress($mail['context']['recipient_mail'], $mail['context']['recipient_name']))
+                                       ->to(new Address($mail['context']['recipient_mail'], $mail['context']['recipient_name']))
                                        //Set subject
                                        ->subject($mail['subject'])
 
@@ -372,7 +425,7 @@ class DefaultController extends AbstractController {
                                        ->textTemplate($mail['text'])
 
                                        //Set context
-                                       ->context(['subject' => $mail['subject']]+$mail['context']);
+                                       ->context(['subject' => $mail['subject']]+$mail['context']+$this->config['register']['view']['context']);
 
                                //Get doctrine
                                $doctrine = $this->getDoctrine();