Карта сайта необходима не только для поисковых систем, но и для пользователей.
Скорее всего Вы выберите уже существующий компонент, но данный способ поможет разгрузить систему от лишних запросов и установки новых компонентов.
В моем случае все же понадобилось установить плагин, который подключает php файл. Если нужен плагин напишите в комментариях выложу.
Первым делом сформируем запрос к БД используя API Joomla.
/*формируем запрос*/ $db = &JFactory::getDbo(); // БД $query = $db->getQuery(true); $query->from('_menu'); // таблица с меню (не забудьте префикс ) $query->select($db->quoteName(array('id', 'parent_id','title', 'alias', 'menutype'))); // необходимые поля в выборке $query->where('published = 1'); // только опубликованные пункты меню $query->where('access = 1'); // уровень доступа публичный /* язык карты */ if ($lang == 'en-GB') { $query->where('language = "en-GB"'); // язык меню $query->whereOr('language = "*"'); // язык меню любой } else { $query->where('language = "ru-RU"'); // язык меню $query->whereOr('language = "*"'); // язык меню любой } $db->setQuery($query); // запрос $results = $db->loadRowList(); // ссылки меню
Далее форматируем запрос под функцию
/*формат функции*/ foreach ($results as $key => $value) $menu[$value[1]][$value[0]] = $value;
Вызываем функцию для формирования дерева меню
build_tree($menu,1, $perm, $lang);
Итоговый код
<?php function build_tree($cats,$parent_id,$perm = false, $lang = 'ru-RU'){ $param = &JRequest::getVar('param'); // параметр all (для получения всех данных о меню) if ( $lang == 'en-GB' ) { $uri = JURi::base().'en/'; // для языковых версий языка } else { $uri = JURi::base(); } $all = &JRequest::getUri(); // вся карта сайта $class = ''; // класс списка меню $menutype = ''; // название меню к которому пункт принадлежит if(is_array($cats) and isset($cats[$parent_id])){ //0 id //1 parent_id //2 title //3 link //4 menutype $tree = '<ul>'; foreach($cats[$parent_id] as $cat) { $base = JFactory::getApplication()->getMenu()->getItem($cat[0]); preg_match("/\d{4}.\d{2}-\d{2}-\d{2}-\d{2}-\d{2}/U", $base->route, $matches); if (strpos($all, 'sitemap-all') && count($matches) != 0 && $base->type != 'url') { $class = 'error'; } $menutype = $cat[4]; if ( (count($matches) == 0 && $perm == false) || ($perm == true && $param == 'all') || count($matches) == 0 || strpos($all, 'sitemap-all') || $base->type == 'url' ) { if ($base->type == 'url') { $tree .= '<li class="'.$class.'"><a href="'.$base->link .'">'.$cat[2].'</a>'; } else { $tree .= '<li class="'.$class.'"><a href="'.$uri. $base->route .'">'.$cat[2].'</a>'; } if (strpos($all, 'sitemap-all')) { $tree .= ' <span class="menutype">'.$menutype.'</span>'; } $tree .= build_tree($cats,$cat[0],$perm, $lang); $tree .= '</li>'; } $class = ''; $matches = []; } $tree .= '</ul>'; } else return null; return $tree; } $db = &JFactory::getDbo(); // БД $language = &JFactory::getLanguage(); // язык $lang = $language->getTag(); // язык $user = &JFactory::getUser(); // юзер /*права редактирования файлов*/ /* принадлежность к группе */ if (in_array(8, $user->groups)) { $perm= true; } else { $perm= false; } /* права редактирования */ /*if ($user->authorise( 'com_content', 'edit', 'content', 'all' )) { $perm= true; } else { $perm = false; }*/ /*формируем запрос*/ $query = $db->getQuery(true); $query->from('tsp15_menu'); $query->select($db->quoteName(array('id', 'parent_id','title', 'alias', 'menutype'))); $query->where('published = 1'); $query->where('access = 1'); /* язык карты*/ if ($lang == 'en-GB') { $query->where('language = "en-GB"'); $query->whereOr('language = "*"'); } else { $query->where('language = "ru-RU"'); $query->whereOr('language = "*"'); } $db->setQuery($query); $results = $db->loadRowList(); // ссылки меню /*формат функции*/ foreach ($results as $key => $value) $menu[$value[1]][$value[0]] = $value; echo build_tree($menu,1, $perm, $lang); ?> <style type="text/css"> li.error { color:green; /*border-bottom: 0.1px solid red;*/ } .menutype { color: #000; background-color: #ffa58a; } </style>