このようなロジックを使用して、各ユーザーのプロファイルページにタブを配置し、ユーザーが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()アクセス許可テストです。)
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');
}
_
私は次のようなカスタムアクセスコールバックを使用してしまいました。
// 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定義を処理するメニューモジュールのロジックに依存します。その情報はキャッシュされませんか(キャッシュがオンになっている場合)?