/** * Get menu item by id * * @param string $language The language code. * * @return mixed The item object or null when not found for given language * * @since 1.6 */ public function getDefault($language = '*') { if (array_key_exists($language, $this->_default) && $this->app->isSite() && $this->app->getLanguageFilter()) { return $this->_items[$this->_default[$language]]; } if (array_key_exists('*', $this->_default)) { return $this->_items[$this->_default['*']]; } return null; }
/** * Function to convert a sef route to an internal URI * * @param JUri &$uri The sef URI * * @return string Internal URI * * @since 3.2 * @deprecated 4.0 Attach your logic as rule to the main parse stage */ protected function parseSefRoute(&$uri) { $route = $uri->getPath(); // Remove the suffix if ($this->app->get('sef_suffix')) { if ($suffix = pathinfo($route, PATHINFO_EXTENSION)) { $route = str_replace('.' . $suffix, '', $route); } } // Get the variables from the uri $vars = $uri->getQuery(true); // Handle an empty URL (special case) if (empty($route)) { // If route is empty AND option is set in the query, assume it's non-sef url, and parse apropriately if (isset($vars['option']) || isset($vars['Itemid'])) { return $this->parseRawRoute($uri); } $item = $this->menu->getDefault($this->app->getLanguage()->getTag()); // If user not allowed to see default menu item then avoid notices if (is_object($item)) { // Set the information in the request $vars = $item->query; // Get the itemid $vars['Itemid'] = $item->id; // Set the active menu item $this->menu->setActive($vars['Itemid']); $this->setVars($vars); } return $vars; } // Parse the application route $segments = explode('/', $route); if (count($segments) > 1 && $segments[0] == 'component') { $vars['option'] = 'com_' . $segments[1]; $vars['Itemid'] = null; $route = implode('/', array_slice($segments, 2)); } else { // Get menu items. $items = $this->menu->getMenu(); $found = false; $route_lowercase = JString::strtolower($route); $lang_tag = $this->app->getLanguage()->getTag(); // Iterate through all items and check route matches. foreach ($items as $item) { if ($item->route && JString::strpos($route_lowercase . '/', $item->route . '/') === 0 && $item->type != 'menulink') { // Usual method for non-multilingual site. if (!$this->app->getLanguageFilter()) { // Exact route match. We can break iteration because exact item was found. if ($item->route == $route_lowercase) { $found = $item; break; } // Partial route match. Item with highest level takes priority. if (!$found || $found->level < $item->level) { $found = $item; } } elseif ($item->language == '*' || $item->language == $lang_tag) { // Exact route match. if ($item->route == $route_lowercase) { $found = $item; // Break iteration only if language is matched. if ($item->language == $lang_tag) { break; } } // Partial route match. Item with highest level or same language takes priority. if (!$found || $found->level < $item->level || $item->language == $lang_tag) { $found = $item; } } } } if (!$found) { $found = $this->menu->getDefault($lang_tag); } else { $route = substr($route, strlen($found->route)); if ($route) { $route = substr($route, 1); } } if ($found) { $vars['Itemid'] = $found->id; $vars['option'] = $found->component; } } // Set the active menu item if (isset($vars['Itemid'])) { $this->menu->setActive($vars['Itemid']); } // Set the variables $this->setVars($vars); // Parse the component route if (!empty($route) && isset($this->_vars['option'])) { $segments = explode('/', $route); if (empty($segments[0])) { array_shift($segments); } // Handle component route $component = preg_replace('/[^A-Z0-9_\\.-]/i', '', $this->_vars['option']); if (count($segments)) { $crouter = $this->getComponentRouter($component); $vars = $crouter->parse($segments); $this->setVars($vars); } } else { // Set active menu item if ($item = $this->menu->getActive()) { $vars = $item->query; } } return $vars; }
/** * Convert a sef route to an internal URI * * @param JRouterSite &$router Router object * @param JUri &$uri URI object to process * * @return void * * @since 4.0 */ public function parseSefRoute(&$router, &$uri) { $route = $uri->getPath(); // If the URL is empty, we handle this in the non-SEF parse URL if (empty($route)) { return; } // Parse the application route $segments = explode('/', $route); if (count($segments) > 1 && $segments[0] == 'component') { $uri->setVar('option', 'com_' . $segments[1]); $uri->setVar('Itemid', null); $route = implode('/', array_slice($segments, 2)); } else { // Get menu items. $items = $this->menu->getMenu(); $found = false; $route_lowercase = JString::strtolower($route); $lang_tag = $this->app->getLanguage()->getTag(); // Iterate through all items and check route matches. foreach ($items as $item) { if ($item->route && JString::strpos($route_lowercase . '/', $item->route . '/') === 0 && $item->type != 'menulink') { // Usual method for non-multilingual site. if (!$this->app->getLanguageFilter()) { // Exact route match. We can break iteration because exact item was found. if ($item->route == $route_lowercase) { $found = $item; break; } // Partial route match. Item with highest level takes priority. if (!$found || $found->level < $item->level) { $found = $item; } } elseif ($item->language == '*' || $item->language == $lang_tag) { // Exact route match. if ($item->route == $route_lowercase) { $found = $item; // Break iteration only if language is matched. if ($item->language == $lang_tag) { break; } } // Partial route match. Item with highest level or same language takes priority. if (!$found || $found->level < $item->level || $item->language == $lang_tag) { $found = $item; } } } } if (!$found) { $found = $this->menu->getDefault($lang_tag); } else { $route = trim(substr($route, strlen($found->route)), '/'); } if ($found) { $uri->setVar('Itemid', $found->id); $uri->setVar('option', $found->component); } } // Set the active menu item if ($uri->getVar('Itemid')) { $this->menu->setActive($uri->getVar('Itemid')); } // Parse the component route if (!empty($route) && $uri->getVar('option')) { $segments = explode('/', $route); if (count($segments)) { // Handle component route $component = preg_replace('/[^A-Z0-9_\\.-]/i', '', $uri->getVar('option')); $crouter = $this->getComponentRouter($component); $uri->setQuery(array_merge($uri->getQuery(true), $crouter->parse($segments))); } $route = implode('/', $segments); } $uri->setPath($route); }