2017-01-03 48 views
1

我已經創建了一個實體Event的表單,其中包含用戶的字段,如「email」和「password」,我用它在控制器中手動創建用戶。如何在未註冊的情況下在FOSUserBundle中使用郵件程序?

我可以創建事件和用戶沒有問題,但我需要發送確認郵件來啓用用戶。我可以從正常的註冊表格中完成,但在這裏我不知道該怎麼做。

對不起,如果我的英語不是很好。我正在學習它。

控制器:

class EventController extends Controller 
{ 

    public function ajaxAction(Request $request) { 
     if (! $request->isXmlHttpRequest()) { 
      throw new NotFoundHttpException(); 
     } 
     // Get the province ID 
     $id = $request->query->get('category_id'); 
     $result = array(); 
     // Return a list of cities, based on the selected province 
     $repo = $this->getDoctrine()->getManager()->getRepository('CASEventBundle:Subcategory'); 
     $subcategories = $repo->findByCategory($id, array('category' => 'asc')); 
     foreach ($subcategories as $subcategory) { 
      $result[$subcategory->getName()] = $subcategory->getId(); 
     } 
     return new JsonResponse($result); 
    } 

    public function indexAction(Request $request) {  
     $lead = new Lead(); 
     $em = $this->getDoctrine()->getManager(); 
     $user = $this->getUser(); 

     if(is_object($user)) { 
      $promotor = $em->getRepository('CASUsuariosBundle:Promotor')->find($user); 

      if (is_object($promotor)) { 
       $form = $this->createForm(new EventType($this->getDoctrine()->getManager()), $lead); 
       $template = "CASEventBundle:Default:event.html.twig"; 
       $isPromotor = true; 
      } 
     } else { 
      $form = $this->createForm(new LeadType($this->getDoctrine()->getManager()), $lead); 
      $template = "CASEventBundle:Default:full_lead.html.twig"; 
      $isPromotor = false; 
     } 

     if ($request->getMethod() == 'POST') { 
      $form->bind($request); 
      if ($form->isValid()) { 
       if($isPromotor === true) { 
        $type = $promotor->getType(); 
        $name = $user->getName(); 
        $lastname = $user->getLastName(); 
        $email = $user->getEmail(); 
        $password = $user->getPassword(); 
        $phone = $user->getPhone(); 
        $company = $promotor->getCompany(); 
        $lead->setEventType($type); 
        $lead->setPromotorName($name); 
        $lead->setPromotorLastName($lastname); 
        $lead->setPromotorEmail($email); 
        $lead->setPromotorPhone($phone); 
        $lead->setPromotorCompany($company); 
       } 
       $emailReg = $form->get('promotorEmail')->getData(); 
       $passwordReg = $form->get('promotorPassword')->getData(); 
       $nameReg = $form->get('promotorName')->getData(); 
       $typeReg = $form->get('promotorType')->getData(); 
       $lastnameReg = $form->get('promotorLastName')->getData(); 
       $phoneReg = $form->get('promotorPhone')->getData(); 
       $companyReg = $form->get('promotorCompany')->getData(); 

       if(!empty($emailReg) && !empty($passwordReg)) { 
        $userManager = $this->get('fos_user.user_manager'); 
        $newUser = $userManager->createUser(); 
        $newPromotor = new Promotor(); 

        $newUser->setUsername($emailReg); 
        $newUser->setEmail($emailReg); 
        $newUser->setName($nameReg); 
        $newUser->setLastname($lastnameReg); 
        $newUser->setPhone($phoneReg); 
        $newUser->setIsPromotor(true); 

        $encoder = $this->container->get('security.password_encoder'); 
        $encoded = $encoder->encodePassword($newUser, strval($passwordReg)); 
        $newUser->setPassword($encoded); 
        $userManager->updateUser($newUser); 
        $newPromotor->setType($typeReg); 
        $newPromotor->setCompany($companyReg); 
        $newPromotor->setIdPromotor($newUser); 
        $em->persist($newUser); 
        $em->persist($newPromotor); 
        $em->persist($lead); 
        $em->flush(); 

        //return $response; 
       } 
       $em->persist($lead); 
       $em->flush(); 
       return $this->redirect($this->generateUrl('CASEventBundle_create')); 
      } 
     } 
     return $this->render($template, array('form' => $form->createView())); 
    } 
} 
+0

從我瞭解的問題,你要發送一封電子郵件,確認登記,而無需使用FOS方式。如果我假設這是正確的,那麼你想使用swiftmailer來創建你自己的電子郵件:http://symfony.com/doc/current/email.html – KevinTheGreat

+0

不,我需要使用FOS方式,因爲我需要令牌FOSUserBundle生成以啓用用戶。 – Borjeitor

回答

0

你可以只創建一個確認令牌自己,將其設置爲未活躍的用戶,請給他使用SWIFT至極郵件包含一個鏈接,確認,如:

$confiToken = "123"; 
$url="http://url.com/confirm/$confiToken"; 
$user->setConfirmationToken($confiToken); 

$message = $mailer->createMessage() 
    ->setSubject('Confirm registration') 
    ->setFrom('[email protected]') 
    ->setTo($sendTo) 
    ->setBody(
     $this->renderView(
     'Bundle:Email:confirm.html.twig', 
     array(
      'headline' => "Confirm your registration", 
      "sendTo"=>$sendTo, 
      "name"=>false, 
      "date"=>$date, 
      "message"=>"here ist your confirmationlink ".$url." " 
      ) 
    ), 
    'text/html' 
); 
$mailer->send($message); 

當用戶點擊電子郵件中的鏈接,你可以手動生成令牌,並設置用戶活躍:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

...

$user=$em->getRepository("Bundle:User")->findOneByConfirmationToken($token); 
    if(!$user || $user->isEnabled()){ 
     throw $this->createNotFoundException("link out of date"); 
    }else { 
     $user->setEnabled(true); 
     $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles()); 
     $this->get('security.context')->setToken($token); 
     $this->get('session')->set('_security_main',serialize($token)); 

     $em->flush(); 
     return $this->redirect($this->generateUrl('core_customer_dashboard')); 

    } 
相關問題