Drupal: remove link to forum container

Drupal

For anonymous users that don't have access to forums, I don't see why they should be able to access the forum container (and the message "no forums defined"). In order to send an anonymous user to a 403 page on /forum I first tried what I thought was the easiest, Drupal's drupal_access_denied(). This still rendered the action links, so I hid those first.

<?php
function MYTHEME_preprocess_page(&$vars) {

  if (
user_is_anonymous() && arg(0) == 'forum') {
    unset(
$vars['action_links']);
   
drupal_access_denied();
  }

}
?>

However, this led to a slew of errors in the logs. Using drupal_goto() worked better:

<?php
function MYTHEME_preprocess_page(&$vars) {

 
/* --- Deny access to /forum for anonymous users --- */
 
if (user_is_anonymous() && arg(0) == 'forum') {
    unset(
$vars['page']->sidebar_first);
   
watchdog('access denied', '/forum');
   
drupal_goto('error/403', array('query'=>drupal_get_destination()));
  }

}
?>

Since it didn't log an error, I added that. Since the page is rendered as a regular node, I removed the side bar region. But that still left the link to /forum visible.

How is that for simple.

Then I found the best answer on Drupal, a simple hook_menu_alter modification (that after a slight modification I added to a small module with other stuff.) It removes the link and denies access:

<?php
function MYMODULE_menu_alter(&$items) {

 
// Check access for forum menu item.
 
$items['forum']['access callback'] = 'user_is_logged_in';

}
?>

'Access callback' determines whether a user will have access to the forum container.

See user_is_logged_in().

Comments

While we are at it (also in the same Drupal comments) in order to prevent access to /node I used

<?php
function MYMODULE_menu_alter(&$items) {

  unset(
$items['node']);

}
?>

which will result in a 404. Using the access callback you can trigger a 403:

<?php
function MYMODULE_menu_alter(&$items) {

 
$items['node']['access callback'] = FALSE;

}
?>

Personally, I prefer serving a 404 not found page.

To get back on topic, using <?php unset('forum') ?> will result in a "no forums defined" message. Exactly how this all started.