getBackwardLang(); $LangPath = JPATH_COMPONENT_ADMINISTRATOR . DS . 'language' . DS; if (file_exists($LangPath . $language . '.php')) { require_once( $LangPath . $language . '.php' ); } else { require_once( $LangPath . 'english.php' ); } require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'classes' . DS . 'XmapConfig.php' ); require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'classes' . DS . 'XmapSitemap.php' ); require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'classes' . DS . 'XmapPlugins.php' ); require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'classes' . DS . 'XmapCache.php' ); $user = & JFactory::getUser(); global $xSitemap, $xConfig; $xConfig = new XmapConfig; $xConfig->load(); // This is an AJAX request to modify a item of the sitemap if ($task == 'editElement') { if ($user->get('gid') != "25") { die('Invalid request!'); } $sitemapid = JRequest::getInt('sitemap', 0); if ($sitemapid) { $sitemap = new XmapSitemap($database); if ($sitemap->load($sitemapid)) { $action = JRequest::getCmd('action', ''); $uid = JRequest::getCmd('uid', ''); $itemid = JRequest::getInt('itemid', ''); switch ($action) { case 'toggleElement': if ($uid && $itemid) { $state = $sitemap->toggleItem($uid, $itemid); } break; case 'changeProperty': $uid = JRequest::getCmd('uid', ''); $property = JRequest::getCmd('property', ''); $value = JRequest::getCmd('value', ''); if ($uid && $itemid && $uid && $property) { $state = $sitemap->chageItemPropery($uid, $itemid, 'xml', $property, $value); } break; } } } header('Content-Type: text/xml'); echo "\n"; echo "\n"; echo " OK\n"; echo " " . $state . "\n"; echo "\n"; exit; } elseif ($task == 'navigator') { require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'admin.xmap.html.php'); require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'classes' . DS . 'XmapAdmin.php'); xmapShowNavigator($xConfig); return; } elseif ($task == 'navigator-links') { require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'admin.xmap.html.php'); require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'classes' . DS . 'XmapAdmin.php'); xmapShowNavigatorLinks($xConfig); return; } $Itemid = intval(JRequest::getVar('Itemid', '', "REQUEST")); $sitemapid = ''; // Firts lets try to get the sitemap's id from the menu's params if ($Itemid) { $menu = JTable::getInstance('Menu'); $menu->load($Itemid); $params = new JParameter($menu->params); $sitemapid = intval($params->get('sitemap', '')); } if (!$sitemapid) { //If the is no sitemap id specificated $sitemapid = intval(JRequest::getVar('sitemap', '', "REQUEST")); } if (!$sitemapid && $xConfig->sitemap_default) { $sitemapid = $xConfig->sitemap_default; } $database = &JFactory::getDBO(); $xSitemap = new XmapSitemap($database); $xSitemap->load($sitemapid); //$database->setQuery('alter table #__xmap_sitemap add excluded_items text'); //$database->query(); if (!$xSitemap->id) { echo _XMAP_MSG_NO_SITEMAP; return; } if ($view == 'xml') { Header("Content-type: text/xml; charset=UTF-8"); Header("Content-encoding: UTF-8"); } global $xmap; $xmapCache = XmapCache::getCache($xSitemap); $excluded_items = $xSitemap->getExcludedItems(); if ($view == 'xml') { // Turn off all error reporting on XML view @ini_set('display_errors', 'Off'); // Set a high time limit to avoid problems. I think 900 seconds should be enough @set_time_limit(900); } if ($xSitemap->usecache) { $lang = JFactory::getLanguage(); sendHeaders($view); $xmapCache->call('xmapCallShowSitemap', $view, $xSitemap->id, $excluded_items, $lang->getName(), $mainframe->getCfg('sef'), $user->get('id'), $news,$xSitemap->compress_xml); // call plugin's handler function } else { xmapCallShowSitemap($view, $xSitemap->id, $excluded_items); } switch ($view) { case 'html': $xSitemap->views_html++; $xSitemap->lastvisit_html = time(); $xSitemap->save(); break; case 'xml': $xSitemap->views_xml++; $xSitemap->lastvisit_xml = time(); $xSitemap->save(); $scriptname = basename($_SERVER['SCRIPT_NAME']); $no_html = intval(JRequest::getVar('no_html', '0', "REQUEST")); if ($view == 'xml' && $scriptname != 'index2.php' || $no_html != 1) { die(); } break; } /** * Function called to generate and generate the tree. Created specially to * use with the cache call method * The params locale and sef are only for cache purppses */ function xmapCallShowSitemap($view, $sitemapid, $excluded_items, $locale='', $sef='', $userid=0, $news=0,$compress=false) { global $xmapCache, $xSitemap, $xConfig; $xSitemap->loadItems($view); $live_site = substr_replace(JURI::root(), "", -1, 1); switch ($view) { case 'xml': // XML Sitemaps output require_once(JPATH_COMPONENT_SITE . '/xmap.xml.php' ); $xmap = new XmapXML($xConfig, $xSitemap); $xmap->generateSitemap($view, $xConfig, $xmapCache); $xSitemap->count_xml = $xmap->count; break; default: // Html output global $mainframe; require_once( $mainframe->getPath('front_html') ); if (!$xConfig->exclude_css) { $mainframe->addCustomHeadTag(''); } $xmap = new XmapHtml($xConfig, $xSitemap); $xmap->generateSitemap($view, $xConfig, $xmapCache); $xSitemap->count_html = $xmap->count; break; } } function sendHeaders($view) { global $xSitemap, $xConfig,$mainframe; switch ($view) { case 'xml': // XML Sitemaps output require_once(JPATH_COMPONENT_SITE . '/xmap.xml.php' ); $xmap = new XmapXML($xConfig, $xSitemap); break; default: // Html output require_once( $mainframe->getPath('front_html') ); $xmap = new XmapHtml($xConfig, $xSitemap); break; } $xmap->sendHeaders(); } class Xmap { /** @var XmapConfig Configuration settings */ var $config; /** @var XmapSitemap Configuration settings */ var $sitemap; /** @var integer The current user's access level */ var $gid; /** @var boolean Is authentication disabled for this website? */ var $noauth; /** @var string Current time as a ready to use SQL timeval */ var $now; /** @var object Access restrictions for user */ var $access; /** @var string Type of sitemap to be generated */ var $view; /** @var string count of links on sitemap */ var $count = 0; /** Default constructor, requires the config as parameter. */ function Xmap(&$config, &$sitemap) { global $mainframe; jimport('joomla.utilities.date'); $user = & JFactory::getUser(); $access = new stdClass(); $access->canEdit = $user->authorize('com_content', 'edit', 'content', 'all'); $access->canEditOwn = $user->authorize('com_content', 'edit', 'content', 'own'); $access->canPublish = $user->authorize('com_content', 'publish', 'content', 'all'); $this->access = &$access; $date = new JDate(); $this->noauth = $mainframe->getCfg('shownoauth'); $this->gid = $user->gid; $this->now = $date->toUnix(); $this->config = &$config; $this->sitemap = &$sitemap; $this->isNews = false; $this->_isAdmin = ($user->gid == "25"); } /** Generate a full website tree */ function generateSitemap($type, &$config, &$cache) { $menus = $this->sitemap->getMenus(); $extensions = XmapPlugins::loadAvailablePlugins(); $root = array(); $this->startOutput($menus, $config); foreach ($menus as $menutype => $menu) { if (($type == 'html' && !$menu->show) || ($type == 'xml' && !$menu->showXML )) { continue; } $node = new stdclass(); $menu->id = 0; $menu->menutype = $menutype; $node->uid = $menu->uid = "menu" . $menu->id; $node->menutype = $menutype; $node->ordering = $menu->ordering; $node->priority = $menu->priority; $node->changefreq = $menu->changefreq; $node->browserNav = 3; $node->type = 'separator'; $node->name = $this->getMenuTitle($menutype, @$menu->module); // get the mod_mainmenu title from modules table $this->startMenu($node); $this->printMenuTree($menu, $cache, $extensions); $this->endMenu($node); } $this->endOutput($menus); return true; } /** Get a Menu's tree * Get the complete list of menu entries where the menu is in $menutype. * If the component, that is linked to the menuentry, has a registered handler, * this function will call the handler routine and add the complete tree. * A tree with subtrees for each menuentry is returned. */ function printMenuTree(&$menu, &$cache, $extensions) { $database = &JFactory::getDBO(); if (strlen($menu->menutype) == 0) { $result = null; return $result; } $menuExluded = explode(',', $this->sitemap->exclmenus); // by mic: fill array with excluded menu IDs $lang = JFactory::getLanguage(); $currentLang = $lang->getTag(); /* * noauth is true: - Will show links to registered content, even if the client is not logged in. - The user will need to login to see the item in full. * noauth is false: - Will show only links to content for which the logged in client has access. */ $sql = "SELECT m.id, m.name, m.parent, m.link, m.type, m.browserNav, m.menutype, m.ordering, m.params, m.componentid,m.home, c.name AS component" . "\n FROM #__menu AS m" . "\n LEFT JOIN #__components AS c ON m.type='components' AND c.id=m.componentid" . "\n WHERE m.published='1' AND m.parent=" . ( isset($menu->mid) ? $menu->mid : $menu->id ) . " AND m.menutype = '" . $menu->menutype . "'" . ( $this->noauth ? '' : "\n AND m.access <= '" . $this->gid . "'" ) . " AND ((m.params LIKE '%\nlang=\n%' OR m.params NOT LIKE '%\nlang=%') OR m.params LIKE '%lang=$currentLang%')" . "\n ORDER BY m.menutype,m.parent,m.ordering"; // Load all menuentries $database->setQuery($sql); $items = $database->loadObjectList(); if (count($items) <= 0) { //ignore empty menus $result = null; return $result; } $this->changeLevel(1); $router = JSite::getRouter(); foreach ($items as $i => $item) { // Add each menu entry to the root tree. $item->priority = @$menu->priority; $item->changefreq = @$menu->changefreq; if (in_array($item->id, $menuExluded)) { // ignore exluded menu-items continue; } $item->mid = $item->id; if ($item->type == 'menulink') { $menu = &JSite::getMenu(); $params = new JParameter($item->params); if ($newItem = $menu->getItem($params->get('menu_item'))) { $item->type = $newItem->type; $item->id = $newItem->id; $item->parent = $newItem->parent; $item->link = $newItem->link; $item->home = $newItem->home; } } $node = new stdclass; $node->id = $item->id; $node->mid = $item->mid; $node->uid = "itemid" . (isset($item->mid) ? $item->mid : $item->id); $node->name = $item->name; // displayed name of node $node->parent = $item->parent; // id of parent node $node->browserNav = $item->browserNav; // how to open link $node->ordering = isset($item->ordering) ? $item->ordering : $i; // display-order of the menuentry $node->priority = $item->priority; $node->changefreq = $item->changefreq; $node->type = $item->type; // menuentry-type $node->menutype = $item->menutype; // menuentry-type $node->home = $item->home; // menuentry-type $node->link = isset($item->link) ? htmlspecialchars($item->link) : ''; if ($node->type == 'separator') { $node->browserNav = 3; } XmapPlugins::prepareMenuItem($node, $extensions); // Let's see if the extension wants to do somenthing with this node before it's printed if ($node->home) { $menu = &JSite::getMenu(); $default = $menu->getDefault(); $homeLink = $default->link; $languageString = ''; $ItemidString = ''; if (!empty($_REQUEST['lang'])) { // is this default language ? $lang = & JFactory::getLanguage(); $language = $lang->getTag(); $language = explode('-', $language); $language = $language[0]; $conf =& JFactory::getConfig(); $jfDefaultLang = $conf->getValue( 'config.defaultlang'); if (!empty($jfDefaultLang) && $language != $jfDefaultLang) { $langString = 'lang=' . JRequest::getCmd( 'lang'); } } $connector = strpos( $homeLink, '?') !== false ? '&' : '?'; if (strpos( $homeLink, 'Itemid=') === false) { $ItemidString = 'Itemid='.$node->id; } $languageString = empty( $ItemidString) || empty($languageString) ? $languageString : '&' . $languageString; $homeLink .= $connector . $ItemidString . $languageString; $node->link = JRoute::_( $homeLink); } elseif (substr($item->link, 0, 9) == 'index.php' && $item->type != 'url' && $item->type != 'separator') { if (strpos($node->link, 'Itemid=') === FALSE) { $node->link = $router->getMode() == JROUTER_MODE_SEF ? 'index.php?Itemid=' . $node->id : $node->link . '&Itemid=' . $node->id; } } if ($this->printNode($node)) { if (preg_match('/option=(com_[a-z0-9_]+)/i', $item->link, $matches)) { // Set the uid of the node to the component uid after print it // so its children dont use a wrong uid # echo $node->uid = $matches[1]; } $this->printMenuTree($node, $cache, $extensions); XmapPlugins::printTree($this, $item, $cache, $extensions); // Determine the menu entry's type and call it's handler } } $this->changeLevel(-1); } /** Look up the title for the module that links to $menutype */ function getMenuTitle($menutype, $module='mod_mainmenu') { $database = &JFactory::getDBO(); $query = "SELECT * FROM #__modules WHERE published='1' AND module ='$module' AND params LIKE '%menutype=" . $menutype . "%'"; $database->setQuery($query); if (!$row = $database->loadObject()) return ''; return $row->title; } function getItemLink(&$node) { static $live_site; if (!isset($live_site)) { $juri = &JURI::getInstance(); $live_site = $juri->getScheme() . '://' . $juri->getHost(); if ($juri->getPort() != NULL) $live_site = $live_site . ':' . $juri->getPort(); } $link = $node->link; if (isset($node->id)) { switch (@$node->type) { case 'separator': break; default: if (!@$node->home && preg_match("#^/?index\.php\?#", $link)) { if (strpos($link, 'Itemid=') === FALSE) { if (strpos($link, '?') === FALSE) { $link .= '?Itemid=' . $node->id; } else { $link .= '&Itemid=' . $node->id; } } } break; } } if (!preg_match('#^[a-z0-9]+:#i', $link)) { if (strcasecmp(substr($link, 0, 9), 'index.php') === 0) { $link = JRoute::_($link); // apply SEF transformation if (strcasecmp(substr($link, 0, 4), 'http') && $this->view == 'xml') { // XML sitemap requires full path URL's $link = $live_site . (substr($link, 0, 1) == '/' ? '' : '/') . $link; } } else { // Case for internal links not starting with index.php if (substr($link, 0, 1) == '/') $link = $live_site . $link; else $link = $live_site . '/' . $link; } } return $link; } /** called with usort to sort menus */ function sort_ordering(&$a, &$b) { if ($a->ordering == $b->ordering) return 0; return $a->ordering < $b->ordering ? -1 : 1; } function &getParam($arr, $name, $def) { $var = JArrayHelper::getValue($arr, $name, $def, ''); return $var; } }