Node_view()を使用してノードを表示する場合(hook_menu()で呼び出される関数からの戻りを介して)、通常の[表示/編集]タブがありません。
これは予想される動作ですか?
はい、これは予想されています。それらが存在する理由は、ノードのビューのパスがnode/[nid]
にあり、編集/ビューがnode/[nid]/edit
にあるためです。 hook_menu_alterでデフォルトのノードパスを変更した場合、すべてのノードのタブが消えます。
それらが存在する理由は、タイプがMENU_LOCAL_TASK
であるためです。詳細については、 hook_menu
のドキュメントをご覧ください。
予想される動作です。 node_view() の目的はノードビューを構築することであり、_http://example.com/node/<nid>
_に通常表示される他のタブも作成することではありません。
ノードページで行われた処理をエミュレートする場合は、次のメニュー構造を定義する必要があります(私はpage
をランダムに選択しました)。
_/**
* Implements hook_menu().
*/
function mymodule_menu() {
$items['page/%node'] = array(
'title callback' => 'node_page_title',
'title arguments' => array(1),
'page callback' => 'mymodule_page_view',
'page arguments' => array(1),
'access callback' => 'node_access',
'access arguments' => array('view', 1),
'type' => MENU_CALLBACK,
);
$items['page/%node/view'] = array(
'title' => 'View',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['page/%node/edit'] = array(
'title' => 'Edit',
'page callback' => 'mymodule_page_edit',
'page arguments' => array(1),
'access callback' => 'node_access',
'access arguments' => array('update', 1),
'weight' => 1,
'file' => 'node.pages.inc',
'file path' => drupal_get_path('module', 'node'),
'type' => MENU_LOCAL_TASK,
);
return $items;
}
_
mymodule_page_view()
は、node_view()
を呼び出すページのコールバックです。
モジュールによって追加される可能性のあるすべてのタブをノードに移動し、それらを別の新しいカスタムパスに表示するには、メニューキャッシュルーターが再構築されるときにリンクを動的に変更します。
以下をモジュールに貼り付けます:
/**
* Implementation of hook_menu_alter().
*/
function example_menu_alter(&$callbacks) {
foreach($callbacks as $path => $menu) {
$callbacks[$path];
if (strpos($path, 'node/%node/') !== FALSE) {
$newpath = str_replace('node/%node/', 'customurl/%/%/%/%node/', $path);
$callbacks[$newpath] = $menu;
unset ($callbacks[$path]);
}
}
}