1

ユーザーがログインして自分のページを好きにできるphpページを作成しようとしています。ブロックでlogin_urlを使用すると、うまく機能します。

ただし、特にロケールを渡すことができ、適切な言語にローカライズされるため、公式のFacebookログインボタンを使用したいと思います....そして見栄えが良いです!

いくつかの調査を行うと、php のログイン状態が js のログイン状態と同期していないように見えますが、コードの断片しか見たことがありません (そのほとんどは廃止されたバージョンの API を使用しています)。

Facebookのログインボタンを$login_urlと同じようにするためにここで何をする必要があるかについて、誰かが私を正しい方向に向けることができますか?

現在、次の動作を観察しています。

  1. ページを開くとログインボタンとリンクが表示されます
  2. ログインボタンをクリックしてログインします
  3. PHPコードはまだユーザーがログインしていないと考えているため、ログインボタンが表示されます
  4. ログインリンクをクリックするまで正しくログインできず、リロード時にログイン ボタンが消えます。

現在、ボタンをクリックするとページがリロードされるだけで、ユーザーにログインを求めることさえありません。ユーザーがログインボタンを使用してログインしている場合、ページのphp部分はユーザーがログインしていないと見なします...

<?php 

require("facebook/facebook.php");

$locale = "en_US"; // TODO

$connect_facebook_url = "'//connect.facebook.net/" . $locale . "/all.js#xfbml=1&appId=XXXXXXXXXXXXXXXXXXXXXXX'";

$facebook = new Facebook(array(
  "appId"  => "XXXXXXXXXXXXXX",
  "secret" => "XXXXXXXXXXXXXXXXX",
  "cookie" => true,
));

$access_token = $facebook->getAccessToken(); 

// Get User ID
$user_id = $facebook->getUser();

if($user_id) 
{
  // We have a user ID, so probably a logged in user.
  // If not, we'll get an exception, which we handle below.
  try 
  {
    $user_profile = $facebook->api('/me','GET');

    $likes = $facebook->api(array( 
      'method' => 'fql.query',
      'query' => 'SELECT page_id FROM page_fan WHERE uid = "'
                 . $user_profile['id']
                 . '" AND page_id="XXXXXXXXXXXXX"', )); 

  } 
  catch(FacebookApiException $e) 
  {
    // If the user is logged out, you can have a 
    // user ID even though the access token is invalid.
    // In this case, we'll get an exception, so we'll
    // just ask the user to login again here.
    $login_url = $facebook->getLoginUrl(); 
    error_log($e->getType());
    error_log($e->getMessage());
  }   
} 
else 
{
  // No user, print a link for the user to login
  $login_url = $facebook->getLoginUrl();
}

if(count($likes) > 0) 
{
  $likes_result = "User likes this page"; 
}
else 
{
  $likes_result = "User doesnt like this page";
}

if($login_url)
{
  $login_string = '<a href="' . $login_url . '">' . 'IDST_MENUITEM_SIGN_IN' . '</a>';
}

?>

<html>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
<div id="fb-root"></div>
<script>
  (function(d, s, id) 
  {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = 
    <?php echo $connect_facebook_url; ?>
    ;
    fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));
</script>

<body bgcolor="#000000">

<div align="center">
  <table>
  <tbody>
  <tr>
    <td>    
      <img src="http://www.myapp.com/wp-content/uploads/2012/05/MyApp-logo.png"/>
    </td>
    <td style="align:left; vertical-align:middle">
      <p style="font-family:segoe ui;color:white;font-size:40px;">MyApp</p>
    </td>
  </tr>
  </tbody></table>
</div>

<p>&nbsp<p>

<div align="center" style="font-family:segoe ui;color:white;font-size:20px;">
  <?php if ($login_string) : ?>
    <div class="fb-login-button" size="xlarge" data-width="200"></div>
  <?php else: ?>
    <div class="fb-like" 
         data-href="https://www.facebook.com/MyApp" 
         data-width="200" 
         data-colorscheme="dark" 
         data-show-faces="true" 
         data-send="true">
    </div>
  <?php endif; ?>

  <br>

  <p>
    <?php echo $likes_result; ?>
  </p>
  <p>
    <?php echo 'Please <a href="' . $login_url . '">login.</a>'; ?>
  </p>
</div>

</body>
</html>
4

3 に答える 3

2

そこに行きます。お役に立てれば

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <style type="text/css">
      div#container_notlike, div#container_like {
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="fb-root"></div>
    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : 'YOUR_APP_ID', // App ID
          channelUrl : 'http(s)://YOUR_APP_DOMAIN/channel.html', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });

        FB.getLoginStatus(function(response) {
          var page_id = "YOUR_PAGE_ID";
          if (response && response.authResponse) {
            var user_id = response.authResponse.userID;
            var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
            FB.Data.query(fql_query).wait(function(rows) {
              if (rows.length == 1 && rows[0].uid == user_id) {
                console.log("LIKE");
                $('#container_like').show();
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            });
          } else {
            FB.login(function(response) {
              if (response && response.authResponse) {
                var user_id = response.authResponse.userID;
                var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
                FB.Data.query(fql_query).wait(function(rows) {
                  if (rows.length == 1 && rows[0].uid == user_id) {
                    console.log("LIKE");
                    $('#container_like').show();
                  } else {
                    console.log("NO LIKEY");
                    $('#container_notlike').show();
                  }
                });
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            }, {scope: 'user_likes'});
          }
        });
      };

      // Load the SDK Asynchronously
      (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
      }(document));
    </script>

    <div id="container_notlike">
      YOU DON'T LIKE ME :(
    </div>

    <div id="container_like">
      YOU LIKE ME :)
    </div>

  </body>
</html>

「YOUR_PAGE_ID」をページ ID に置き換えます。

if (rows.length == 1 && rows[0].uid == user_id) {
                        console.log("LIKE");
                        $('#container_like').show();
                        //window.location=YOURPHP.php    

window.location を使用すると、必要がなければ YOURPHP.pho にリダイレクトされます。

use ajax here in the code.

$.post("database.php",{userid: user_id, likes:1"},
  function(data,status){
  console.log(data);
console.log("LIKE");
  $('#container_like').show();
  posttofacebook(caption);
  document.getElementById("captionresult").innerHTML=data;
}); 
                      }

これについて提案の質問や疑問がある場合は.. お気軽にお問い合わせください。

于 2013-09-18T13:18:04.000 に答える
1

私は同じ問題を抱えていて、単純な1行の設定で解決しました:

FB.init には xbmfl のデフォルト値が設定されていないため、デフォルトで false に設定され、ソーシャル アイコンはレンダリングされません。追加するだけ

$facebook = new Facebook(array(
  "appId"  => "XXXXXXXXXXXXXX",
  "secret" => "XXXXXXXXXXXXXXXXX",
  "cookie" => true,
  "xbmfl" => true
));

Facebook の初期化ドキュメントによると: XBMFL: ソーシャル プラグインで使用される XFBML タグが解析されるかどうか、したがってプラグインがレンダリングされるかどうかを決定します。デフォルトは false です。

于 2015-04-20T18:10:18.627 に答える
1

セッションを使ってみる

if($user_id) {
    try {
        $user_profile = $facebook->api('/me','GET');
        $_SESSION['user'] = $user_profile['id'];
    }
}

次に、html ページに以下を追加できます。

    <?php if(isSet($_SESSION['user'])) { ?>
         ここにあなたのhtmlコンテンツ
    <?php}?>

セッションが開始されていない場合は、ページの最初に session_start() を追加してください。これが役立つことを願っています

于 2013-09-18T07:54:56.477 に答える