2013-10-18 9 views
10

Symfony 2とFOS User Bundleのブートストラップモーダル内にすでにログインフォームを作成している人はいますか?ここでsymfony 2 FOSユーザバンドルブートストラップモーダルAJAXログイン

は、私が今持っているものです。

のsrc/Webibli/UserBundle /リソース/設定/ service.yml

authentication_handler: 
    class:  Webibli\UserBundle\Handler\AuthenticationHandler 
    arguments: [@router, @security.context, @fos_user.user_manager, @service_container] 

アプリ/設定/ security.ymlファイル

form_login: 
    provider: fos_userbundle 
    success_handler: authentication_handler 
    failure_handler: authentication_handler 

src/Webibli/UserBundle/Handler/AuthenticationHandler.php

<?php 

namespace Webibli\UserBundle\Handler; 

use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface; 
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Routing\RouterInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Routing\Router; 
use Symfony\Component\Security\Core\SecurityContext; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 


class AuthenticationHandler implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface 
{ 

    protected $router; 
    protected $security; 
    protected $userManager; 
    protected $service_container; 

    public function __construct(RouterInterface $router, SecurityContext $security, $userManager, $service_container) 
    { 
     $this->router = $router; 
     $this->security = $security; 
     $this->userManager = $userManager; 
     $this->service_container = $service_container; 

    } 
    public function onAuthenticationSuccess(Request $request, TokenInterface $token) { 
     if ($request->isXmlHttpRequest()) { 
      $result = array('success' => true); 
      $response = new Response(json_encode($result)); 
      $response->headers->set('Content-Type', 'application/json'); 
      return $response; 
     } 
     else { 
      // Create a flash message with the authentication error message 
      $request->getSession()->getFlashBag()->set('error', $exception->getMessage()); 
      $url = $this->router->generate('fos_user_security_login'); 

      return new RedirectResponse($url); 
     } 

     return new RedirectResponse($this->router->generate('anag_new')); 
    } 
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { 

     if ($request->isXmlHttpRequest()) { 
      $result = array('success' => false, 'message' => $exception->getMessage()); 
      $response = new Response(json_encode($result)); 
      $response->headers->set('Content-Type', 'application/json'); 
      return $response; 
     } 
     return new Response(); 
    } 
} 

そして、ここで私はブートストラップモーダルにロードしてい小枝図である:ログインフォームはAJAXせずに完全に正常に動作している

{% extends 'UserBundle::layout.html.twig' %} 
{% trans_default_domain 'FOSUserBundle' %} 
{% block user_content %} 
<script> 
    $('#_submit').click(function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type  : $('form').attr('method'), 
      url   : $('form').attr('action'), 
      data  : $('form').serialize(), 
      success  : function(data, status, object) { 
       console.log(status); 
       console.log(object.responseText); 
      } 
    }); 
}); 
</script> 
<div class="modal-dialog"> 
    <div class="modal-content"> 
     <form action="{{ path("fos_user_security_check") }}" method="post" role="form" data-async data-target="#rating-modal" class="text-left"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
      <h4 class="modal-title">{{ 'layout.login'|trans }}</h4> 
     </div> 
     <div class="modal-body"> 
      {% if error %} 
       <div>{{ error|trans }}</div> 
      {% endif %} 
      <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" /> 
      <div class="form-group container"> 
       <label for="email">{{ 'security.login.username_email'|trans }}</label> 
       <input type="text" class="form-control" id="username" name="_username" value="{{ last_username }}" required="required" placeholder="[email protected]"> 
      </div> 
      <div class="form-group container"> 
       <label for="password">{{ 'security.login.password'|trans }}</label><br /> 
       <input type="password" id="password" name="_password" required="required" class="form-control" placeholder="********"> 
      </div> 
      <div class="form-group container"> 
       <label for="remember_me"> 
        <input type="checkbox" id="remember_me" name="_remember_me" value="on" /> 
        {{ 'security.login.remember_me'|trans }} 
       </label> 
      </div> 
     </div> 
     <div class="modal-footer"> 
      <input type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans }}" class="btn btn-primary"> 
     </div> 
    </form> 
</div> 
</div> 
{% endblock %} 

。私は問題がある場合はモーダルで自分のフォームにエラーを取得しようとしているか、ログインが成功した場合にユーザーをリダイレクトしようとしています。

誰でもその達成方法を説明できますか?

+0

どの時点でAJAXが機能しないのですが、エラーコールバックを実装して、サーバーからどのような応答があったかを確認できます。 – joe42

+0

リクエストは機能しているので、私はいつも成功していますが、ログインが成功せず、Flashメッセージの代わりにJSFでSymfonyがエラーメッセージを返すようにする方法がわかりません。今のところ、AJAX呼び出しの応答は常に完全なHTMLページです。私はモーダルに入るコンテンツのみを必要とするため、迷惑です。 – f0x7ed

答えて

5

$('#_submit').click(function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type  : $('form').attr('method'), 
      url   : $('form').attr('action'), 
      data  : $('form').serialize(), 
      success  : function(data, status, object) { 
       if (data.sucess == false) { 
        $('.modal-body').prepend('<div />').html(data.message); 
       } else { 
        window.location.href = data.targetUrl; 
       } 
      } 
    }); 

また、あなたのonAuthenticationSuccess-法のisXmlHttpRequest-一部を変更する必要があります。ここで私はそれが間違っていた私のAjaxの方法からURLだったと思い、私はJavaScriptに追加するものです

<script> 
    $(document).ready(function(){ 
     $('#_submit').click(function(e){ 
      e.preventDefault(); 
      $.ajax({ 
       type  : $('form').attr('method'), 
       url   : '{{ path("fos_user_security_check") }}', 
       data  : $('form').serialize(), 
       dataType : "json", 
       success  : function(data, status, object) { 
        if(data.error) $('.error').html(data.message); 
       }, 
       error: function(data, status, object){ 
        console.log(data.message); 
       } 
      }); 
     }); 
    }); 
</script> 

そして、ここに私のハンドラからの私onAuthenticationFailure方法、

public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { 
    $result = array(
     'success' => false, 
     'function' => 'onAuthenticationFailure', 
     'error' => true, 
     'message' => $this->translator->trans($exception->getMessage(), array(), 'FOSUserBundle') 
    ); 
    $response = new Response(json_encode($result)); 
    $response->headers->set('Content-Type', 'application/json'); 

    return $response; 
} 

です。あなたのアドバイスをありがとう。

5

あなたが探しているのは、Symfony2 ajax loginです。

あなたのjavascriptはsthに見えます。このように:私は解決策を見つけた

[...] 
if ($request->isXmlHttpRequest()) { 
      $targetUrl = $request->getSession()->get('_security.target_path'); 
      $result = array('success' => true, 'targetUrl' => targetUrl); 
      $response = new Response(json_encode($result)); 
      $response->headers->set('Content-Type', 'application/json'); 
      return $response; 
     } 
[...] 
+0

良いスタートのようです。私はあなたの実装を試して、唯一の問題は、私は常に "真"の価値を持つ成功、偽物ではないということです... – f0x7ed

+0

細かい:解決策として私の答えにフラグを立ててもよろしいですか? –