web-dev-qa-db-ja.com

fboauthを使用したFacebookフレンドリストのインポート

私は、ウェブサイトのFacebookでのログインを有効にするためにfboauthを使用しています。機能を実現する方法の概要は次のとおりです。

ユーザーがウェブサイトのFacebookログインボタンをクリックすると、Facebookログインページに移動します。 Facebookでログインした後、ユーザーはアプリ認証ページに移動し、そこでアプリに接続する許可を求めます。必要な権限が付与されると、ローカルアカウント(私のWebサイトのアカウント)が自動的に作成され、ユーザーはウェルカムページに戻ってパスワードを設定します。ユーザーはメールアドレスを確認する必要さえありません。その後のアクセスで、ユーザーがログインリンクをクリックすると、同じFacebookのログインページが表示され、ログイン認証情報が提供されます。ログインに成功すると、ウェブサイトに戻ります。これまでのところ、すべてが fboauth モジュールで正常に機能しています。

私が今達成しようとしているのは、 fbconnect モジュールで見られるものと同様の機能です。ユーザーには、アプリで承認した友達のリストをインポートし、ローカルアカウント(Webサイトのアカウント)へのリンクを表示できるブロック/ページが提供されます。この機能を実現するには? fboauthモジュールには、利用可能な独自のAPIがあります。以下は、fboauthのAPIを使用して記述したものです。

<?php function mymodule_fboauth_actions() { $actions['mymodule_friend_import'] = array( 'title' => t('Imports your friends), 'callback' => 'mymodule_fboauth_action_friend_import', 'permissions' => array( 'user_friends', ), ); return $actions; } function mymodule_fboauth_action_friend_import($app_id, $access_token) { $result = fboauth_graph_query('me/friends?fields=name', $access_token); drupal_set_message(t('Import complete!')); } ?>

これにより、ユーザーのすべての友達がオブジェクトとして$ resultにインポートされます。ただし、ユーザーの対応するローカルアカウント(Webサイトのアカウント)にそれらの名前を表示するのが難しいと感じています。これは、phpに関する知識が不足しているためです。私が探しているのは、$ resultが値を受け取った後に挿入できる正確なコード行です。これにより、ユーザーの名前が私のWebサイトのプロファイルページへのリンクと共に表示されます。

3
Rana Prathap

あなたが持っているコードは友達の名前を返していますが、ユーザーの友達のいずれかが同じ名前を持っている場合は問題になる可能性があります(John SmithやMohammed Abdulのような名前が思い浮かびます)。

次のようにFacebookのユーザーIDを取得するには、フレンドのインポート関数を変更する必要があります。

function mymodule_fboauth_action_friend_import($app_id, $access_token) {
  $result = fboauth_graph_query('me/friends?fields=id', $access_token);
  drupal_set_message(t('Import complete!'));
}

ご指摘のとおり、fboauthには、facebookのユーザーIDをDrupalユーザーIDに変換するこのメソッドを含む便利なAPIがあります。

/**
 * Load a Drupal User ID given a Facebook ID.
 */
function fboauth_uid_load($fbid) {
  $result = db_query("SELECT uid FROM {fboauth_users} WHERE fbid = :fbid", array(':fbid' => $fbid));
  $uid = $result->fetchField();
  return $uid ? (int) $uid : FALSE;
}

Drupalユーザープロファイルの配列を作成するには、コードで次のように記述します。

$accounts = array();
foreach($result->data as $fbuid){
  $accounts[] = user_load(fboauth_uid_load($fbuid->id));
}

これらのプロファイルをどのように使用するかは、それらを表示する場所によって異なりますが、次のような方法でうまくいくはずです。

foreach($accounts as $account){
  print l($account->name, 'user/'.$account->uid);
}

すべてをまとめると、次のようなものになります。情報をどのように表示したいのかわからないので、いくつかの詳細を調整する必要があるかもしれません。

<?php
function mymodule_fboauth_actions() {
  $actions['mymodule_friend_import'] = array(
    'title' => t('Imports your friends'),
    'callback' => 'mymodule_fboauth_action_friend_import',
    'arguments' => array)
      'app_id' => MISSING,
      'access_token' => MISSING,
    ),
    'permissions' => array(
      'user_friends',
    ),
);
  return $actions;
}

function mymodule_fboauth_action_friend_import($app_id, $access_token) {
  $result = fboauth_graph_query('me/friends?fields=id', $access_token);
  drupal_set_message(t('Import complete!'));

  $accounts = array();
  foreach($result->data as $fbuid){
    $accounts[] = user_load(fboauth_uid_load($fbuid->id));
  }

  foreach($accounts as $account){
    print l($account->name, 'user/'.$account->uid);
  }
}

これが何も表示しない場合は、printがこのコンテキストで使用するのに不適切な関数であることを意味します。アイテムを表示する方法は、この関数を呼び出す場所と方法に完全に依存します。 hook_node_view()などのフックの一部である場合は、レンダリングする前にノードエンティティを編集できますが、(おそらく)この関数が画面を更新せずにバックグラウンドで実行されている場合は、JQueryを使用するか、 AJAX表示する関連アイテムを取得します。

DrupalがJQueryを使用する方法の説明については、 JavascriptとJQueryに関するこの投稿 で開始し、 Drupal の非フォーム要素にAJAXを構築することに関するこの投稿。

3
Darvanen