Creating a custom module that mimics the node full view

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.');
}
Attachment: