The Views module uses hook_menu_alter()
to add its pages. That is why hide_tabs_menu_alter()
doesn't work: views_menu_alter()
is invoked after hide_tabs_menu_alter()
, and the changes made from your module are overridden from the Views module.
You need to change the order hooks are executed, implementing hook_module_implements_alter()
or changing module weight.
function hide_tabs_module_implements_alter(&$implementations, $hook) {
if ($hook == 'menu') {
$group = $implementations['hide_tabs'];
unset($implementations['hide_tabs']);
$implementations['hide_tabs'] = $group;
}
}
As side note, rather than checking for a role, you should:
- Create a user permission you assign to a specific role you use for those users who should see that page/view
- Through the user interface, create a new role you assign just to those users who should see that page/view
To create a new user permission, your module needs to implement hook_permission()
(Drupal 7.x) or hook_perm()
(Drupal 6.x or previous). In your specific case, the permission would be two:
- View own info page
- View any info page
This is similar to what the Node module does, which defines the following permissions for each content type: edit own $type content and edit any $type content.
In your case, you cannot use user_access()
as access callback, since that function can just check a single permission, which is then applied to every user. The code you would use should be similar to the following one.
function hide_tabs_user_info_access($account) {
global $user;
if ($account->uid == $user->uid) {
// The logged-in user is viewing the page for their own account.
return user_access('view own info page', $account);
}
else {
// The logged-in user is viewing somebody else's page.
return user_access('view any info page', $account);
}
// The previous lines can be simplified to the following one.
// $permission = ($account->uid == $user->uid ? 'view own info page' : 'view any info page');
// return user_access($permission, $account);
}
This is the code I would write.
function hide_tabs_module_implements_alter(&$implementations, $hook) {
if ($hook == 'menu') {
$group = $implementations['hide_tabs'];
unset($implementations['hide_tabs']);
$implementations['hide_tabs'] = $group;
}
}
function hide_tabs_menu_alter(&$items) {
if (isset($items['user/%user/infos'])) {
$items['user/%user/infos']['access callback'] = '';
$items['user/%user/infos']['access arguments'] = array(1);
}
}
function hide_tabs_user_info_access($account) {
global $user;
$permission = ($account->uid == $user->uid ? 'view own info page' : 'view any info page');
return user_access($permission, $account);
}
(I will leave as exercise the implementation of hook_permission()
.)
Another error in your code is checking in hook_menu_alter()
if the currently logged-in user has a role. That doesn't work because hook_menu_alter()
is not always invoked; it is invoked when the information returned from hook_menu()
needs to be re-build. You are not checking the role the logged-in user has, but the role of the user who is logged-in when Drupal re-builds the hook_menu()
information.