/** * Loads the entire menu table into memory. * * @return array */ public function load() { // @Todo cache this $jlanguage = JFactory::getConfig()->getValue('language'); if (isset(self::$_menuitems[$jlanguage])) { $this->_items = self::$_menuitems[$jlanguage]; return; } // Initialise variables. $db = JFactory::getDbo(); $app = JApplication::getInstance('site'); $query = $db->getQuery(true); $query->select('m.id, m.menutype, m.title, m.alias, m.note, m.path AS route, m.link, m.type, m.level, m.language'); $query->select('m.browserNav, m.access, m.params, m.home, m.img, m.template_style_id, m.component_id, m.parent_id'); $query->select('e.element as component'); $query->from('#__menu AS m'); $query->leftJoin('#__extensions AS e ON m.component_id = e.extension_id'); $query->where('m.published = 1'); $query->where('m.parent_id > 0'); $query->where('m.client_id = 0'); $query->order('m.lft'); // Set the query $db->setQuery($query); if (!($this->_items = $db->loadObjectList('id'))) { JError::raiseWarning(500, JText::sprintf('JERROR_LOADING_MENUS', $db->getErrorMsg())); return false; } foreach ($this->_items as &$item) { // Get parent information. $parent_tree = array(); if (isset($this->_items[$item->parent_id])) { $parent_tree = $this->_items[$item->parent_id]->tree; } // Create tree. $parent_tree[] = $item->id; $item->tree = $parent_tree; // Create the query array. $url = str_replace('index.php?', '', $item->link); $url = str_replace('&', '&', $url); parse_str($url, $item->query); } // @Todo move this to plugin JFRoute::getInstance()->fixMenuItemRoutes($this->_items, null); // throw away everything that is not * or default as the rest is there only for translations $deflang = JoomFishManager::getInstance()->getDefaultLanguage(); foreach ($this->_items as &$item) { if ($item->language != '*' && $item->language != $deflang) { unset($this->_items[(string) $item->id]); } else { if ($item->language == $deflang) { $item->language = '*'; // either this or override JRouterSite line 222 that has * hardcoded } } } self::$_menuitems[$jlanguage] = $this->_items; }
function jfGetOtherLanguages() { // inspired by modules/mod_jflanguageselection $jfManager = JoomFishManager::getInstance(); $jfrouter = JFRoute::getInstance(); $curLang = jfGetCurrentLanguage(); $languages = array(); foreach ($jfManager->getActiveLanguages(true) as $lang) { if ($lang->lang_code != $curLang->lang_code) { $code = $lang->getLanguageCode(); $languages[$code] = $jfrouter->rerouteCurrentUrl($code); } } return $languages; }
function parseJFRule($router, &$uri) { //echo "got here too lang = ".$uri->getVar("lang","")."<br/>"; $route = $uri->getPath(); $conf = JFactory::getConfig(); $params = $conf->getValue("jfrouter.params"); $sefordomain = $params->get("sefordomain", "sefprefix"); $jfm = JoomFishManager::getInstance(); $langs = $jfm->getLanguagesIndexedById(); if ($sefordomain == "domain") { $host = $uri->getHost(); // TODO cache the indexed array $rawsubdomains = $params->getValue("sefsubdomain", array()); $subdomains = array(); foreach ($rawsubdomains as $domain) { list($langid, $domain) = explode("::", $domain, 2); // if you have inactive languages and are not logged in then skip inactive language if (!array_key_exists($langid, $langs)) { continue; } $domain = strtolower(str_replace("http://", "", $domain)); $domain = str_replace("https://", "", $domain); $domain = preg_replace("#/\$#", "", $domain); //$domain = str_replace("/","",$domain); $subdomains[$domain] = $langs[$langid]->shortcode; } if (array_key_exists($host, $subdomains)) { $lang = $subdomains[$host]; // This get over written later - really stupid !!! $uri->setVar("lang", $lang); JRequest::setVar('lang', $lang); // I need to discover language here since menu is loaded in router JFRoute::getInstance()->discoverJFLanguage(); // TODO fix this for HTTPS $conf->setValue('config.live_site', "http://" . $host); $conf->setValue("joomfish.current_host", $host); return array("lang" => $lang); } } else { // Consider stripping base path from URI /* $live_site = JURI::base(); $livesite_uri = new JURI($live_site); $livesite_path = $livesite_uri->getPath(); $route = str_replace($livesite_path,"",$route); */ $sefprefixes = $params->getValue("sefprefixes", array()); // Workaround if some language prefixes are missing if (!is_array($sefprefixes)) { $sefprefixes = array(); } if (count($sefprefixes) < count($langs)) { foreach ($sefprefixes as $prefix) { list($langid, $prefix) = explode("::", $prefix, 2); if (array_key_exists($langid, $langs)) { $langs[$langid]->hasprefix = true; } } foreach ($langs as $lang) { if (!isset($lang->hasprefix)) { $sefprefixes[] = $lang->lang_id . "::" . $lang->sef; } } } $segments = explode('/', $route); $seg = 0; while ($seg < count($segments)) { if (strlen($segments[$seg]) == 0) { $seg++; continue; } foreach ($sefprefixes as $prefix) { list($langid, $prefix) = explode("::", $prefix, 2); // explode off any suffix if (strpos($segments[$seg], ".") > 0 && $segments[$seg] != 'index.php') { $segcompare = substr($segments[$seg], 0, strpos($segments[$seg], ".")); // Trap for pdf, feed of html info in the extension if (strpos($segments[$seg], $prefix . ".") === 0) { $format = str_replace($prefix . ".", "", $segments[$seg]); //$uri->setVar("format",$format); //JRequest::setVar('format', $format); } } else { $segcompare = $segments[$seg]; } // including fix for suffix based url's and feeds if ($conf->getValue('sef_suffix') == 1 && $conf->getValue('sef_rewrite') == 1 && $conf->getValue('sef')) { for ($l = 0; $l < count($segments); $l++) { if (!empty($segments[$l])) { $format = explode(".", $segments[$l]); if (!empty($format[1]) && trim($format[1]) !== "" && trim($format[1]) !== "php") { $uri->setVar("format", $format[1]); JRequest::setVar('format', $format[1]); break; } } } } // does the segment match the prefix if ($segcompare == $prefix) { // This section forces the current url static to include the language string which means the base tag is correct - but ONLY on the home page // restricting this to the homepage means no risk for image paths etc. $homepage = true; for ($seg2 = $seg + 1; $seg2 < count($segments); $seg2++) { $segment = $segments[$seg2]; if (strlen($segment) > 0) { $homepage = false; } } if ($homepage) { $current = JURI::current(); $uri = JURI::getInstance(); $current = $uri->toString(array('scheme', 'host', 'port', 'path')); } unset($segments[$seg]); //array_shift($segments); $uri->setPath(implode("/", $segments)); $lang = $langs[$langid]->shortcode; // This get over written later - really stupid !!! $uri->setVar("lang", $lang); JRequest::setVar('lang', $lang); // I need to discover language here since menu is loaded in router JFRoute::getInstance()->discoverJFLanguage(); return array("lang" => $lang); } } $seg++; } } JFRoute::getInstance()->discoverJFLanguage(); return array(); }
/** * function to generate a new href link * @param JFLanguage the language * @param Module parameters * @return string new href string */ public static function createHRef($language, $modparams) { $code = $language->getLanguageCode(); $jfrouter = JFRoute::getInstance(); if ($modparams->get("cache_href", 1)) { $url = $jfrouter->rerouteCurrentUrlCached($code, false); } else { $url = $jfrouter->rerouteCurrentUrl($code); } return $url; }