2017-01-03 39 views
1

"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

FOSUserBundleが生成するトークンが必要なので、FOS方法を使用する必要がありますユーザーを有効にします。 – Borjeitor

答えて

0

あなただけの確認を自分でトークンと、まだアクティブでないユーザーにそれを設定し作成することができ、迅速ウィッヒを使用して、彼にメールを送信するように確認するためのリンクが含まれています

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

$message = $mailer->createMessage() 
    ->setSubject('Confirm registration') 
    ->setFrom('[email protected].com') 
    ->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); 

ユーザーが電子メール内のリンクをクリックしたときに、手動でトークンを生成し、アクティブなユーザーを設定することができます

...

$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')); 

    } 
関連する問題