2012-03-30 16 views
-1

AJAX経由で完全に動作するヘッダにログイン/ログアウト機能を持つページがあるとします。AJAXログインフォーム、ログイン後のページコンテンツを更新する

ユーザーがログインしていない場合は、「Hey、login」を表示して、彼にajax経由でログインさせたいと考えています。それはすべて良いです、それは動作します。

しかし、ユーザがログインする場合、私は、ページ上に置く取得していない何もアクセスすることはできません - 。彼らは正常にログインしている場合、ユーザーがページにアクセスしたときにそこにあるコンテンツを

ページソースを表示すると要素がありますが、$("#container").show().slideDown().html()などのようなものを実行すると、何も実行していません。

ユーザーにページを更新させるか、すべてのコードをjavascriptに保存して展開する必要がありますか?私は望んでいない。

以下のログイン用に私のJavascriptを含めましたが、それは本当にポイントではありません。それは働いている。私が言うところでは$("#all").slideDown()が問題です。コンソールからアクセスしても、何もしません。

ユーザーがログインしていない場合、問題はおそらくPHPで死ぬに関連している。このコードは$(function() { }

コードで実行されます。すべての

/* Get the AJAX Login form Ready */ 
$("#login-form").submit(function() { 
    $("#login-error").hide(); 
    var username = $("#username").val(); 
    var password = $("#password").val(); 
    if (username == "" || password == "") { 
     $("#login-error").show(); 
     $("#login-error-heading").html("You've entered something wrong."); 
     $("#login-error-content").html("Please enter both a username and a password."); 
     return false; 
    } 
    $.get( 
     "process-login.php", 
     { 
      username:username, 
      password : password 
     }, function(data) { 
      if (data.success == 1) { 
       /* Hide the login form */ 
       $("#login").modal("hide"); 

       /* remove the login button */ 
       $('#nav-login').remove(); 

       /* add the logout button to the DOM */ 
       $("#nav-container").append('<ul id="user-options" class="nav pull-right"><li class="divider-vertical"></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Logged in as ' + data.username + '<b class="caret"></b></a><ul class="dropdown-menu"><li><a href="javascript:logout();">Logout</a></li></ul></li></ul>'); 

       $("#all").slideDown(); 
      } else { 
       $("#login-error").show(); 
       $("#login-error-heading").html("You've entered something wrong."); 
       if (data.success == 3) { 
        $("#login-error-content").html("This account is locked out because of incorrect password usage. Please try again in 10 minutes."); 
       } else { 
        $("#login-error-content").html("The username and password combination was not found."); 
       } 
      } 
     }, 
     "json" 
    ); 
    return false; 
}); 
+0

コードを表示できますか? – BenOfTheNorth

+0

ページがロードされると、javascript/jqueryをインクルードする必要があります。 ajax呼び出しを実行すると、サイトにログインしますが、ログインしたときにしか利用できないコードを使用しようとすると、リフレッシュが必要になることがあります。 –

+0

'.modal( 'hide')'はダイアログパネルを隠す正しい方法ですか?ダイアログにjqueryuiや別のプラグインを使用していますか? – Anthony

答えて

2

まず、私は考えていませんプレゼンテーションロジックを分割するには、AJAXを使用することをお勧めします。私は彼らが最初にログインしているかどうかを検出し、それに応じてビューを分離するためにPHPを使用します。

これを行うにはAJAXを使用する必要がある場合は、ログイン時に好きなのでリダイレクトすることをおすすめします。これは新鮮なスタートのようです。あなたがリダイレクトしたくない場合は、なぜあなたは次のように別の関数内のレイアウト変更のすべてを入れないでください:

function openSesame() { 
    $('div.welcome_page').slideUp(); 
    $('div.treasure_trove').show(); 
} 

そして、あなたのAJAXのsuccess設定でそれを呼び出します。

+0

実際にAJAXを使って分割しているわけではありません。基本的には、ユーザーがログインしている場合はPHPで内容をチェックしています。ログインしていない場合は、ログインするとエラーが発生します。それはうまく動作します。しかし、いったんログアウトすると、他に何も表示することはできません。 –

+0

@MichaelHogue:私はJamieに同意する必要があります。ログイン後、特にページが基本的に空の状態でログインすると、コンテンツをロードするためにajaxを使用すべきではありません。コンテンツが常に隠れているかのように私にはうんざりが与えられます。私はhuluのようなサイトがasynchのログインをどのようにしているのか好きですが、すべての例でそういうことを考えることができます。ログイン後の唯一の違いは、可視性の拡大です。 – Anthony

+1

サンプルコードなしで問題を検出することはできません。非同期ログインについては、私も同様に私を欺く。私はAJAXと一緒に仕事をしてきました。私はちょっと待っています。ありがとうございますが、HTTPSは関係ありません。 – hohner

0

あなたのページにJavaScriptエラーがあるようです。あなたのログインしているセクションがHTTPS経由で提供されていると仮定しています。その場合、javascriptの機能が.jsファイルに保存されている場合は、https上にjavascriptファイルを含める必要があります。

ネットワークパス参照(またはプロトコルに依存しないパス)を使用すると、この種のhttpsとhttpの問題を解決できます。

<script src="\\js\myJsFile.js"></script> 

編集:

あなたが発生したすべてのエラーをキャッチすることができるようにあなたが$アヤックス機能を試してみてください...これは実際にあなたの要求で何が起こっているかについての詳細を教えてくれかもしれません。

$.ajax({ 
    url: "process-login.php", 
    data: { 
     username: username, 
     password: password 
    }, 
    success: function (data) { 
     // your function 
    }, 
    error: function (jqXhr, error) { // see http://stackoverflow.com/a/1956505/296889 
     alert("readyState: " + jqXhr.readyState + "\nstatus: " + jqXhr.status); 
     alert("Response Received: " + jqXhr.responseText); 
    }, 
    dataType: 'json' 
}); 
+0

ありがとうございます。 –

0

コードなしでは、あまりできません。私はあなたが最初のバインド時に存在しなかった何かにバウンドイベントを使用しようとしていないことを確認するためにチェックします。 AJAXコールバックまで何かが存在しない場合は、ロードされた後にバインドする必要があります。

+0

私のコードを追加しましたが、エラーはないと思います。 –

0

私は間違っているかもしれませんが、DOM内の新しいコンテンツがjqueryイベントハンドラのいずれにもバインドされていないことが問題だと思います。将来の要素にイベントをバインドする方法がそうのように、.on()方法を使用することです:@jamieが言ったように、あなたがする必要がない場合

$("#dataTable tbody tr").on("click", function(event){ 
    alert($(this).text()); 
}); 
+0

私は新しいコンテンツを追加しませんでした。それはページソースにあります。私はそれがPHPで死ぬことに関連していると思います。おそらく起こっていることでしょう。 –

+1

コンテンツは既にページに読み込まれていて、隠されていますか?誰かがログイン前にソースを見たり、ajaxコールバック関数に "true"の値を渡すのを防ぐのは何ですか?あなたの問題をさらに詳しく、成功した後にコンテンツがまったく表示されますか?あなたは彼らがログインしていることをどのように知っていますか?おそらくコードを見る必要があります。 – Anthony

0

は、JSとビジネスロジックを混在させないでください。

これは、テンプレートエンジンを使用して、MVCに似たものを作成する必要がある場所です。 Smarty http://www.smarty.net/をチェックしてください。正式なMVCフレームワークが本当に必要な場合は、CakePHPまたはSymfonyを使うことができます。

リダイレクトする必要はありません。それはゆっくりで、ユーザーにとっては楽しくはありません。

はちょうどSmartyのを使用して擬似コードの例を見てみましょう:

global $smarty; 

//go grab your user object 
$user = PseudoUser::validate_current_user(); 
if($user->login_status === true) 
{ 
    //user is logged in 
    $smarty->assign('user', $user); 
    $smarty->display('logged_in_template.tpl'); 
} 
else 
{ 
    //user is logged out 
    $smarty->display('logged_out_template.tpl'); 
} 

バダビングパダブーム。

js ajaxログインでは、この場合はページを更新するだけです。あなたのPHPコントローラは、ページがリロードされたときに何をすべきかをすでに確立しているはずです。

関連する問題