訂正箇所:
第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コールバックの変更」から「ダイレクトリンクの削除」に変更となります。