page)){ if (count($wb->page) == 0 && defined('REFERRER_ID') && REFERRER_ID > 0) { global $database; $sql = 'SELECT * FROM `{TP}pages` WHERE `page_id` = '.REFERRER_ID.''; $result = $database->query($sql); if ($result->numRows() == 1) { $wb->page = $result->fetchRow(); } unset($result); } } if (is_array($wb->page)){ if (count($wb->page) == 0 && defined('REFERRER_ID') && REFERRER_ID > 0) { global $database; $sql = 'SELECT * FROM `{TP}pages` WHERE `page_id` = '.REFERRER_ID.''; $result = $database->query($sql); if ($result->numRows() == 1) { $wb->page = $result->fetchRow(); } unset($result); } } // fix up the menu number to default to the menu number // of the current page if no menu has been supplied if ($aMenu == 0) { $aMenu = $wb->page['menu'] == '' ? 1 : $wb->page['menu']; } // Set some of the $wb->page[] settings to defaults if not set $pageLevel = $wb->page['level'] == '' ? 0 : $wb->page['level']; $pageParent = $wb->page['parent'] == '' ? 0 : $wb->page['parent']; // adjust the start level and start page ID as necessary to // handle the special values that can be passed in as $aStart $aStartLevel = 0; if ($aStart < SM2_ROOT) { // SM2_CURR+N if ($aStart == SM2_CURR) { $aStartLevel = $pageLevel; $aStart = $pageParent; } else { $aStartLevel = $pageLevel + $aStart - SM2_CURR; $aStart = $CURR_PAGE_ID; } } elseif ($aStart < 0) { // SM2_ROOT+N $aStartLevel = $aStart - SM2_ROOT; //echo "

StartLEvel:$aStartLevel

"; $aStart = 0; } // adjust $aMaxLevel to the level number of the final level that // will be displayed. That is, we display all levels <= aMaxLevel. if ($aMaxLevel == SM2_ALL) { $aMaxLevel = 1000; } elseif ($aMaxLevel < 0) { // SM2_CURR+N $aMaxLevel += $pageLevel - SM2_CURR; } elseif ($aMaxLevel >= SM2_MAX) { // SM2_MAX+N $aMaxLevel += $aStartLevel - SM2_MAX; if ($aMaxLevel > $pageLevel) { $aMaxLevel = $pageLevel; } } else { // SM2_START+N $aMaxLevel += $aStartLevel - SM2_START; } // we get the menu data once and store it in a global variable. This allows // multiple calls to show_menu2 in a single page with only a single call to // the database. If this variable exists, then we have already retrieved all // of the information and processed it, so we don't need to do it again. if (($flags & SM2_NOCACHE) != 0 || !array_key_exists('show_menu2_data', $GLOBALS) || !array_key_exists($aMenu, $GLOBALS['show_menu2_data']) ) { global $database; // create an array of all parents of the current page. As the page_trail // doesn't include the theoretical root element 0, we add it ourselves. $rgCurrParents = explode(",", '0,'.$wb->page['page_trail']); array_pop($rgCurrParents); // remove the current page $rgParent = array(); // if the caller wants all menus gathered together (e.g. for a sitemap) // then we don't limit our SQL query $menuLimitSql = ' AND `menu`='.$aMenu; if ($aMenu == SM2_ALLMENU) { $menuLimitSql = ''; } // we only load the description and keywords if we have been told to, // this cuts the memory load for pages that don't use them. Note that if // we haven't been told to load these fields the *FIRST TIME* show_menu2 // is called (i.e. where the database is loaded) then the info won't // exist anyhow. $fields = '`parent`,`page_id`,`menu_title`,`page_title`,`link`,`target`,'; $fields .= '`level`,`visibility`,`viewing_groups`,'; $fields .= '`viewing_users`'; if ($flags & SM2_ALLINFO) { $fields = '*'; } // we request all matching rows from the database for the menu that we // are about to create it is cheaper for us to get everything we need // from the database once and create the menu from memory then make // multiple calls to the database. $sql = 'SELECT '.$fields.' FROM `{TP}pages` '; $sql .= 'WHERE '.$wb->extra_where_sql.' '.$menuLimitSql.' '; $sql .= 'ORDER BY `level` ASC, `position` ASC'; $sql = str_replace('hidden', 'IGNOREME', $sql); // we want the hidden pages // echo "
$sql
"; $oRowset = $database->query($sql); if (is_object($oRowset) && $oRowset->numRows() > 0) { // create an in memory array of the database data based on the item's parent. // The array stores all elements in the correct display order. while ($page = $oRowset->fetchRow()) { // ignore all pages that the current user is not permitted to view // 1. hidden pages aren't shown unless they are on the current page if ($page['visibility'] == 'hidden') { $page['sm2_hide'] = true; } // 2. all pages with no active sections (unless it is the top page) are ignored else if (!$wb->page_is_active($page) && $page['link'] != $wb->default_link && !INTRO_PAGE) { continue; } // 3. all pages not visible to this user (unless always visible to registered users) are ignored else if (!$wb->page_is_visible($page) && $page['visibility'] != 'registered') { continue; } if(!isset($page['tooltip'])) { $page['tooltip'] = $page['page_title']; } // ensure that we have an array entry in the table to add this to $idx = $page['parent']; // netter Versuch , aber macht die Ebenen struktur kaputt //if ($aStart==0) $idx =0; if (!array_key_exists($idx, $rgParent)) { $rgParent[$idx] = array(); } // mark our current page as being on the current path if ($page['page_id'] == $CURR_PAGE_ID) { $page['sm2_is_curr'] = true; $page['sm2_on_curr_path'] = true; if ($flags & SM2_SHOWHIDDEN) { // show hidden pages if active and SHOWHIDDEN flag supplied unset($page['sm2_hide']); } } // mark our current page as being on the maximum level to show if ($page['level'] == $aMaxLevel) { $page['sm2_is_max_level'] = true; } // mark parents of the current page as such if (in_array($page['page_id'], $rgCurrParents)) { $page['sm2_is_parent'] = true; $page['sm2_on_curr_path'] = true; if ($flags & SM2_SHOWHIDDEN) { // show hidden pages if active and SHOWHIDDEN flag supplied unset($page['sm2_hide']); // don't hide a parent page } } // add the entry to the array $rgParent[$idx][] = $page; } } unset($oRowset); // mark all elements that are siblings of any element on the current path foreach ($rgCurrParents as $x) { if (array_key_exists($x, $rgParent)) { foreach (array_keys($rgParent[$x]) as $y) { $mark =& $rgParent[$x][$y]; $mark['sm2_path_sibling'] = true; unset($mark); } } } // mark all elements that have children and are siblings of the current page $parentId = $pageParent; foreach (array_keys($rgParent) as $x) { $childSet =& $rgParent[$x]; foreach (array_keys($childSet) as $y) { $mark =& $childSet[$y]; if (array_key_exists($mark['page_id'], $rgParent)) { $mark['sm2_has_child'] = true; foreach ($rgParent[$mark['page_id']] as $z){ //echo "
"; print_r($z); echo "
"; if (!isset($z['sm2_hide'])){ //echo "nosmhide
"; $mark['sm2_has_unhidden_child'] = true; } } } if ($mark['parent'] == $parentId && $mark['page_id'] != $CURR_PAGE_ID) { $mark['sm2_is_sibling'] = true; } unset($mark); } unset($childSet); } // mark all children of the current page. We don't do this when // $CURR_PAGE_ID is 0, as 0 is the parent of everything. // $CURR_PAGE_ID == 0 occurs on special pages like search results // when no referrer is available.s if ($CURR_PAGE_ID != 0) { sm2_mark_children($rgParent, $CURR_PAGE_ID, 1); } // store the complete processed menu data as a global. We don't // need to read this from the database anymore regardless of how // many menus are displayed on the same page. if (!array_key_exists('show_menu2_data', $GLOBALS)) { $GLOBALS['show_menu2_data'] = array(); } $GLOBALS['show_menu2_data'][$aMenu] =& $rgParent; //echo "
"; print_r($rgParent); echo "
"; unset($rgParent); } /* // Deactivated only display to max level, not sure if its a good idea // adjust $aMaxLevel to the level number of the final level that // will be displayed. That is, we display all levels <= aMaxLevel. if ($aMaxLevel == SM2_ALL) { $aMaxLevel = 1000; } elseif ($aMaxLevel < 0) { // SM2_CURR+N $aMaxLevel += $pageLevel - SM2_CURR; } elseif ($aMaxLevel >= SM2_MAX) { // SM2_MAX+N $aMaxLevel += $aStartLevel - SM2_MAX; if ($aMaxLevel > $pageLevel) { $aMaxLevel = $pageLevel; } } else { // SM2_START+N $aMaxLevel += $aStartLevel - SM2_START; } */ // generate the menu $retval = false; // This was needed for Language based navigation if ($aStart == 0){ reset($GLOBALS['show_menu2_data'][$aMenu]); $aStart =key($GLOBALS['show_menu2_data'][$aMenu]); } //echo "
"; print_r($GLOBALS['show_menu2_data']); echo"
"; //echo "
START:"; print_r($aStart); echo"
"; if (array_key_exists($aStart, $GLOBALS['show_menu2_data'][$aMenu])) { //echo "

go!!

"; $formatter = $aItemOpen; if (!is_object($aItemOpen)) { static $sm2formatter; if (!isset($sm2formatter)) { $sm2formatter = new SM2_Formatter(); } $formatter = $sm2formatter; $formatter->set($flags, $aItemOpen, $aItemClose, $aMenuOpen, $aMenuClose, $aTopItemOpen, $aTopMenuOpen); } // adjust the level until we show everything and ignore the SM2_TRIM flag. // Usually this will be less than the start level to disable it. $showAllLevel = $aStartLevel - 1; if (isset($aOptions['notrim'])) { $showAllLevel = $aStartLevel + $aOptions['notrim']; } // display the menu $formatter->initialize(); sm2_recurse( $GLOBALS['show_menu2_data'][$aMenu], $aStart, // parent id to start displaying sub-menus $aStartLevel, $showAllLevel, $aMaxLevel, $flags, $formatter); $formatter->finalize(); // if we are returning something, get the data if (($flags & SM2_BUFFER) != 0) { $retval = $formatter->getOutput(); } } // clear the data if we aren't caching it if (($flags & SM2_NOCACHE) != 0) { unset($GLOBALS['show_menu2_data'][$aMenu]); } if(defined('SM2_CORRECT_MENU_LINKS') && true){ $retval = sm2_correct_menu_links($retval); } return $retval; } function show_breadcrumbs( $aMenu = 0, $aStart = SM2_ROOT, $aMaxLevel = SM2_CURR, $aOptions = SM2_CRUMB, $aItemOpen = ' > [a][menu_title]', $aItemClose = '', $aMenuOpen = '', $aMenuClose = '', $aTopItemOpen = false, $aTopMenuOpen = false ) { //I have removed the comments of this function, the code is the same as the code of the show_menu2 function itself. global $wb; $flags = 0; if (is_int($aOptions)) { $flags = $aOptions; $aOptions = array(); } elseif (isset($aOptions['flags'])) { $flags = $aOptions['flags']; } else { $flags = SM2_TRIM; $aOptions = array(); @error_logs('show_menu2 error: $aOptions is invalid. No flags supplied!'); } if ($flags & 0xF == 0) { $flags |= SM2_TRIM; } if (0 == ($flags & _SM2_GROUP_1)) { @error_logs('show_menu2 error: $aOptions is invalid. No flags from group 1 supplied!'); $flags |= SM2_TRIM; } $CURR_PAGE_ID = defined('REFERRER_ID') ? REFERRER_ID : PAGE_ID; if (is_array($wb->page)){ if (count($wb->page) == 0 && defined('REFERRER_ID') && REFERRER_ID > 0) { global $database; $sql = 'SELECT * FROM `{TP}pages` WHERE `page_id` = '.REFERRER_ID.''; $result = $database->query($sql); if ($result->numRows() == 1) { $wb->page = $result->fetchRow(); } unset($result); } } if ($aMenu == 0) { $aMenu = $wb->page['menu'] == '' ? 1 : $wb->page['menu']; } $pageLevel = $wb->page['level'] == '' ? 0 : $wb->page['level']; $pageParent = $wb->page['parent'] == '' ? 0 : $wb->page['parent']; $aStartLevel = 0; if ($aStart < SM2_ROOT) { if ($aStart == SM2_CURR) { $aStartLevel = $pageLevel; $aStart = $pageParent; } else { $aStartLevel = $pageLevel + $aStart - SM2_CURR; $aStart = $CURR_PAGE_ID; } } elseif ($aStart < 0) { $aStartLevel = $aStart - SM2_ROOT; $aStart = 0; } if ($aMaxLevel == SM2_ALL) { $aMaxLevel = 1000; } elseif ($aMaxLevel < 0) { $aMaxLevel += $pageLevel - SM2_CURR; } elseif ($aMaxLevel >= SM2_MAX) { $aMaxLevel += $aStartLevel - SM2_MAX; if ($aMaxLevel > $pageLevel) { $aMaxLevel = $pageLevel; } } else { $aMaxLevel += $aStartLevel - SM2_START; } if (($flags & SM2_NOCACHE) != 0 || !array_key_exists('show_menu2_data', $GLOBALS) || !array_key_exists($aMenu, $GLOBALS['show_menu2_data']) ) { global $database; $rgCurrParents = explode(",", '0,'.$wb->page['page_trail']); array_pop($rgCurrParents); $rgParent = array(); $menuLimitSql = ' AND `menu`='.$aMenu; if ($aMenu == SM2_ALLMENU) { $menuLimitSql = ''; } $fields = '`parent`,`page_id`,`menu_title`,`page_title`,`link`,`target`,'; $fields .= '`level`,`visibility`,`viewing_groups`,'; $fields .= '`viewing_users`'; if ($flags & SM2_ALLINFO) { $fields = '*'; } $sql = 'SELECT '.$fields.' FROM `{TP}pages` '; $sql .= 'WHERE '.$wb->extra_where_sql.' '.$menuLimitSql.' '; $sql .= 'ORDER BY `level` ASC, `position` ASC'; $sql = str_replace('hidden', 'IGNOREME', $sql); $oRowset = $database->query($sql); if (is_object($oRowset) && $oRowset->numRows() > 0) { while ($page = $oRowset->fetchRow()) { if ($page['visibility'] == 'hidden') { $page['sm2_hide'] = true; } else if (!$wb->page_is_active($page) && $page['link'] != $wb->default_link && !INTRO_PAGE) { continue; } else if (!$wb->page_is_visible($page) && $page['visibility'] != 'registered') { continue; } if(!isset($page['tooltip'])) { $page['tooltip'] = $page['page_title']; } $idx = $page['parent']; if (!array_key_exists($idx, $rgParent)) { $rgParent[$idx] = array(); } if ($page['page_id'] == $CURR_PAGE_ID) { $page['sm2_is_curr'] = true; $page['sm2_on_curr_path'] = true; if ($flags & SM2_SHOWHIDDEN) { unset($page['sm2_hide']); } } if ($page['level'] == $aMaxLevel) { $page['sm2_is_max_level'] = true; } if (in_array($page['page_id'], $rgCurrParents)) { $page['sm2_is_parent'] = true; $page['sm2_on_curr_path'] = true; if ($flags & SM2_SHOWHIDDEN) { unset($page['sm2_hide']); } } $rgParent[$idx][] = $page; } } unset($oRowset); foreach ($rgCurrParents as $x) { if (array_key_exists($x, $rgParent)) { foreach (array_keys($rgParent[$x]) as $y) { $mark =& $rgParent[$x][$y]; $mark['sm2_path_sibling'] = true; unset($mark); } } } $parentId = $pageParent; foreach (array_keys($rgParent) as $x) { $childSet =& $rgParent[$x]; foreach (array_keys($childSet) as $y) { $mark =& $childSet[$y]; if (array_key_exists($mark['page_id'], $rgParent)) { $mark['sm2_has_child'] = true; foreach ($rgParent[$mark['page_id']] as $z){ if (!isset($z['sm2_hide'])){ $mark['sm2_has_unhidden_child'] = true; } } } if ($mark['parent'] == $parentId && $mark['page_id'] != $CURR_PAGE_ID) { $mark['sm2_is_sibling'] = true; } unset($mark); } unset($childSet); } if ($CURR_PAGE_ID != 0) { sm2_mark_children($rgParent, $CURR_PAGE_ID, 1); } if (!array_key_exists('show_menu2_data', $GLOBALS)) { $GLOBALS['show_menu2_data'] = array(); } $GLOBALS['show_menu2_data'][$aMenu] =& $rgParent; unset($rgParent); } $retval = false; if ($aStart == 0){ reset($GLOBALS['show_menu2_data'][$aMenu]); $aStart =key($GLOBALS['show_menu2_data'][$aMenu]); } if (array_key_exists($aStart, $GLOBALS['show_menu2_data'][$aMenu])) { $formatter = $aItemOpen; if (!is_object($aItemOpen)) { static $sm2formatter; if (!isset($sm2formatter)) { $sm2formatter = new SM2_Formatter(); } $formatter = $sm2formatter; $formatter->set($flags, $aItemOpen, $aItemClose, $aMenuOpen, $aMenuClose, $aTopItemOpen, $aTopMenuOpen); } $showAllLevel = $aStartLevel - 1; if (isset($aOptions['notrim'])) { $showAllLevel = $aStartLevel + $aOptions['notrim']; } $formatter->initialize(); sm2_recurse( $GLOBALS['show_menu2_data'][$aMenu], $aStart, $aStartLevel, $showAllLevel, $aMaxLevel, $flags, $formatter); $formatter->finalize(); if (($flags & SM2_BUFFER) != 0) { $retval = $formatter->getOutput(); } } if (($flags & SM2_NOCACHE) != 0) { unset($GLOBALS['show_menu2_data'][$aMenu]); } if(defined('SM2_CORRECT_MENU_LINKS') && true){ $retval = sm2_correct_menu_links($retval); } return $retval; } function sm2_mark_children(&$rgParent, $aStart, $aChildLevel) { if (array_key_exists($aStart, $rgParent)) { foreach (array_keys($rgParent[$aStart]) as $y) { $mark =& $rgParent[$aStart][$y]; $mark['sm2_child_level'] = $aChildLevel; $mark['sm2_on_curr_path'] = true; sm2_mark_children($rgParent, $mark['page_id'], $aChildLevel+1); } } } function sm2_recurse( &$rgParent, $aStart, $aStartLevel, $aShowAllLevel, $aMaxLevel, $aFlags, &$aFormatter ) { global $wb; // on entry to this function we know that there are entries for this // parent and all entries for that parent are being displayed. We also // need to check if any of the children need to be displayed too. $isListOpen = false; $currentLevel = $wb->page['level'] == '' ? 0 : $wb->page['level']; // get the number of siblings skipping the hidden pages so we can pass // this in and check if the item is first or last $sibCount = 0; foreach ($rgParent[$aStart] as $page) { if (!array_key_exists('sm2_hide', $page)) $sibCount++; } $currSib = 0; foreach ($rgParent[$aStart] as $mKey => $page) { // skip all hidden pages if (array_key_exists('sm2_hide', $page)) { // not set if false, so existence = true continue; } $currSib++; // skip any elements that are lower than the maximum level $pageLevel = $page['level']; if ($pageLevel > $aMaxLevel) { continue; } // this affects ONLY the top level if ($aStart == 0 && ($aFlags & SM2_CURRTREE)) { if (!array_key_exists('sm2_on_curr_path', $page)) { // not set if false, so existence = true continue; } $sibCount = 1; } // trim the tree as appropriate if ($aFlags & SM2_SIBLING) { // parents, and siblings and children of current only if (!array_key_exists('sm2_on_curr_path', $page) // not set if false, so existence = true && !array_key_exists('sm2_is_sibling', $page) // not set if false, so existence = true && !array_key_exists('sm2_child_level', $page)) { // not set if false, so existence = true continue; } } else if ($aFlags & SM2_TRIM) { // parents and siblings of parents if ($pageLevel > $aShowAllLevel // permit all levels to be shown && !array_key_exists('sm2_on_curr_path', $page) // not set if false, so existence = true && !array_key_exists('sm2_path_sibling', $page)) { // not set if false, so existence = true continue; } } elseif ($aFlags & SM2_CRUMB) { // parents only if (!array_key_exists('sm2_on_curr_path', $page) // not set if false, so existence = true || array_key_exists('sm2_child_level', $page)) { // not set if false, so existence = true continue; } } // depth first traverse $nextParent = $page['page_id']; // display the current element if we have reached the start level if ($pageLevel >= $aStartLevel) { // massage the link into the correct form if(!INTRO_PAGE && $page['link'] == $wb->default_link) { $url = WB_URL; } else { $url = $wb->page_link($page['link']); } // we open the list only when we absolutely need to if (!$isListOpen) { $aFormatter->startList($page, $url); $isListOpen = true; } $aFormatter->startItem($page, $url, $currSib, $sibCount); } // display children as appropriate if ($pageLevel + 1 <= $aMaxLevel && array_key_exists('sm2_has_child', $page)) { // not set if false, so existence = true sm2_recurse( $rgParent, $nextParent, // parent id to start displaying sub-menus $aStartLevel, $aShowAllLevel, $aMaxLevel, $aFlags, $aFormatter); } // close the current element if appropriate if ($pageLevel >= $aStartLevel) { $aFormatter->finishItem($pageLevel, $page); } } // close the list if we opened one if ($isListOpen) { $aFormatter->finishList(); } } /** * sm2_correct_menu_links() * ====================================================================== * * @author Christian M. Stefan * @license GNU/GPL v.2 or any later * ---------------------------------------------------------------------- * * @param string $sMenu the prepopulated menu string * @return string the menu string with correctly replaced URLs * ---------------------------------------------------------------------- * */ function sm2_correct_menu_links($sMenu){ if(defined('SM2_CORRECT_MENU_LINKS') && true){ global $database; $aMenuLinks = array(); $rMenuLinks = $database->query("SELECT * FROM `{TP}mod_menu_link`"); $i = 0; if($rMenuLinks->numRows() > 0) { while($row = $rMenuLinks->fetchRow(MYSQL_ASSOC)) { //$aMenuLinks[$i] = $row; if(!empty($row['target_page_id'])){ $aMenuLinks[$i]['replace_url'] = get_page_link($row['target_page_id']).''.PAGE_EXTENSION; if(!empty($row['anchor'])){ $aMenuLinks[$i]['replace_url'] .= '#'.str_replace('#', '', $row['anchor']); } $aMenuLinks[$i]['replace_url'] = WB_URL.PAGES_DIRECTORY.$aMenuLinks[$i]['replace_url']; } if(!empty($row['extern'])){ $sTargetUrl = str_replace('[WB_URL]', WB_URL, $row['extern']); $aMenuLinks[$i]['replace_url'] = $sTargetUrl; } if(isset($aMenuLinks[$i]['replace_url'])){ $aMenuLinks[$i]['pagetree_url'] = $database->get_one("SELECT `link` FROM `{TP}pages` WHERE `page_id` = ".$row['page_id']); $aMenuLinks[$i]['pagetree_url'] = WB_URL.PAGES_DIRECTORY.$aMenuLinks[$i]['pagetree_url'].PAGE_EXTENSION; } $i++; } } if(!empty($aMenuLinks)){ $aReplacements = array(); foreach($aMenuLinks as $k => $link){ $aReplacements[$link['pagetree_url']] = $link['replace_url']; } $sMenu = strtr($sMenu, $aReplacements); } } return $sMenu; }