eLinkList = array(); // clear the array in case getlinks is called 2x on the same page. $sql = e107::getDb('sqlSiteLinks'); $ins = ($cat > 0) ? "link_category = ". (int) $cat ." AND " : ""; $query = "SELECT * FROM #links WHERE ".$ins." ((link_class >= 0 AND link_class IN (".USERCLASS_LIST.")) OR (link_class < 0 AND ABS(link_class) NOT IN (".USERCLASS_LIST.")) ) ORDER BY link_order ASC"; if($sql->gen($query)) { while ($row = $sql->fetch()) { // if (substr($row['link_name'], 0, 8) == 'submenu.'){ // $tmp=explode('.', $row['link_name'], 3); // $this->eLinkList[$tmp[1]][]=$row; if (isset($row['link_parent']) && $row['link_parent'] != 0) { $this->eLinkList['sub_'.$row['link_parent']][]=$row; } else { $this->eLinkList['head_menu'][] = $row; if(!empty($row['link_function'])) { $parm = false; list($path,$method) = explode("::",$row['link_function']); if(strpos($method,"(")) { list($method,$prm) = explode("(",$method); $parm = rtrim($prm,")"); } if(file_exists(e_PLUGIN.$path."/e_sitelink.php") && include_once(e_PLUGIN.$path."/e_sitelink.php")) { $class = $path."_sitelink"; $sublinkArray = e107::callMethod($class,$method,$parm); //TODO Cache it. if(!empty($sublinkArray)) { $this->eLinkList['sub_'.$row['link_id']] = $sublinkArray; } } } } } } } /** * @return array */ function getLinkArray() { return $this->eLinkList; } /** * @param $cat * @param $style * @param $css_class * @return string|null */ function get($cat = 1, $style = null, $css_class = false) { global $pref, $ns, $e107cache, $linkstyle; $ns = e107::getRender(); $pref = e107::getPref(); $e107cache = e107::getCache(); $usecache = (!(trim(defset('LINKSTART_HILITE')) != "" || trim(defset('LINKCLASS_HILITE')) != "")); if($usecache && !strpos(e_SELF, e_ADMIN) && ($data = $e107cache->retrieve('sitelinks_' . $cat . md5($linkstyle . e_PAGE . e_QUERY)))) { return $data; } if(LINKDISPLAY == self::LINK_DISPLAY_SLIDER) { require_once(e_PLUGIN . 'ypslide_menu/ypslide_menu.php'); return null; } $this->getlinks($cat); if (empty($this->eLinkList)) { return ''; } // are these defines used at all ? if(!defined('PRELINKTITLE')) { define('PRELINKTITLE', ''); } if(!defined('PRELINKTITLE')) { define('POSTLINKTITLE', ''); } // ----------------------------- // where did link alignment go? if(!defined('LINKALIGN')) { define('LINKALIGN', ''); } if(empty($style)) { $style = array(); $style['prelink'] = defined('PRELINK') ? PRELINK : ''; $style['postlink'] = defined('POSTLINK') ? POSTLINK : ''; $style['linkclass'] = defined('LINKCLASS') ? LINKCLASS : ""; $style['linkclass_hilite'] = defined('LINKCLASS_HILITE') ? LINKCLASS_HILITE : ""; $style['linkstart_hilite'] = defined('LINKSTART_HILITE') ? LINKSTART_HILITE : ""; $style['linkstart'] = defined('LINKSTART') ? LINKSTART : ''; $style['linkdisplay'] = defined('LINKDISPLAY') ? LINKDISPLAY : ''; $style['linkend'] = defined('LINKEND') ? LINKEND : ''; $style['linkseparator'] = defined('LINKSEPARATOR') ? LINKSEPARATOR : ''; $style['sublinkstart'] = defined('SUBLINKSTART') ? SUBLINKSTART : ''; $style['sublinkend'] = defined('SUBLINKEND') ? SUBLINKEND : ''; $style['sublinkclass'] = defined('SUBLINKCLASS') ? SUBLINKCLASS : ''; } if(!varset($style['linkseparator'])) { $style['linkseparator'] = ''; } // Sublink styles.- replacing the tree-menu. if(isset($style['sublinkdisplay']) || isset($style['subindent']) || isset($style['sublinkclass']) || isset($style['sublinkstart']) || isset($style['sublinkend']) || isset($style['subpostlink'])) { foreach($style as $key => $val) { $aSubStyle[$key] = vartrue($style["sub" . $key]) ? $style["sub" . $key] : $style[$key]; } } else { $style['subindent'] = "  "; $aSubStyle = $style; } $text = "\n\n\n\n\n\n" . $style['prelink']; // php warnings if(!vartrue($this->eLinkList['head_menu'])) { $this->eLinkList['head_menu'] = array(); } $render_link = array(); if($style['linkdisplay'] != self::LINK_DISPLAY_OTHER) { foreach($this->eLinkList['head_menu'] as $key => $link) { $main_linkid = "sub_" . $link['link_id']; $link['link_expand'] = ((isset($pref['sitelinks_expandsub']) && $pref['sitelinks_expandsub']) && empty($style['linkmainonly']) && !defined("LINKSRENDERONLYMAIN") && isset($this->eLinkList[$main_linkid]) && is_array($this->eLinkList[$main_linkid])); $render_link[$key] = $this->makeLink($link, '', $style, $css_class); if(!defined("LINKSRENDERONLYMAIN") && !isset($style['linkmainonly'])) /* if this is defined in theme.php only main links will be rendered */ { $render_link[$key] .= $this->subLink($main_linkid, $aSubStyle, $css_class); } } if(!isset($style['linkseparator'])) { $style['linkseparator'] = ''; } $text .= implode($style['linkseparator'], $render_link); $text .= $style['postlink']; if($style['linkdisplay'] == self::LINK_DISPLAY_MENU) { $text = $ns->tablerender(LAN_SITELINKS_183, $text, 'sitelinks', true); } } else // link_DISPLAY_3 { foreach($this->eLinkList['head_menu'] as $link) { if(!count($this->eLinkList['sub_' . $link['link_id']])) { $text .= $this->makeLink($link, '', $style, $css_class); } $text .= $style['postlink']; } $text = $ns->tablerender(LAN_SITELINKS_183, $text, 'sitelinks_main', true); foreach(array_keys($this->eLinkList) as $k) { $mnu = $style['prelink']; foreach($this->eLinkList[$k] as $link) { if($k !== 'head_menu') { $mnu .= $this->makeLink($link, true, $style, $css_class); } } $mnu .= $style['postlink']; $text .= $ns->tablerender($k, $mnu, 'sitelinks_sub', true); } } $text .= "\n\n\n\n\n\n"; if($usecache) { $e107cache->set('sitelinks_' . $cat . md5($linkstyle . e_PAGE . e_QUERY), $text); } return $text; } /** * Manage Sublink Rendering * @param string $main_linkid * @param array $aSubStyle * @param string $css_class * @param int $level [optional] * @return string|null */ function subLink($main_linkid,$aSubStyle=array(),$css_class='',$level=0) { global $pref; if(!isset($this->eLinkList[$main_linkid]) || !is_array($this->eLinkList[$main_linkid])) { return null; } $sub['link_expand'] = ((isset($pref['sitelinks_expandsub']) && $pref['sitelinks_expandsub']) && empty($style['linkmainonly']) && !defined("LINKSRENDERONLYMAIN") && isset($this->eLinkList[$main_linkid]) && is_array($this->eLinkList[$main_linkid])); foreach($this->eLinkList[$main_linkid] as $val) // check that something in the submenu is actually selected. { if($this->hilite($val['link_url'],TRUE)== TRUE || $sub['link_expand'] == FALSE) { $substyle = "block"; // previously (non-W3C compliant): compact break; } else { $substyle = "none"; } } $text = ""; $text .= "\n\n\n\n"; return $text; } /** * @param $linkInfo * @param $submenu * @param $style * @param $css_class * @return string */ function makeLink($linkInfo=array(), $submenu = FALSE, $style=array(), $css_class = false) { global $pref,$tp; // Start with an empty link $linkstart = $indent = $linkadd = $screentip = $href = $link_append = ''; $highlighted = FALSE; if(!isset($style['linkstart_hilite'])) // Notice removal { $style['linkstart_hilite'] = ""; } if(!isset($style['linkclass_hilite'])) { $style['linkclass_hilite'] = ""; } if(!empty($linkInfo['link_sefurl']) && !empty($linkInfo['link_owner'])) { $linkInfo['link_url'] = e107::url($linkInfo['link_owner'],$linkInfo['link_sefurl']) ; // $linkInfo['link_sefurl']; } // If submenu: Fix Name, Add Indentation. if ($submenu == true) { if(strpos($linkInfo['link_name'], 'submenu.') === 0) { $tmp = explode('.', $linkInfo['link_name'], 3); $linkInfo['link_name'] = $tmp[2]; } $indent = ($style['linkdisplay'] != self::LINK_DISPLAY_OTHER && !empty($style['subindent'])) ? ($style['subindent']) : ""; } // Convert any {e_XXX} to absolute URLs (relative ones sometimes get broken by adding e_HTTP at the front) $linkInfo['link_url'] = $tp -> replaceConstants($linkInfo['link_url'], TRUE, TRUE); // replace {e_xxxx} if(strpos($linkInfo['link_url'],"{") !== false) { $linkInfo['link_url'] = $tp->parseTemplate($linkInfo['link_url'], TRUE); // shortcode in URL support - dynamic urls for multilanguage. } elseif($linkInfo['link_url'][0] !== '/' && strpos($linkInfo['link_url'],'http') !== 0) { $linkInfo['link_url'] = e_HTTP.ltrim($linkInfo['link_url'],'/'); } // By default links are not highlighted. if (isset($linkInfo['link_expand']) && $linkInfo['link_expand']) { // $href = " href=\"javascript:expandit('sub_".$linkInfo['link_id']."')\""; $css_class .= " e-expandit"; } $linkstart = $style['linkstart']; $linkadd = ($style['linkclass']) ? " class='".$style['linkclass']."'" : ""; $linkadd = ($css_class) ? " class='".$style['linkclass'].$css_class."'" : $linkadd; // Check for screentip regardless of URL. if (isset($pref['linkpage_screentip']) && $pref['linkpage_screentip'] && $linkInfo['link_description']) { $screentip = " title = \"".$tp->toHTML($linkInfo['link_description'],"","value, emotes_off, defs, no_hook")."\""; } // Check if its expandable first. It should override its URL. if (isset($linkInfo['link_expand']) && $linkInfo['link_expand']) { // $href = " href=\"javascript:expandit('sub_".$linkInfo['link_id']."')\""; $href = "href='#sub_".$linkInfo['link_id']."'"; } elseif ($linkInfo['link_url']) { // Only add the e_BASE if it actually has an URL. // $linkInfo['link_url'] = (strpos($linkInfo['link_url'], '://') === FALSE && strpos($linkInfo['link_url'], 'mailto:') !== 0 ? $linkInfo['link_url'] : $linkInfo['link_url']); // Only check if its highlighted if it has an URL if ($this->hilite($linkInfo['link_url'], $style['linkstart_hilite'])== TRUE) { $linkstart = (isset($style['linkstart_hilite'])) ? $style['linkstart_hilite'] : ""; $highlighted = TRUE; } if ($this->hilite(varset($linkInfo['link_url']), !empty($style['linkclass_hilite']))) { $linkadd = (isset($style['linkclass_hilite'])) ? " class='".$style['linkclass_hilite']."'" : ""; $highlighted = TRUE; } if ($linkInfo['link_open'] == 4 || $linkInfo['link_open'] == 5) { $dimen = ($linkInfo['link_open'] == 4) ? "600,400" : "800,600"; $href = " href=\"javascript:open_window('".$linkInfo['link_url']."',{$dimen})\""; } else { $href = " href='".$linkInfo['link_url']."'"; } // Open link in a new window. (equivalent of target='_blank' ) $link_append = ($linkInfo['link_open'] == 1) ? " rel='external'" : ""; } // Remove default images if its a button and add new image at the start. if ($linkInfo['link_button']) { $linkstart = preg_replace('/\/si', '', $linkstart); $linkstart .= $tp->toIcon($linkInfo['link_button'],array('legacy'=> "{e_IMAGE}icons/")); /* if($linkInfo['link_button'][0]=='{') { $linkstart .= ""; } else { $linkstart .= ""; }*/ } // mobile phone support. $accesskey = (isset($style['accesskey']) && $style['accesskey']==TRUE) ? " accesskey='".$linkInfo['link_order']."' " : ""; $accessdigit = (isset($style['accessdigit'],$style['accesskey']) && $style['accessdigit']==TRUE && $style['accesskey']==TRUE) ? $linkInfo['link_order'].". " : ""; // If its a link.. make a link $_link = ""; $_link .= $accessdigit; if (!empty($href) && ((isset($style['hilite_nolink']) && $highlighted)!=TRUE)) { $_link .= "".$tp->toHTML($linkInfo['link_name'],"","emotes_off, defs, no_hook").""; } elseif (!empty($linkadd) || !empty($screentip)) { // If its not a link, but has a class or screentip do span: $_link .= "".$tp->toHTML($linkInfo['link_name'],"","emotes_off, defs, no_hook").""; } else { // Else just the name: $_link .= $tp->toHTML($linkInfo['link_name'],"","emotes_off, defs, no_hook"); } $_link = $linkstart.$indent.$_link; return $_link.$style['linkend']."\n"; /* $search[0] = "/\{LINK\}(.*?)/si"; $replace[0] = $_link.$style['linkend']."\n"; $search[1] = "/\{LINK_DESCRIPTION\}(.*?)/si"; $replace[1] = $tp -> toHTML($linkInfo['link_description'], true); $text = preg_replace($search, $replace, $SITELINKSTYLE); return $text;*/ } /** * Determine whether link highlighting needs to be active * * @param string $link - the full link as stored in the DB * @param boolean $enabled - TRUE if the link is enabled * * @return boolean TRUE if link to be highlighted, FALSE if not */ function hilite($link,$enabled = FALSE) { global $PLUGINS_DIRECTORY; if(!$enabled){ return FALSE; } $tp = e107::getParser(); $link = $tp->replaceConstants($link, '', TRUE); // The link saved in the DB $tmp = explode('?',$link); $link_qry = (isset($tmp[1])) ? $tmp[1] : ''; $link_slf = (isset($tmp[0])) ? $tmp[0] : ''; $link_pge = basename($link_slf); $link_match = (empty($tmp[0])) ? "": strpos(e_SELF,$tmp[0]); // e_SELF is the actual displayed page if(e_MENU === "debug" && getperms('0')) { echo "
link= ".$link; echo "
link_q= ".$link_qry; echo "
url= ".e_PAGE; echo "
self= ".e_SELF; echo "
url_query= ".e_QUERY."
"; } // ----------- highlight overriding - set the link matching in the page itself. if(defined('HILITE')) { if(strpos($link,HILITE)) { return TRUE; } } // --------------- highlighting for 'HOME'. ---------------- // See if we're on whatever is set as 'home' page for this user // Although should be just 'index.php', allow for the possibility that there might be a query part // global $pref; $pref = e107::pref(); if (($link_slf == e_HTTP."index.php") && count($pref['frontpage'])) { // Only interested if the displayed page is index.php - see whether its the user's home (front) page $full_url = 'news.php'; // Set a default in case $uc_array = explode(',', USERCLASS_LIST); foreach ($pref['frontpage'] as $fk=>$fp) { if (in_array($fk,$uc_array)) { $full_url = ((strpos($fp, 'http') === FALSE) ? SITEURL : '').$fp; break; } } list($fp,$fp_q) = explode("?",$full_url."?"); // extra '?' ensure the array is filled if (e_MENU === "debug" && getperms('0')) { echo "\$fp = ".$fp."
"; echo "\$fp_q = ".$fp_q."
"; } $tmp = str_replace("../", "", e_SELF); if ((strpos($fp, $tmp) !== FALSE) && ($fp_q == $link_qry)) { return TRUE; } } // --------------- highlighting for plugins. ---------------- if(stripos($link, $PLUGINS_DIRECTORY) !== false && stripos($link, "custompages") === false) { if($link_qry) { // plugin links with queries return (strpos(e_SELF, $link_slf) && e_QUERY == $link_qry); } else { // plugin links without queries $link = str_replace("../", "", $link); if(stripos(dirname(e_SELF), dirname($link)) !== false) { return TRUE; } } return FALSE; } // --------------- highlight for news items.---------------- // eg. news.php, news.php?list.1 or news.php?cat.2 etc if(strpos(basename($link), "news.php") === 0) { if (strpos($link, "news.php?") !== FALSE && strpos(e_SELF,"/news.php")!==FALSE) { $lnk = explode(".",$link_qry); // link queries. $qry = explode(".",e_QUERY); // current page queries. if($qry[0] === "item") { return $qry[2] == $lnk[1]; } if($qry[0] === "all" && $lnk[0] === "all") { return TRUE; } if($lnk[0] == $qry[0] && $lnk[1] == $qry[1]) { return TRUE; } if($qry[1] === "list" && $lnk[0] === "list" && $lnk[1] == $qry[2]) { return TRUE; } } elseif (!e_QUERY && defset('e_PAGE') === "news.php") { return true; } return FALSE; } // --------------- highlight for Custom Pages.---------------- // eg. page.php?1, or page.php?5.7 [2nd parameter is page # within item] //echo "Link: {$link}, link query: {$link_qry}, e_SELF: ".e_SELF.", link_slf: {$link_slf}, link_pge: {$link_pge}, e_PAGE: ".e_PAGE."
"; if (($link_slf == e_HTTP.'page.php') && (e_PAGE === 'page.php')) { list($custom,$page) = explode('.',$link_qry.'.'); list($q_custom,$q_page) = explode('.',e_QUERY.'.'); if($custom == $q_custom) { return TRUE; } else { return FALSE; } } // --------------- highlight default ---------------- if(strpos($link, '?') !== FALSE) { $thelink = str_replace("../", "", $link); if(!preg_match("/all|item|cat|list/", e_QUERY) && (empty($link) == false) && (strpos(e_SELF, str_replace("../", "",$link)) !== false)) { return true; } } if(!preg_match("/all|item|cat|list/", e_QUERY) && (strpos(e_SELF, str_replace("../", "",$link)) !== false)) { return true; } if((!$link_qry && !e_QUERY) && (empty($link) == FALSE) && (strpos(e_SELF,$link) !== FALSE)) { return TRUE; } if(($link_slf == e_SELF && !$link_qry) || (e_QUERY && empty($link) == FALSE && strpos(e_SELF."?".e_QUERY,$link)!== FALSE) ) { return TRUE; } if($link_pge == basename($_SERVER['REQUEST_URI'])) // mod_rewrite support { return TRUE; } return FALSE; } } /** * Class for handling all navigation links site-wide. ie. admin links, admin-menu links, admin-plugin links, front-end sitelinks etc. */ class e_navigation { /** * @var array Admin link structure */ var $admin_cat = array(); /** * @var boolean active check main */ public $activeSubFound = false; /** * @var boolean active check sub */ public $activeMainFound = false; var $iconArray = array(); function __construct() { if(defined('E_32_MAIN')) // basic check so that it's not loaded on the front-end. { $this->setIconArray(); } } /** * Guess the admin menu item icon based on the path * @param $key * @return string */ public static function guessMenuIcon($key) { $tmp = explode('/', $key); $mode = varset($tmp[0]); $action = varset($tmp[1]); switch($action) { case 'main': case 'list': $ret = $ret = ($mode === 'cat') ? 'fa-folder.glyph' : 'fa-list.glyph'; break; case 'options': case 'prefs': case 'settings': case 'config': case 'configure': $ret = 'fa-cog.glyph'; break; case 'create': $ret = ($mode === 'cat') ? 'fa-folder-plus.glyph' : 'fa-plus.glyph'; break; case 'tools': case 'maint': $ret = 'fas-toolbox.glyph'; break; case 'import': case 'upload': $ret = 'fa-upload.glyph'; break; default: $ret = 'fa-question.glyph'; // code to be executed if n is different from all labels; } return $ret; } /** * @return array */ function getIconArray() { return $this->iconArray; } /** * @return void */ function setIconArray() { if(!defined('E_32_MAIN')) { // e107::getCoreTemplate('admin_icons'); e107::loadAdminIcons(); } $this->iconArray = array( 'main' => E_32_MAIN, 'admin' => E_32_ADMIN, 'admin_pass' => E_32_ADPASS, 'banlist' => E_32_BANLIST, 'cache' => E_32_CACHE, 'comment' => E_32_COMMENT, 'credits' => E_32_CREDITS, 'cron' => E_32_CRON, 'custom' => E_32_CUST, // 'custom_field' => E_32_CUSTOMFIELD, 'database' => E_32_DATAB, 'docs' => E_32_DOCS, //'download' => E_32_DOWNL, 'emoticon' => E_32_EMOTE, 'filemanage' => E_32_FILE, 'fileinspector' => E_32_INSPECT, 'frontpage' => E_32_FRONT, 'image' => E_32_IMAGES, 'language' => E_32_LANGUAGE, 'links' => E_32_LINKS, 'mail' => E_32_MAIL, 'maintain' => E_32_MAINTAIN, 'menus' => E_32_MENUS, 'meta' => E_32_META, 'newsfeed' => E_32_NEWSFEED, 'news' => E_32_NEWS, 'notify' => E_32_NOTIFY, 'phpinfo' => E_32_PHP, 'plug_manage' => E_32_PLUGMANAGER, 'poll' => E_32_POLLS, 'prefs' => E_32_PREFS, 'search' => E_32_SEARCH, 'syslogs' => E_32_ADMINLOG, 'theme_manage' => E_32_THEMEMANAGER, 'upload' => E_32_UPLOADS, 'eurl' => E_32_EURL, 'userclass' => E_32_USERCLASS, 'user_extended' => E_32_USER_EXTENDED, 'users' => E_32_USER, 'wmessage' => E_32_WELCOME ); } /** * Structure $this->_md5cache[$category] = md5HASH * @var md5 hash used for build unique cache string per category and user classes */ protected $_md5cache = array(); //FIXME array structure - see $this->admin(); /** * @return array */ function adminCats() { $tp = e107::getParser(); if(count($this->admin_cat)) { return $this->admin_cat; } $pref = e107::getPref(); $this->admin_cat['title'][1] = LAN_SETTINGS; $this->admin_cat['id'][1] = 'setMenu'; $this->admin_cat['img'][1] = 'fa-cogs.glyph'; $this->admin_cat['lrg_img'][1] = $tp->toGlyph('e-settings-32'); $this->admin_cat['sort'][1] = true; /* * i.e-cat_content-32{ background-position: -370px 0; width: 32px; height: 32px; } i.e-cat_files-32{ background-position: -407px 0; width: 32px; height: 32px; } i.e-cat_plugins-32{ background-position: -444px 0; width: 32px; height: 32px; } i.e-cat_settings-32{ background-position: -481px 0; width: 32px; height: 32px; } i.e-cat_tools-32{ background-position: -518px 0; width: 32px; height: 32px; } i.e-cat_users-32{ background-position: -555px 0; width: 32px; height: 32px; } * e-manage-32 */ $this->admin_cat['title'][2] = ADLAN_CL_2; $this->admin_cat['id'][2] = 'userMenu'; $this->admin_cat['img'][2] = 'fa-users.glyph'; // $tp->toGlyph('e-cat_users-16'); $this->admin_cat['lrg_img'][2] = $tp->toGlyph('e-cat_users-32'); $this->admin_cat['sort'][2] = true; $this->admin_cat['title'][3] = ADLAN_CL_3; $this->admin_cat['id'][3] = 'contMenu'; $this->admin_cat['img'][3] = 'fa-file-text-o.glyph'; // $tp->toGlyph('e-cat_content-16'); $this->admin_cat['lrg_img'][3] = $tp->toGlyph('e-cat_content-32'); $this->admin_cat['sort'][3] = true; $this->admin_cat['title'][4] = ADLAN_CL_6; $this->admin_cat['id'][4] = 'toolMenu'; $this->admin_cat['img'][4] = 'fa-wrench.glyph'; // $tp->toGlyph('e-cat_tools-16'); $this->admin_cat['lrg_img'][4] = $tp->toGlyph('e-cat_tools-32'); $this->admin_cat['sort'][4] = true; // Manage $this->admin_cat['title'][5] = LAN_MANAGE; $this->admin_cat['id'][5] = 'managMenu'; $this->admin_cat['img'][5] = 'fa-desktop.glyph' ; // $tp->toGlyph('e-manage-16'); $this->admin_cat['lrg_img'][5] = $tp->toGlyph('e-manage-32'); $this->admin_cat['sort'][5] = TRUE; if(!empty($pref['admin_separate_plugins'])) { $this->admin_cat['title'][6] = ADLAN_CL_7; $this->admin_cat['id'][6] = 'plugMenu'; $this->admin_cat['img'][6] = 'fa-puzzle-piece.glyph'; // $tp->toGlyph('e-cat_plugins-16'); $this->admin_cat['lrg_img'][6] = $tp->toGlyph('e-cat_plugins-32'); $this->admin_cat['sort'][6] = false; } else { // Misc. $this->admin_cat['title'][6] = ADLAN_CL_8; $this->admin_cat['id'][6] = 'miscMenu'; $this->admin_cat['img'][6] = 'fa-puzzle-piece.glyph'; // E_16_CAT_MISC; $this->admin_cat['lrg_img'][6] = ''; // E_32_CAT_MISC; $this->admin_cat['sort'][6] = TRUE; } //About menu - No 20 - leave space for user-categories. $this->admin_cat['title'][20] = LAN_ABOUT; $this->admin_cat['id'][20] = 'aboutMenu'; $this->admin_cat['img'][20] = 'fa-info-circle.glyph'; // E_16_CAT_ABOUT;//E_16_NAV_DOCS $this->admin_cat['lrg_img'][20] = ''; // $tp->toGlyph('e-cat_about-32'); ; // E_32_CAT_ABOUT; $this->admin_cat['sort'][20] = false; return $this->admin_cat; } // Previously $array_functions variable. /** * @param $mode * @return array|array[]|string */ function adminLinks($mode=false) { if($mode === 'plugin') { return $this->pluginLinks(E_16_PLUGMANAGER, "array") ; } if($mode === 'plugin2') { return $this->pluginLinks(E_16_PLUGMANAGER, "standard") ; } $this->setIconArray(); if($mode === 'sub') { //FIXME array structure suitable for e_admin_menu - see shortcodes/admin_navigation.php /* * Info about sublinks array structure * * key = $array_functions key * attribute 1 = link * attribute 2 = title * attribute 3 = description * attribute 4 = perms * attribute 5 = category * attribute 6 = 16 x 16 image * attribute 7 = 32 x 32 image * */ $array_sub_functions = array(); $array_sub_functions[17][] = array(e_ADMIN.'newspost.php', LAN_MANAGE, ADLAN_3, 'H', 3, E_16_MANAGE, E_32_MANAGE); $array_sub_functions[17][] = array(e_ADMIN.'newspost.php?create', LAN_CREATE, ADLAN_2, 'H', 3, E_16_CREATE, E_32_CREATE); $array_sub_functions[17][] = array(e_ADMIN.'newspost.php?pref', LAN_PREFS, LAN_PREFS, 'H', 3, E_16_SETTINGS, E_32_SETTINGS); return $array_sub_functions; } //FIXME array structure suitable for e_admin_menu (NOW admin() below) - see shortcodes/admin_navigation.php //TODO find out where is used $array_functions elsewhere, refactor it //XXX DO NOT EDIT without first checking perms in user_handler.php !!!! $array_functions = array( 0 => array(e_ADMIN_ABS.'administrator.php', ADLAN_8, ADLAN_9, '3', 2, E_16_ADMIN, E_32_ADMIN), 1 => array(e_ADMIN_ABS.'updateadmin.php', ADLAN_10, ADLAN_11, false, 2, E_16_ADPASS, E_32_ADPASS), 2 => array(e_ADMIN_ABS.'banlist.php', ADLAN_34, ADLAN_35, '4', 2, E_16_BANLIST, E_32_BANLIST), 4 => array(e_ADMIN_ABS.'cache.php', ADLAN_74, ADLAN_75, 'C', 1, E_16_CACHE, E_32_CACHE), 5 => array(e_ADMIN_ABS.'cpage.php', ADLAN_42, ADLAN_43, '5|J', 3, E_16_CUST, E_32_CUST), 6 => array(e_ADMIN_ABS.'db.php', ADLAN_44, ADLAN_45, '0', 4, E_16_DATAB, E_32_DATAB), // 7 => array(e_ADMIN.'download.php', ADLAN_24, ADLAN_25, 'R', 3, E_16_DOWNL, E_32_DOWNL), 8 => array(e_ADMIN_ABS.'emoticon.php', ADLAN_58, ADLAN_59, 'F', 1, E_16_EMOTE, E_32_EMOTE), // 9 => array(e_ADMIN.'filemanager.php', ADLAN_30, ADLAN_31, '6', 5, E_16_FILE, E_32_FILE), // replaced by media-manager 10 => array(e_ADMIN_ABS.'frontpage.php', ADLAN_60, ADLAN_61, 'G', 1, E_16_FRONT, E_32_FRONT), 11 => array(e_ADMIN_ABS.'image.php', LAN_MEDIAMANAGER, LAN_MEDIAMANAGER, 'A', 5, E_16_IMAGES, E_32_IMAGES), 12 => array(e_ADMIN_ABS.'links.php', LAN_NAVIGATION, ADLAN_139, 'I', 1, E_16_LINKS, E_32_LINKS), 13 => array(e_ADMIN_ABS.'wmessage.php', ADLAN_28, ADLAN_29, 'M', 3, E_16_WELCOME, E_32_WELCOME), 14 => array(e_ADMIN_ABS.'ugflag.php', ADLAN_40, ADLAN_41, '9', 4, E_16_MAINTAIN, E_32_MAINTAIN), 15 => array(e_ADMIN_ABS.'menus.php', ADLAN_6, ADLAN_7, '2', 5, E_16_MENUS, E_32_MENUS), 16 => array(e_ADMIN_ABS.'meta.php', ADLAN_66, ADLAN_67, 'T', 1, E_16_META, E_32_META), 17 => array(e_ADMIN_ABS.'newspost.php', ADLAN_0, ADLAN_1, 'H|N|7|H0|H1|H2|H3|H4|H5', 3, E_16_NEWS, E_32_NEWS), 18 => array(e_ADMIN_ABS.'phpinfo.php', ADLAN_68, ADLAN_69, '0', 20, E_16_PHP, E_32_PHP), 19 => array(e_ADMIN_ABS.'prefs.php', LAN_PREFS, ADLAN_5, '1', 1, E_16_PREFS, E_32_PREFS), 20 => array(e_ADMIN_ABS.'search.php', LAN_SEARCH, ADLAN_143, 'X', 1, E_16_SEARCH, E_32_SEARCH), 21 => array(e_ADMIN_ABS.'admin_log.php', ADLAN_155, ADLAN_156, 'S', 4, E_16_ADMINLOG, E_32_ADMINLOG), 22 => array(e_ADMIN_ABS.'theme.php', ADLAN_140, ADLAN_141, '1|TMP', 5, E_16_THEMEMANAGER, E_32_THEMEMANAGER), 23 => array(e_ADMIN_ABS.'upload.php', ADLAN_72, ADLAN_73, 'V', 3, E_16_UPLOADS, E_32_UPLOADS), 24 => array(e_ADMIN_ABS.'users.php', ADLAN_36, ADLAN_37, '4|U0|U1|U2|U3', 2, E_16_USER, E_32_USER), 25 => array(e_ADMIN_ABS.'userclass2.php', ADLAN_38, ADLAN_39, '4', 2, E_16_USERCLASS, E_32_USERCLASS), 26 => array(e_ADMIN_ABS.'language.php', ADLAN_132, ADLAN_133, 'L', 1, E_16_LANGUAGE, E_32_LANGUAGE), 27 => array(e_ADMIN_ABS.'mailout.php', ADLAN_136, ADLAN_137, 'W', 2, E_16_MAIL, E_32_MAIL), 28 => array(e_ADMIN_ABS.'users_extended.php', ADLAN_78, ADLAN_79, '4', 2, E_16_USER_EXTENDED, E_32_USER_EXTENDED), 29 => array(e_ADMIN_ABS.'fileinspector.php', ADLAN_147, ADLAN_148, 'Y', 4, E_16_INSPECT, E_32_INSPECT), 30 => array(e_ADMIN_ABS.'notify.php', ADLAN_149, ADLAN_150, 'O', 4, E_16_NOTIFY, E_32_NOTIFY), 31 => array(e_ADMIN_ABS.'cron.php', ADLAN_157, ADLAN_158, 'U', 4, E_16_CRON, E_32_CRON), 32 => array(e_ADMIN_ABS.'eurl.php', ADLAN_159, ADLAN_160, 'K', 1, E_16_EURL, E_32_EURL), 33 => array(e_ADMIN_ABS.'plugin.php', ADLAN_98, ADLAN_99, 'Z', 5 , E_16_PLUGMANAGER, E_32_PLUGMANAGER), 34 => array(e_ADMIN_ABS.'docs.php', ADLAN_12, ADLAN_13, false, 20, E_16_DOCS, E_32_DOCS), // TODO System Info. // 35 => array('#TODO', 'System Info', 'System Information', '', 20, '', ''), 36 => array(e_ADMIN_ABS.'credits.php', LAN_CREDITS, LAN_CREDITS, false, 20, E_16_E107, E_32_E107), // 37 => array(e_ADMIN.'custom_field.php', ADLAN_161, ADLAN_162, 'U', 4, E_16_CUSTOMFIELD, E_32_CUSTOMFIELD), 38 => array(e_ADMIN_ABS.'comment.php', LAN_COMMENTMAN, LAN_COMMENTMAN, 'B', 5, E_16_COMMENT, E_32_COMMENT), ); if($mode === 'legacy') { return $array_functions; // Old BC format. } $newarray = asortbyindex($array_functions, 1); $array_functions_assoc = $this->convert_core_icons($newarray); if($mode === 'core') // Core links only. { return $array_functions_assoc; } $merged = array_merge($array_functions_assoc, $this->pluginLinks(E_16_PLUGMANAGER, "array")); $sorted = multiarray_sort($merged,'title'); // this deleted the e-xxxx and p-xxxxx keys. return $this->restoreKeys($sorted); // we restore the keys with this. } /** * @param $newarray * @return array */ private function restoreKeys($newarray) // Put core button array in the same format as plugin button array. { $array_functions_assoc = array(); foreach($newarray as $key=>$val) { if(varset($val['key'])) // Plugin Array. { $key = $val['key']; $array_functions_assoc[$key] = $val; } } return $array_functions_assoc; } /** * Return the default array of icon identifiers for the admin "Control Panel". (infopanel and flexpanel) * @return array */ public function getDefaultAdminPanelArray() { $iconlist = $this->adminLinks(); $defArray = array(); $exclude = array ( 'e-administrator', 'e-updateadmin', 'e-banlist', 'e-cache', 'e-comment', 'e-credits', 'e-db', 'e-docs', 'e-emoticon', 'e-users_extended', 'e-fileinspector', 'e-language', 'e-ugflag', 'e-notify', 'e-phpinfo', 'e-upload', 'e-cron', 'e-search', 'e-admin_log', 'e-eurl' ); foreach($iconlist as $k=>$v) { if(!in_array($k,$exclude)) { $defArray[] = $k; } } return $defArray; } /** * @param $newarray * @return array */ private function convert_core_icons($newarray) // Put core button array in the same format as plugin button array. { $array_functions_assoc = array(); foreach($newarray as $key=>$val) { if(varset($val[0])) { $key = "e-".basename($val[0],".php"); $val['key'] = $key; $val['icon'] = $val[5]; $val['icon_32'] = $val[6]; $val['title'] = $val[1]; $val['link'] = $val[0]; $val['caption'] = $val['2']; $val['cat'] = $val['4']; $val['perms'] = $val['3']; $array_functions_assoc[$key] = $val; } } return $array_functions_assoc; } /** * Convert from plugin category found in plugin.xml to Navigation Category ID number. */ function plugCatToCoreCat($cat) { $convert = array( 'settings' => array(1,'setMenu'), 'users' => array(2,'userMenu'), 'content' => array(3,'contMenu'), 'tools' => array(4,'toolMenu'), 'manage' => array(6,'managMenu'), 'misc' => array(7,'miscMenu'), 'help' => array(20,'helpMenu') ); return (int) vartrue($convert[$cat][0]); } /** * Get Plugin Links - rewritten for v2.1.5 * @param string $iconSize * @param string $linkStyle standard = new in v2.1.5 | array | adminb * @return array|string */ function pluginLinks($iconSize = E_16_PLUGMANAGER, $linkStyle = 'adminb') { $plug = e107::getPlug(); $data = $plug->getInstalled(); $arr = array(); $pref = e107::getPref(); foreach($data as $path=>$ver) { if(!e107::isInstalled($path)) { continue; } if(!empty($pref['lan_global_list']) && !in_array($path, $pref['lan_global_list'])) { e107::loadLanFiles($path, 'admin'); } $plug->load($path); $key = ($linkStyle === 'standard') ? "plugnav-".$path : 'p-'.$path; $url = $plug->getAdminUrl(); $cat = $plug->getCategory(); if(empty($url) || $cat === 'menu') { continue; } // Keys compatible with legacy and new admin layouts. $arr[$key] = array( 'text' => $plug->getName(), 'description' => $plug->getDescription(), 'link' => $url, 'image' => $plug->getIcon(16), 'image_large' => $plug->getIcon(32), 'category' => $cat, 'perm' => "P".$plug->getId(), 'sort' => 2, 'sub_class' => null, // Legacy Keys. 'key' => $key, 'title' => $plug->getName(), 'caption' => $plug->getAdminCaption(), 'perms' => "P".$plug->getId(), 'icon' => $plug->getIcon(16), 'icon_32' => $plug->getIcon(32), 'cat' => $this->plugCatToCoreCat($plug->getCategory()) ); } //ksort($arr, SORT_STRING); if($linkStyle === "array" || $iconSize === 'assoc' || $linkStyle === 'standard') { return $arr; } $text = ''; foreach ($arr as $plug_key => $plug_value) { $the_icon = ($iconSize == E_16_PLUGMANAGER) ? $plug_value['icon'] : $plug_value['icon_32']; $text .= $this->renderAdminButton($plug_value['link'], $plug_value['title'], $plug_value['caption'], $plug_value['perms'], $the_icon, $linkStyle); } return $text; } /** * XXX the NEW version of e_admin_menu(); * Build admin menus - addmin menus are now supporting unlimitted number of submenus * TODO - add this to a handler for use on front-end as well (tree, sitelinks.sc replacement) * * $e107_vars structure: * $e107_vars['action']['text'] -> link title * $e107_vars['action']['link'] -> if empty '#action' will be added as href attribute * $e107_vars['action']['image'] -> (new) image tag * $e107_vars['action']['perm'] -> permissions via getperms() * $e107_vars['action']['userclass'] -> user class permissions via check_class() * $e107_vars['action']['include'] -> additional tag attributes * $e107_vars['action']['sub'] -> (new) array, exactly the same as $e107_vars' first level e.g. $e107_vars['action']['sub']['action2']['link']... * $e107_vars['action']['sort'] -> (new) used only if found in 'sub' array - passed as last parameter (recursive call) * $e107_vars['action']['link_class'] -> (new) additional link class * $e107_vars['action']['sub_class'] -> (new) additional class used only when sublinks are being parsed * * @param string $title * @param string $active_page * @param array $e107_vars * @param array $tmpl * @param array $sub_link * @param bool $sortlist * @return string parsed admin menu (or empty string if title is empty) */ function admin($title, $active_page, $e107_vars, $tmpl = array(), $sub_link = false, $sortlist = false) { $tp = e107::getParser(); if (!$tmpl) { $tmpl = e107::getCoreTemplate('admin', 'menu', false); } /* * Search for id */ $extraParms = array(); $temp = explode('--id--', $title, 2); $title = $temp[0]; $id = str_replace(array(' ', '_'), '-', varset($temp[1])); if(isset($e107_vars['_extras_'])) // hold icon info, but could be more. { $extraParms = $e107_vars['_extras_']; unset($e107_vars['_extras_']); } unset($temp); /* * SORT */ if ($sortlist == TRUE) { $temp = $e107_vars; unset($e107_vars); $func_list = array(); foreach (array_keys($temp) as $key) { $func_list[] = $temp[$key]['text']; } usort($func_list, 'strcoll'); foreach ($func_list as $func_text) { foreach (array_keys($temp) as $key) { if ($temp[$key]['text'] == $func_text) { $e107_vars[] = $temp[$key]; } } } unset($temp); } if(empty($e107_vars)) { return null; } $kpost = ''; $text = ''; if ($sub_link) { $kpost = '_sub'; } elseif(isset($tmpl['start'])) { $text = $tmpl['start']; } //FIXME - e_parse::array2sc() /* $search = array(); $search[0] = '/\{LINK_TEXT\}(.*?)/si'; $search[1] = '/\{LINK_URL\}(.*?)/si'; $search[2] = '/\{ONCLICK\}(.*?)/si'; $search[3] = '/\{SUB_HEAD\}(.*?)/si'; $search[4] = '/\{SUB_MENU\}(.*?)/si'; $search[5] = '/\{ID\}(.*?)/si'; $search[6] = '/\{SUB_ID\}(.*?)/si'; $search[7] = '/\{LINK_CLASS\}(.*?)/si'; $search[8] = '/\{SUB_CLASS\}(.*?)/si'; $search[9] = '/\{LINK_IMAGE\}(.*?)/si'; $search[10] = '/\{LINK_SUB_OVERSIZED\}/si'; $search[11] = '/\{LINK_DATA\}/si';*/ foreach (array_keys($e107_vars) as $act) { if (isset($e107_vars[$act]['perm']) && $e107_vars[$act]['perm'] !== false && !getperms($e107_vars[$act]['perm'])) // check perms first. { continue; } if (isset($e107_vars[$act]['header'])) { $text .= str_replace('{HEADING}', $e107_vars[$act]['header'], $tmpl['heading']); continue; } if (isset($e107_vars[$act]['divider']) && !empty($tmpl['divider'])) { $text .= $tmpl['divider']; continue; } // check class so that e.g. e_UC_NOBODY will result no permissions granted (even for main admin) if (isset($e107_vars[$act]['userclass']) && !e107::getUser()->checkClass($e107_vars[$act]['userclass'], false)) // check userclass perms { continue; } $replace = array(); $rid = str_replace(array(' ', '_'), '-', $act).($id ? "-{$id}" : ''); //XXX && !is_numeric($act) ??? if (($active_page == (string) $act) || (str_replace("?", "", e_PAGE.e_QUERY) == str_replace("?", "", $act)) || e_REQUEST_HTTP === varset($e107_vars[$act]['link']) ) { $temp = isset($tmpl['button_active' . $kpost]) ? $tmpl['button_active' . $kpost] : ''; } else { $temp = isset($tmpl['button'.$kpost]) ? $tmpl['button'.$kpost] : ''; } // e107::getDebug()->log($e107_vars[$act]['link']); // $temp = $tmpl['button'.$kpost]; // echo "ap = ".$active_page; // echo " act = ".$act."

"; if($rid === 'adminhome') { $temp = $tmpl['button_other'.$kpost]; } if(!empty($e107_vars[$act]['template'])) { $tmplateKey = 'button_'.$e107_vars[$act]['template'].$kpost; $temp = varset($tmpl[$tmplateKey]); } $replace['LINK_TEXT'] = str_replace(" ", " ", varset($e107_vars[$act]['text'])); $replace['LINK_DESCRIPTION'] = varset($e107_vars[$act]['description']); // valid URLs $replace['LINK_URL'] = str_replace(array('&', '&'), array('&', '&'), vartrue($e107_vars[$act]['link'], "#{$act}")); $replace['ONCLICK'] = ''; if (vartrue($e107_vars[$act]['include'])) { $replace['ONCLICK'] = $e107_vars[$act]['include']; //$replace[2] = $js ? " onclick=\"showhideit('".$act."');\"" : " onclick=\"document.location='".$e107_vars[$act]['link']."'; disabled=true;\""; } $replace['SUB_HEAD'] = $title; $replace['SUB_MENU'] = ''; $replace['ID'] = $id ? " id='eplug-nav-{$rid}'" : ''; $replace['SUB_ID'] = $rid; $replace['LINK_CLASS'] = varset($e107_vars[$act]['link_class']); $replace['SUB_CLASS'] = ''; if(!isset($e107_vars[$act]['image_src']) && !isset($e107_vars[$act]['icon'])) { $e107_vars[$act]['image_src'] = self::guessMenuIcon($act.'/'.$act); } if(!empty($e107_vars[$act]['image_src']) && strpos($e107_vars[$act]['image_src'], '.glyph') !== false) { $replace['LINK_IMAGE'] = $tp->toGlyph($e107_vars[$act]['image_src'], array('space'=>' ')); } else { $replace['LINK_IMAGE'] = varset($e107_vars[$act]['image']); } $replace['LINK_SUB_OVERSIZED'] = (isset($e107_vars[$act]['sub']) && count($e107_vars[$act]['sub']) > 15) ? 'oversized' : ''; if(!empty($e107_vars[$act]['link_data'])) { $dataTmp = array(); foreach($e107_vars[$act]['link_data'] as $k=>$v) { $dataTmp[] = $k.'="'.$v.'"'; } $replace['LINK_DATA'] = implode(" ", $dataTmp); // $e107_vars[$act]['link_data'] } $replace['LINK_BADGE'] = isset($e107_vars[$act]['badge']['value']) ? $tp->toLabel($e107_vars[$act]['badge']['value'], varset($e107_vars[$act]['badge']['type'])) : ''; if($rid === 'logout' || $rid === 'home' || $rid === 'language') { $START_SUB = $tmpl['start_other_sub']; } else { $START_SUB = isset($tmpl['start_sub']) ? $tmpl['start_sub'] : ''; } if(!empty($e107_vars[$act]['sub'])) { $replace['SUB_ID'] = $id ? " id='eplug-nav-{$rid}-sub'" : ''; $replace['LINK_CLASS'] = ' '.varset($e107_vars[$act]['link_class'], 'e-expandit'); $replace['SUB_CLASS'] = ' '.varset($e107_vars[$act]['sub_class'], 'e-hideme e-expandme'); $replace['SUB_MENU'] = $tp->parseTemplate($START_SUB, false, $replace); $replace['SUB_MENU'] .= $this->admin(false, $active_page, $e107_vars[$act]['sub'], $tmpl, true, (isset($e107_vars[$act]['sort']) ? $e107_vars[$act]['sort'] : $sortlist)); $replace['SUB_MENU'] .= isset($tmpl['end_sub']) ? $tmpl['end_sub'] : ''; } $text .= $tp->simpleParse($temp, $replace); } $text .= (!$sub_link && isset($tmpl['end'])) ? $tmpl['end'] : ''; if ($sub_link || empty($title)) { return $text; } $ns = e107::getRender(); $ns->setUniqueId($id); $srch = array('{ICON}', '{CAPTION}'); $repl = array(varset($extraParms['icon']), $title); $caption = isset($tmpl['caption']) ? (string) $tmpl['caption'] : ''; $title = str_replace($srch,$repl, $caption); $ret = $ns->tablerender($title, $text, 'default', true); $ns->setUniqueId(null); if(!empty($extraParms['return'])) { return $ret; } echo $ret; } // Previously admin.php -> render_links(); /** * @param $link * @param $title * @param $description * @param $perms * @param $icon * @param $mode * @return string */ function renderAdminButton($link, $title, $description, $perms, $icon = FALSE, $mode = FALSE) { global $td; $tp = e107::getParser(); $mes = e107::getMessage(); $cols = defset('ADLINK_COLS',5); $text = ''; if (getperms($perms)) { $description = strip_tags($description); if ($mode === 'adminb') { $text = "
".$icon." ".$title." ".($description ? "[ ".$description." ]" : "")."
"; } else { if($mode !== "div" && $mode !== 'div-icon-only') { if ($td == ($cols +1)) { $text .= ''; $td = 1; } if ($td == 1) { $text .= ''; } } switch ($mode) { case 'default': $text .= "
".$icon." ".$tp->toHTML($title,FALSE,"defs, emotes_off").""; break; case 'classis': $text .= "".$icon."
".$tp->toHTML($title,FALSE,"defs, emotes_off").""; break; case 'beginner': $text .= "".$icon."
".$tp->toHTML($title,FALSE,"defs, emotes_off")."



"; break; case 'div': $text .= ""; break; case 'div-icon-only': $text .= ""; break; default: break; } $td++; } } //else //{ // echo "no Perms"; //} return $text; } /** * @param $category * @param $type * @return mixed|string|void */ public function cacheString($category, $type = 'sys') { if(!isset($this->_md5cache[$category])) { $uclist = e107::getUser()->getClassList(); sort($uclist, SORT_NUMERIC); $this->_md5cache[$category] = md5($category.$uclist); } switch ($type) { case 'sys': return $this->cacheBase().$this->_md5cache[$category]; break; case 'md5': return $this->_md5cache[$category]; break; } } /** * @return string */ public function cacheBase() { return 'nomd5_sitelinks_'; } /** * TODO Cache */ public function render($data, $template, $opts = array()) { if(empty($data) || empty($template) || !is_array($template)) { return ''; } /** @var navigation_shortcodes $sc */ $sc = e107::getScBatch('navigation'); $sc->template = $template; if(!empty($opts['class'])) { $sc->navClass = $opts['class']; } $head = e107::getParser()->parseTemplate($template['start'], true, $sc); $ret = ""; $sc->counter = 1; $this->activeMainFound = false; foreach ($data as $_data) { $active = ($this->isActive($_data, $this->activeMainFound)) ? "_active" : ""; $sc->setDepth(0); $sc->setVars($_data); // isActive is allowed to alter data $itemTmpl = !empty($_data['link_sub']) ? $template['item_submenu'.$active] : $template['item'.$active]; $ret .= e107::getParser()->parseTemplate($itemTmpl, true, $sc); $sc->active = ($active) ? true : false; if($sc->active) { $this->activeMainFound = true; } $sc->counter++; } $foot = e107::getParser()->parseTemplate($template['end'], true, $sc); return ($ret != '') ? $head.$ret.$foot : ''; } /** * --------------- CODE-EFFICIENT APPROACH ------------------------- * FIXME syscache */ public function initData($cat=1, $opt=array()) { $sql = e107::getDb('sqlSiteLinks'); $ins = ($cat > 0) ? " link_category = ". (int) $cat ." AND " : ""; $query = "SELECT * FROM #links WHERE ".$ins." ((link_class >= 0 AND link_class IN (".USERCLASS_LIST.")) OR (link_class < 0 AND ABS(link_class) NOT IN (".USERCLASS_LIST.")) ) ORDER BY link_order,link_parent ASC"; $outArray = array(); $data = $sql->retrieve($query,true); $ret = $this->compile($data, $outArray); if(!empty($opt['flat'])) { $newArr = array(); foreach($ret as $row) { $ignore = (!empty($opt['noempty']) && (empty($row['link_url']) || $row['link_url'] === '#')); $tmp = (array) $row['link_sub']; unset($row['link_sub']); if($ignore !== true) { $newArr[] = $row; } if(!empty($tmp)) { foreach($tmp as $val) { if(!is_array($val)) { continue; } $tmp2 = $val['link_sub']; unset($val['link_sub']); $newArr[] = $val; if(!empty($tmp2)) { foreach($tmp2 as $k=>$v) { $tmp3 = (array) $v['link_sub']; unset($v['link_sub']); $newArr[] = $v; foreach($tmp3 as $sub) { $newArr[] = $sub; } } } } } } //e107::getDebug()->log($newArr); return $newArr; } return $ret; } /** * Compile Array Structure */ public function compile(&$inArray, &$outArray, $pid = 0) { if(!is_array($inArray) || !is_array($outArray)){ return null; } $frm = e107::getForm(); foreach($inArray as $key => $val) { if($val['link_parent'] == $pid) { $val['link_sub'] = $this->isDynamic($val); if(empty($val['link_identifier']) && !empty($val['link_function'])) { $val['link_identifier'] = $frm->name2id($val['link_function']); } // prevent loop of death if( $val['link_id'] != $pid) { $this->compile($inArray, $val['link_sub'], $val['link_id']); } $outArray[] = $val; } } return $outArray; } /** * Check for Dynamic Function * @example class:method($parm) */ protected function isDynamic($row) { if(varset($row['link_sub'])) { return $row['link_sub']; } if(!empty($row['link_function'])) { $parm = false; list($path,$method) = explode("::",$row['link_function']); if($path === 'theme') { $text = e107::callMethod('theme_shortcodes',$method, $row); // no parms as theme_shortcodes may be added as needed. if(!empty($text)) { return ''; // @todo use template? } e107::getDebug()->log("Theme shortcode (".$method.") could not be found for use in sitelink"); return array(); } if(!file_exists(e_PLUGIN.$path."/e_sitelink.php") || !e107::isInstalled($path)) { return array(); } if(include_once(e_PLUGIN.$path."/e_sitelink.php")) { if(strpos($method,"(")) { list($method,$prm) = explode("(",$method); $parm = rtrim($prm,")"); } $class = $path."_sitelink"; if($sublinkArray = e107::callMethod($class,$method,$parm,$row)) //TODO Cache it. { return $sublinkArray; } } } return array(); } /** * TODO Extensive Active Link Detection; * */ public function isActive(&$data=array(), $removeOnly = false, $exactMatch = false) { if(empty($data)) { return null; } ### experimental active match added to the URL (and removed after parsing) ### Example of main link: {e_BASE}some/url/#?match/string1^match/string2 ### It would match http://your.domain/match/string/ or http://your.domain/match/string2?some=vars ### '#?' is the alternate active check trigger if(strpos($data['link_url'], '#?') !== false) { if($removeOnly) { $arr = explode('#?', $data['link_url'], 2); $data['link_url'] = array_shift($arr); return null; } $_temp = explode('#?', $data['link_url'], 2); $data['link_url'] = $_temp[0] ? $_temp[0] : '#'; $matches = explode('^', $_temp[1]); foreach ($matches as $match) { if(strpos(e_REQUEST_URL, $match) !== false) { return true; } } } // No need of further checks if($removeOnly) { return null; } // already checked by compile() or external source if(isset($data['link_active'])) { return $data['link_active']; } $dbLink = e_HTTP. e107::getParser()->replaceConstants($data['link_url'], TRUE, TRUE); // $dbLink = e107::getParser()->replaceConstants($data['link_url'], TRUE, TRUE); $dbLink = str_replace("//","/",$dbLink); // precaution for e_HTTP inclusion above. if(!empty($data['link_owner']) && !empty($data['link_sefurl'])) { $dbLink = e107::url($data['link_owner'],$data['link_sefurl']); } //if(E107_DBG_PATH) //{ // e107::getDebug()->log("db=".$dbLink."
url=".e_REQUEST_URI."

"); // } if($exactMatch) { if(e_REQUEST_URI == $dbLink) { return true; } } // XXX this one should go soon - no cotroll at all elseif(e_REQUEST_HTTP == $dbLink) { return true; } elseif(e_REQUEST_HTTP."index.php" == $dbLink) { return true; } if(!empty($data['link_active'])) // Can be used by e_sitelink.php { return true; } // New e107 v.2.3.1 - using e107::nav('active', link url); $manualOverride = e107::getRegistry('core/e107/navigation/active'); if(!empty($manualOverride) && empty($data['link_sub'])) { if(strpos($dbLink, $manualOverride) !==false) { return true; } } // XXX Temporary Fix - @deprecated. // Set the URL matching in the page itself. see: forum_viewforum.php and forum_viewtopic.php if(defined("NAVIGATION_ACTIVE") && empty($data['link_sub'])) { if(strpos($data['link_url'], NAVIGATION_ACTIVE)!==false) { return true; } } return false; } }