-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 And here's an example of how you would get the right menu callback : <?php define('item', '__item'); $menu[item] = array('title' => 'root page', 'callback' => 'root_page'); $menu['node'][item] = array('title' => 'listing', 'callback' => 'node_listing'); $menu['node']['add']['blog']['here'][item] = array('title' => 'blog entry', 'callback' => 'some_func' ); $menu['node']['add'][item] = array('title' => 'create content', 'callback' => 'node_page'); $path = explode('/', $_GET['q']); $q = $path; while (sizeof($q)) { $vars = array(); $page = array(); $current = $menu; foreach ($q as $i) { if (array_key_exists($i, $current)) { $page[] = $i; $current = $current[$i]; } else { break; } } if (array_key_exists(item, $current)) { $callback = $current[item]['callback']; $args = array_slice($path, sizeof($page)); break; } array_pop($q); } print_r(array('callback' => $callback, 'args' => $args)); ?> Another thing that's interesting about this code, is that we can set up a root menu handler ie $menu[item] = array(/* stuff */); Which might end up being a cleaner way of doing the variable_get ('site_frontpage') stuff. On 19 Jun 2005, at 12:04 AM, Adrian Rossouw wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Instead of defining menu's as we do now (using 'path' => ) , why don't we skip the entire building a tree thing and just define the menu entries as trees to begin with?
ie : $menu['node']['add']['blog'][ITEM] = array(title => t('blog entry'), access => user_access('edit own blog')); $menu['blog'][ITEM] = array(title => t('blogs'), callback => 'blog_page', access => user_access('access content'), type => MENU_SUGGESTED_ITEM);
(ITEM would just be a define('ITEM', '__item') to avoid namespace conflicts.)
This would mean we could 'build' the menu, just by :
$_menu = array(); foreach (module_implements('menu') as $module) { $_menu = array_merge_recursive($_menu, module_invoke($module, 'menu')); }
Furthermore, we could solve the multiple menu tree requirement by defining menu items for the primary navigation such as : $menu[PRIMARY]['node']['add']['blog'] = array(title => t('new post!'), access => user_access('edit own blog'));
It might also simplify the menu system to the point where mere mortals can understand it =)
- -- Adrian Rossouw Drupal developer and Bryght Guy http://drupal.org | http://bryght.com
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (Darwin)
iD8DBQFCtJp7gegMqdGlkasRAsY/AJwJARgxJz3zgNQnySSM54XqYi3bDgCgo7ml ewl/EPrMJRsafBJrqQdQxaA= =wlf3 -----END PGP SIGNATURE-----
- -- Adrian Rossouw Drupal developer and Bryght Guy http://drupal.org | http://bryght.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (Darwin) iD8DBQFCtK9rgegMqdGlkasRAp4+AKCjrOeURlhdKEdFwePqZDWCLjMI5QCfRErf fehRWUg9pGhkS2/Au9cRi+s= =Wt8F -----END PGP SIGNATURE-----