Overriding Menu Page Callbacks

Sometimes you need to override more than a theme function: the entire page needs to be overridden. Drupal 6 makes it rather easy to do this.

In the example below, we call hook_menu_alter(&$callback) to override the display of every single node page view.

Instead of returning a node page, we return "[author's username] is great... for me to poop on.".


* Implementation of hook_menu_alter().
* !!!!!!!!!!!!!must rebuild menus to take effect !!!!!!!!!!!!!
function exampleModule_menu_alter(&$callbacks) {
$callbacks['node/%node']['page callback'] = 'fmtpo_page';
// it seems you have to override both when you're dealing with menu callback that is a default local task
$callbacks['node/%node/view']['page callback'] = 'fmtpo_page';

*See "menu wildcards" if you are wondering how node made it into there.
function fmtpo_page($node) {
// load the node's author's name -- this is personal...
$author = user_load(array( 'uid' => $node->uid));
'<h3>'.$author->name.' is great...  for me to poop on</h3>';

Discussion: Uses beyond telling authors they are great to poop on.

You can use this same technique to override anything defined in a menu array. The implication is that any page in drupal can be completely overridden -- whether its the menu callback, the access checking, or the page title.

The enterprising reader will no doubt think of applications of this technique that go far beyond this example.