Cuando se usa node_view () para mostrar un nodo (a través del retorno de una función que se llama en hook_menu ()), faltan las pestañas Ver/Editar habituales.
¿Es este el comportamiento esperado?
Sí, esto se espera. La razón por la que están allí es porque la ruta de vista de un nodo está en node/[nid]
y la edición/vista está en node/[nid]/edit
. Si cambia la ruta de nodo predeterminada con hook_menu_alter, las pestañas de todos los nodos desaparecerían.
La razón por la que están allí es porque son de tipo, MENU_LOCAL_TASK
, consulte la documentación en hook_menu
, si necesita saber más.
Es el comportamiento esperado. node_view () El propósito es construir la vista de nodo, no crear también las otras pestañas que normalmente ve en http://example.com/node/<nid>
.
Si desea emular lo que se hizo en una página de nodo, debe definir la siguiente estructura de menú (he elegido page
al azar):
/**
* 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()
es la devolución de llamada de página que llamaría node_view()
.
Para mover todas las pestañas potenciales agregadas por los módulos a un nodo y hacerlas visibles en otra nueva ruta personalizada, modifique los enlaces dinámicamente cuando se reconstruya el enrutador de la caché del menú.
Pegue lo siguiente en un módulo:
/**
* 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]);
}
}
}