web-dev-qa-db-ja.com

ユーザーのプロファイルのMENU_LOCAL_TASKをユーザーのプロファイルにのみ表示する方法は?

このようなロジックを使用して、各ユーザーのプロファイルページにタブを配置し、ユーザーがWebAppの使用状況から分析を表示できるようにします。

  // maps a url to a sub-page of user's profile, url to user's Analytics-Management form
  $items['user/%user/ClientCompanyName'] = array(
    'title'            => 'ClientCompanyName',
    'description'      => 'Manage your ClientCompanyName services.',
    'page callback'    => 'drupal_get_form',
    'page arguments'   => array('_ClientCompanyName_mgmt_form'),
    'access callback'  => 'user_access',
    'access arguments' => array( 'access ClientCompanyName services' ), 
    'type' => MENU_LOCAL_TASK,
  );

これは各ユーザーにとってはうまく機能しますが、あるユーザーが別のユーザーのプロファイルに移動し、リンクをクリックして他のユーザーのプライベート分析データにアクセスできるようにしたくありません。

現在、ユーザーが別のユーザーのアナリティクス管理ページにアクセスしようとすると、アクセス拒否ページが表示されます。

しかし、私は彼らにそのページへのリンクが与えられることさえ絶対に望まない。独自の「アクセスコールバック」を作成してみましたが、目的のURLの「%user」部分を渡す方法がわからないため、ログインしているユーザーに対してテストできます...

URLで「%」記号を使用する方法が好きで、「ページ引数」を使用してURLでこれらの引数を参照できます。 「アクセス引数」で同様のことを行うことは可能ですか?

基本的に、ユーザーのプロファイルの[編集]タブの動作と同じことを実現しようとしています。ユーザーが自分のプロファイルページにいる場合にのみ、その[編集]タブがプロファイルに表示されます。 WebApp分析ページに同じ効果を得るにはどうすればよいですか?

(私は自分の分析ページをプロファイル編集フォームのMENU_LOCAL_TASKにすることができると思います...しかし、条件付きのMENU_LOCAL_TASKを作成する方法を知りたいのですが、条件付きのUSER_access()アクセス許可テストです。)

3
Blake Senftner

User_accessの代わりに、独自のアクセスコールバック関数を定義してから、それにユーザーオブジェクトを渡します。

したがって、_'access callback' => 'yourmodule_analytics_access'_および'access arguments' => array(1)です。

その関数で、ユーザーIDを比較しますand権限を確認します。

_function yourmodule_analytics_access($account) {
  global $user;
  return $user->uid == $account->uid && user_access('access ClientCompanyName services');
} 
_
6
Berdir

私は次のようなカスタムアクセスコールバックを使用してしまいました。

// this makes the analytics user profile tab's MENU_LOCAL_TAB conditional:
function _cex_mgmt_access($accessAllowed) {
  global $user;
  if (arg(1) != $user->uid)
    return false;
  return user_access($accessAllowed);
}

MENU_LOCAL_TASK定義の'access callback'パラメータが'_cex_mgmt_access'ではなく'user_access'に設定されている場合。

私はこの方法について少し不確かです。これは、ユーザーがプロファイルページに移動するたびに処理されるMENU_LOCAL_TASK定義を処理するメニューモジュールのロジックに依存します。その情報はキャッシュされませんか(キャッシュがオンになっている場合)?

1
Blake Senftner