Карта сайта необходима не только для поисковых систем, но и для пользователей.
Скорее всего Вы выберите уже существующий компонент, но данный способ поможет разгрузить систему от лишних запросов и установки новых компонентов.
В моем случае все же понадобилось установить плагин, который подключает 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>