/** * Get routed links for content items */ static function getItemRoute($id, $catid = 0, $_Itemid = 0, $item = null) { $Itemid = $_Itemid == -1 ? 0 : $_Itemid; // -1 indicates to return the found menu Itemid instead of the produced link static $component_default_menuitem_id = null; // Calculate later only if needed static $current_language = null; if ($current_language === null) { $current_language = JFactory::getLanguage()->getTag(); // Current language tag for J2.5+ but not for J1.5 } static $use_language = null; if ($use_language === null) { $use_language = JLanguageMultilang::isEnabled(); if ($use_language) { self::_buildLanguageLookup(); } } global $globalcats; $_catid = (int) $catid; $_id = (int) $id; // ***************************************************************** // Get data of the FLEXIcontent item (only if not already given) // including data like: type id, language, but do not do 1 SQL query // per item, to get the type id and language ... // for language we will use current language, for type_id, we ignore // ***************************************************************** // Compatibility with calls not passing item data, check for item data in global object, avoiding an extra SQL call if (!$item) { $item = FlexicontentHelperRoute::_loadItem($_id, $doQuery = false); } // Get language $language = !$item || @(!$item->language) ? $current_language : $item->language; // Get type ID $type_id = $item && isset($item->type_id) ? $item->type_id : 0; // Get type data static $types = null; if ($type_id && $types === null) { $types = FlexicontentHelperRoute::_getTypeParams(); } $type = $type_id && isset($types[$type_id]) ? $types[$type_id] : false; // ***************************************************************** // DONE ONCE (per encountered type): Get content type's default menu // ***************************************************************** if ($type) { $type_menu_itemid_usage = $type->params->get('type_menu_itemid_usage', 0); // ZERO: do not use, 1: before item's category, 2: after item's category $type_menu_itemid = $type->params->get('type_menu_itemid', 0); if ($type_menu_itemid_usage && $type_menu_itemid) { if (!isset($type->typeMenuItem)) { $menus = JFactory::getApplication()->getMenu('site', array()); // this will work in J1.5 backend too !!! $type->typeMenuItem = $menus->getItem($type_menu_itemid); } } } // ********************************************************************************** // Get item's parent categores to be used in search a menu item of type category view // ********************************************************************************** $parents_ids = array(); if ($_catid && isset($globalcats[$_catid]->ancestorsarray)) { $parents_ids = array_reverse($globalcats[$_catid]->ancestorsarray); } // ********************************************************** // Create the needles for table lookup in descending priority // ********************************************************** $needles = array(); // Priority 1: Item view menu items of given item ID $needles[FLEXI_ITEMVIEW] = array($_id); // Priority 2: Type's default before categories (if so configured): ... giving an object means no-lookup and just use it if ($type && $type_menu_itemid_usage == 1 && $type->typeMenuItem) { $needles['type_before'] = $type->typeMenuItem; } // Priority 3: Category view menu items of given category IDs ... item's category and its parent categories in ascending order $needles['category'] = $parents_ids; // Priority 4: Directory view menu items ... pointing to same category IDs as above $needles['flexicontent'] = $needles['category']; // Priority 5: Type's default after categories (if so configured): ... giving an object means no-lookup and just use it if ($type && $type_menu_itemid_usage == 2 && $type->typeMenuItem) { $needles['type_after'] = $type->typeMenuItem; } // Do not add component's default menu item to allow trying "ALL" language items ? before component default ? // Other data to pass to _findItem() $data = array(); $data['item'] = $item; // *************** // Create the link // *************** // view $link = 'index.php?option=com_flexicontent&view=' . FLEXI_ITEMVIEW; // category id if ($_catid) { $link .= '&cid=' . $catid; } // item id $link .= '&id=' . $id; // use SEF language code as so configured $data['language'] = '*'; // Default to ALL if ($use_language && $language && $language != "*") { if (isset(self::$lang_lookup[$language])) { if (self::$add_url_lang && isset(self::$interface_langs[$language])) { $link .= '&lang=' . self::$lang_lookup[$language]; } $data['language'] = $language; } } // ************************************************* // Finally find the menu item id (best match) to use // ************************************************* // USE the itemid provided, if we were given one it means it is "appropriate and relevant" if ($Itemid) { $link .= '&Itemid=' . $Itemid; } else { if ($menuitem = FlexicontentHelperRoute::_findItem($needles, $data)) { $Itemid = $menuitem->id; $link .= '&Itemid=' . $Itemid; } else { if ($component_default_menuitem_id === null) { $component_default_menuitem_id = FlexicontentHelperRoute::_setDefaultMenuitemId(); } if ($component_default_menuitem_id) { $Itemid = $component_default_menuitem_id; $link .= '&Itemid=' . $Itemid; } } } // Return menu Itemid or the produced link return $_Itemid == -1 ? $Itemid : $link; }