load(); require_once( $GLOBALS['mosConfig_absolute_path'].'/administrator/components/com_joomap/classes/JoomapPlugins.php' ); JoomapPlugins::loadPlugins(); $joomap = new Joomap( $config ); $tree = $joomap->generateTree(); //$joomap->printDebugTree( $tree ); // DEBUG output $view = mosGetParam( $_REQUEST, 'view', 'html' ); switch( $view ) { case 'google': // Google Sitemaps output require_once( $GLOBALS['mosConfig_absolute_path'] .'/components/com_joomap/joomap.google.php' ); JoomapGoogle::printTree( $joomap, $tree ); break; default: // Html output global $mainframe; require_once( $mainframe->getPath('front_html') ); $mainframe->addCustomHeadTag( '' ); JoomapHtml::printTree( $joomap, $tree ); break; } /** * Generates a node-tree of all the Menus in Joomla! * This is the main class of the Joomap component. * @author Daniel Grothe * @access public */ class Joomap { /** @var JoomapConfig Configuration settings */ var $config; /** @var integer The current user's access level */ var $gid; /** @var boolean Is authentication disabled for this website? */ var $noauth; /** @var string Current time as a ready to use SQL timeval */ var $now; /** @var object Access restrictions for user */ var $access; /** Default constructor, requires the config as parameter. */ function Joomap( $config ) { global $acl, $my, $mainframe; $access = new stdClass(); $access->canEdit = $acl->acl_check( 'action', 'edit', 'users', $my->usertype, 'content', 'all' ); $access->canEditOwn = $acl->acl_check( 'action', 'edit', 'users', $my->usertype, 'content', 'own' ); $access->canPublish = $acl->acl_check( 'action', 'publish', 'users', $my->usertype, 'content', 'all' ); $this->access = &$access; $this->noauth = $mainframe->getCfg( 'shownoauth' ); $this->gid = $my->gid; $this->now = date( 'Y-m-d H:i:s', time() + $GLOBALS['mosConfig_offset'] * 60 * 60 ); $this->config = $config; } /** Generate a full website tree */ function &generateTree() { $menus = $this->config->getMenus(); $root = array(); foreach ( $menus as $menutype => $menu ) { if( !$menu->show ) continue; $node = new stdclass(); $node->ordering = $menu->ordering; $node->tree = $this->getMenuTree($menutype); if( count($node->tree) == 0 ) // ignore empty menus continue; $node->browserNav = 3; $node->type = 'separator'; $node->name = $this->getMenuTitle($menutype); // get the mod_mainmenu title from modules table $root[] = $node; // add the menu to the sitetree } usort($root, array('Joomap','sort_ordering')); //sort the root tree according to ordering return $root; } /** Get a Menu's tree * Get the complete list of menu entries where the menu is in $menutype. * If the component, that is linked to the menuentry, has a registered handler, * this function will call the handler routine and add the complete tree. * A tree with subtrees for each menuentry is returned. */ function &getMenuTree( &$menutype ) { global $database; if( strlen($menutype) == 0 ) { $result = null; return $result; } $menuExluded = explode( ',', $this->config->exclmenus ); // by mic: fill array with excluded menu IDs // echo '
[DEBUG excluded menus] ' . $this->config->exclmenus . '
'; /* * noauth is true: - Will show links to registered content, even if the client is not logged in. - The user will need to login to see the item in full. * noauth is false: - Will show only links to content for which the logged in client has access. */ $sql = "SELECT m.id, m.name, m.parent, m.link, m.type, m.browserNav, m.menutype, m.ordering, m.params, m.componentid, c.name AS component" . "\n FROM #__menu AS m" . "\n LEFT JOIN #__components AS c ON m.type='components' AND c.id=m.componentid" . "\n WHERE m.published='1' AND m.menutype = '".$menutype."'" . ( $this->noauth ? '' : "\n AND m.access <= '". $this->gid ."'" ) . "\n ORDER BY m.menutype,m.parent,m.ordering"; // Load all menuentries $database->setQuery( $sql ); $items = $database->loadObjectList(); if( count($items) <= 0) { //ignore empty menus $result = null; return $result; } $root = array(); foreach($items as $i => $item) { // Add each menu entry to the root tree. if( in_array( $item->id, $menuExluded ) ) { // ignore exluded menu-items continue; } $node = new stdclass; $node->tree = JoomapPlugins::getTree( $this, $item ); // Determine the menu entry's type and call it's handler $node->id = $item->id; $node->name = $item->name; // displayed name of node $node->parent = $item->parent; // id of parent node $node->browserNav = $item->browserNav; // how to open link $node->ordering = isset( $item->ordering ) ? $item->ordering : $i; // display-order of the menuentry $node->link = isset( $item->link ) ? htmlspecialchars( $item->link ) : ''; // convert link to valid xml $node->type = $item->type; // menuentry-type if( isset($item->modified) ) // getTree() might have added a modified date $node->modified = $item->modified; $root[ $node->id ] = $node; //add this node to the root tree } foreach($root as $node) { //move children into the tree of their parent if( $node->parent > 0 && isset($root[ $node->parent ]) ) { $root[ $node->parent ]->tree[] = &$root[ $node->id ]; } } foreach($root as $node) { //remove all children from the toptree if( $node->parent > 0) { unset( $root[ $node->id ] ); } } usort($root, array('Joomap','sort_ordering')); //sort the top tree according to ordering return $root; } /** Look up the title for the module that links to $menutype */ function getMenuTitle($menutype) { global $database; $query = "SELECT * FROM #__modules WHERE published='1' AND module='mod_mainmenu' AND params LIKE '%menutype=". $menutype ."%'"; $database->setQuery( $query ); if( !$database->loadObject($row) ) return ''; return $row->title; } /** Print tree details for debugging and testing */ function printDebugTree( &$tree ) { foreach( $tree as $menu) { echo $menu->name."
\n"; echo '
';
				print_r( $menu->tree );
				echo '
'; } } /** called with usort to sort menus */ function sort_ordering( &$a, &$b) { if( $a->ordering == $b->ordering ) return 0; return $a->ordering < $b->ordering ? -1 : 1; } }; ?>