web-dev-qa-db-ja.com

node_view()を使用してノードを表示すると、ローカルメニュー項目が印刷されない

Node_view()を使用してノードを表示する場合(hook_menu()で呼び出される関数からの戻りを介して)、通常の[表示/編集]タブがありません。

これは予想される動作ですか?

2
digital

はい、これは予想されています。それらが存在する理由は、ノードのビューのパスがnode/[nid]にあり、編集/ビューがnode/[nid]/editにあるためです。 hook_menu_alterでデフォルトのノードパスを変更した場合、すべてのノードのタブが消えます。

それらが存在する理由は、タイプがMENU_LOCAL_TASKであるためです。詳細については、 hook_menu のドキュメントをご覧ください。

3
googletorp

予想される動作です。 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()を呼び出すページのコールバックです。

3
kiamlaluno

モジュールによって追加される可能性のあるすべてのタブをノードに移動し、それらを別の新しいカスタムパスに表示するには、メニューキャッシュルーターが再構築されるときにリンクを動的に変更します。

以下をモジュールに貼り付けます:

    /**
 * 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]);
    }
  }
}
1
budda