I've called this module 'stadtinfo_subpage'.
It creates a tab menu item, registers a path alias for it and lets you change the template to suit you ..
/** * Implements hook_menu(). */ function stadtinfo_subpage_menu() { // use %node so we have the full $node for use // without having to use load_node($nid) on callbacks $items["node/%node/info"] = array( 'title' => 'Information', 'page callback' => 'stadtinfo_subpage_page_callback', 'page arguments' => array(1), 'access callback' => 'stadtinfo_subpage_access_callback', 'access arguments' => array(1, 'access content'), 'type' => MENU_CALLBACK, // tab instead of MENU_LOCAL_TASK 'weight' => '1000', // last tab item ); return $items; } /** * Page Callback */ function stadtinfo_subpage_page_callback($node) { if($node->type == 'stadt') { drupal_set_title('Stadtinfo: ' . $node->title); return theme('stadtinfo_subpage_template', array('node' => $node)); } drupal_not_found(); return; } /** * Create the access callback */ function stadtinfo_subpage_access_callback($node) { if($node->type != 'stadt' || arg(2) == 'edit'){ return FALSE; } else { return TRUE; } } /** * Implements hook_theme(). */ function stadtinfo_subpage_theme($existing, $type, $theme, $path) { return array( 'stadtinfo_subpage_template' => array( 'template' => 'stadtinfo_subpage_template', 'variables' => array('node' => NULL), ), ); } function theme_stadtinfo_subpage_template($variables) { $node = $variables['node']; $build = node_view($node); $output = drupal_render($build); return $output; } /** * Implements hook_pathauto. */ function stadtinfo_subpage_pathauto($op) { $settings = new stdClass(); $settings->module = 'stadtinfo_subpage'; $settings->groupheader = t('Stadt Subpage Paths'); $settings->patterndescr = t('Default path pattern'); $settings->patterndefault = '[node:field-city-country:name]/[node:title]/info'; $settings->token_type = 'node'; $settings->patternitems = array('infos' => 'Stadt Subpage pattern'); $settings->batch_update_callback = 'stadtinfo_subpage_pathauto_bulkupdate'; return $settings; } /** * helper function to create the alias */ function stadtinfo_subpage_create_alias($node, $op) { module_load_include('inc', 'pathauto'); pathauto_create_alias('stadtinfo_subpage', $op, 'node/' . $node->nid . '/info', array('node' => $node), 'infos'); } /** * Implements hook_node_insert. */ function stadtinfo_subpage_node_insert($node) { if($node->type == 'stadt') { stadtinfo_subpage_create_alias($node, 'insert'); } } /** * Implements hook_node_update. */ function stadtinfo_subpage_node_update($node) { if($node->type == 'stadt') { stadtinfo_subpage_create_alias($node, 'update'); } } /** * Implements hook_pathauto_bulkupdate. */ function stadtinfo_subpage_pathauto_bulkupdate() { // find all node ids for the store content type $query = db_select('node', 'n'); $query ->condition('n.type', 'stadt') ->fields('n', array('nid')); $results = $query->execute()->fetchCol(); $count = 0; foreach($results as $nid) { $node = node_load($nid); stadtinfo_subpage_create_alias($node, 'bulkupdate'); $count++; } drupal_set_message($count . ' stadt subpages were updated.'); }