第7章 164ページ第7章 164ページ

訂正箇所:
第7章、164ページの図7-2以下

誤:

ダイレクトリンクを追加したくない場合は、hook_menu_alter()を使用して削除することが
できます。例えば次のコードは、「ノードの管理」 権限を持たないユーザからページを削除す
るコードです。

/**
 * hook_menu_alter()の実装
 */
function joke_menu_alter(&$callbacks) {
  // ユーザが「ノードの管理」権限を持たない場合、
  // access callbackをFALSEに設定してjokeメニュー項目を無効にする
  if (!user_access('administer nodes')) {
    $callbacks['node/add/joke']['access callback'] = FALSE;
    // デフォルトのアクセスコールバックとしてuser_access()を使用されないために、
    // access argumentsを破棄する必要がある
    unset($callbacks['node/add/joke']['access arguments']);
  }
}

正:

ダイレクトリンクを追加したくない場合は、hook_menu_link_alter()を使用して削除することが
できます。例えば次のコードは、「jokeの作成」ページへのダイレクトリンクを非表示にする
コードです。

/**
 * hook_menu_link_alter()の実装
 */
function joke_menu_link_alter(&$item, $menu) {
  // 「jokeの作成」ページへのダイレクトリンクを非表示にする
  if ($item['link_path'] == 'node/add/joke') {
    $item['hidden'] = 1;
  }
}

説明:

hook_menu_alter()はコールされる条件が特殊であり、Drupalリクエストのライフサイクルで必ずコールされるものではないため、例に挙げられているコードは意図したとおりに動作しません。
また、この段階ではモジュールにパーミッションが定義されていないため、パーミッションを用いた例は適当ではありません。

なお、この修正に伴い、セクションのタイトルも「menuコールバックの変更」から「ダイレクトリンクの削除」に変更となります。