ser /%user/viewへのアクセスを避けたいので、管理者だけがプロファイルを表示できます。最初は運が悪いので、user_view_accessパーミッションを変更してみました。
フックhook_menu_alterを使用しようとしました:
53 function mymenu_menu_alter(&$items) {
54 $items['user'] = array(
55 'access callback' => 'user_access',
56 'access arguments' => array('access administration pages'),
57 'type' => MENU_NORMAL_ITEM,
58 );
59 $items['user/%user_uid_optional'] = array(
60 'access callback' => 'user_access',
61 'access arguments' => array('access administration pages'),
62 'type' => MENU_NORMAL_ITEM,
63 );
64 $items['user/%user/view'] = array(
65 'access callback' => 'user_edit_access',
66 'access arguments' => array('access administration pages'),
67 'type' => MENU_NORMAL_ITEM,
68 );
どちらも機能しません。ヒントはありますか?
報告したコードには4つの問題があります。
array('access administration pages')
に設定するのは間違っています。array(1)
に設定する場合でも、user_edit_access()
を使用すると、ユーザーは自分のユーザープロファイルを表示できます。ユーザーに自分のユーザープロファイルを表示したくない場合、その関数はアクセスコールバックとして使用する関数ではありません。function mymenu_menu_alter(&$items) {
$items['user/%user/view']['access callback'] = FALSE;
}
function mymenu_user_view_access($account) {
return $account && $account->uid && user_access('administer users');
}
このトリックでは chain_menu_access モジュールを使用しました。以下のコード。
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
chain_menu_access_chain($items, 'user/%user', '_mymodule_check_permission');
}
function _mymodule_check_permission() {
global $user;
$own_profile = $user->uid == arg(1);
$has_access = user_access('administer users');
return (!$has_access && !$own_profile) ? FALSE : TRUE;
}
これは少し遅れますが、他の誰かが同じ問題を抱えている場合に備えて、ここに置いておきます:)
パスアクセス :
Drupalモジュールの多くはある程度のアクセス制御権限を提供しますが、ユーザーが持つ可能性のあるすべての要件をカバーすることは決してできません。Path_accessは、パスエイリアスに基づいてページを制限する手段を提供します。つまり、ロックアウトできます。ワイルドカードを使用したサイトのセクション全体からの特定のユーザー役割グループ。
しかし、最良のオプションであり、現在私のマスター.makeファイルの一番上にあるモジュールは Rabbit Hole -で、ノード、ユーザー、および分類用語のカスタムリダイレクトをサポートしています。
ウサギの穴は、エンティティが独自のページで表示されているときに何が起こるかを制御する機能を追加するモジュールです。
カルーセルに表示される画像コンテンツタイプのように、独自のページに表示されるべきではないコンテンツタイプがある可能性があります。 Rabbit Holeは、node/xxxを通じて、このノードが独自のページでアクセスできないようにすることができます。
最後に私は私が欲しかったものを達成しました:
function mymenu_menu_alter(&$items) {
$items['user/%user_uid_optional'] = array(
'page callback' => '_mymenu_profile_view',
'page arguments' => array(1),
'type' => MENU_LOCAL_TASK,
);
}
function _mymenu_profile_view($account) {
global $user;
if (user_access('administer users')) {
include_once(drupal_get_path('module', 'user').'/user.pages.inc');
return user_view($account);
} else {
return drupal_not_found();
}
}
あなたの提案をありがとう!
ユーザーが自分のプロファイルを編集できるが、表示できないようにする場合:
すでにPanelsモジュールを使用している場合、(選択ルールで)ユーザーが通常のパネルを表示するために必要な権限を持っていない場合(User:Permission => Logged in user has "View userプロファイル」)。 HTTP応答コードを選択し、user/%user:uid/edit
への301リダイレクトを選択します。
次に、CSSでビューボタンを非表示にするか、上記のコードを実装します。
function mymodule_menu_alter(&$items) {
$items['user/%user/view']['access callback'] = '_mymodule_user_view_access';
$items['user/%user/view']['access arguments'] = array(1);
}
function _mymodule_user_view_access($account) {
return $account && $account->uid && user_access('administer users');
}
または、いくつかの方法を使用してタブを削除します。以下はDrupal 7で動作するはずですが、正しい方法ではないか、副作用があると思います。
function mymodule_menu_local_tasks_alter(&$data) {
foreach ($data['tabs'][0]['output'] as $key => $value) {
if ($value['#link']['path'] == "user/%/view") {
unset($data['tabs'][0]['output'][$key]);
}
}
}