Как получить определенные пункты меню из joomla?
Этот вопрос определен для Joomla.
У меня есть главное меню, состоящее из:
Главная | О США | Политика конфиденциальности | Портфолио | Контакты США.
Каждый элемент меню является ссылкой на статью.
Теперь на полном сайте есть много мест в компонентах и модулях, где мне нужно показать две ссылки: Политика конфиденциальности и Портфолио.
Может ли кто-нибудь направить меня? Я не хочу жестко кодировать ссылки, поскольку идентификатор элемента будет отличаться в процессе производства.
Ответы
Ответ 1
Есть два способа сделать это:
Вариант 1:
Joomla загружает меню каждый раз, когда загружается страница. Вы можете получить доступ к меню, вызвав следующие методы.
// Get default menu - JMenu object, look at JMenu api docs
$menu = JFactory::getApplication()->getMenu();
// Get menu items - array with menu items
$items = $menu->getMenu();
// Look through the menu structure, once you understand it
// do a loop and find the link that you need.
var_dump($items);
Этот метод выполняется быстрее, потому что вам не нужно запрашивать базу данных. Простое управление в памяти.
Вариант 2:
Получите его из базы данных. Либо получите ссылку меню из jos_menu
на основе псевдонима или что-то еще, либо получите статью # из jos_content
по псевдониму статьи, а затем создайте ссылку
$db = JFactory::getDBO();
// Load by menu alias
$query = "SELECT link FROM #__menu WHERE alias = 'privacy-policy'";
$db->setQuery($query);
$url = $db->loadResult();
$url = JRoute::_($url);
// Load by article alias
$query = "SELECT id FROM #__content WHERE alias = 'privacy-policy'";
$db->setQuery($query);
$articleId = (int) $db->loadResult();
$url = JRoute::_("index.php?option=com_content&view=article&id=$articleId");
Ответ 2
Самый простой способ выполнить это в версии 2.5+:
$app = JFactory::getApplication();
$menu = $app->getMenu();
$menu_items = $menu->getItems('menutype', 'mainmenu');
Просто замените "mainmenu" на menutype, который вы хотите вытащить. Это будет соответствовать системному имени вашего меню, так же, как вы бы выбрали в модуле меню.
Изменить в ответ на вопрос @betweenbrain ниже:
Получите объект меню так же, как указано выше, а затем:
// To get menu items filtered by access level of current user.
$filtered_menu_items = $menu->getItems(null, null);
// To get all menu items, unfiltered.
$all_menu_items = $menu->getMenu();
Ответ 3
В Joomla есть возможность связать любое меню с определенной опцией гиперссылки. Из структуры бэкэнд-меню, где вы помещаете ссылку на статью, оттуда вы также можете выбрать другую ссылку.
Ответ 4
Стандартный способ сделать это здесь:
http://docs.joomla.org/Help32:Menus_Menu_Item_Menu_Item_Alias
Просто создайте второе меню с помощью только Политики конфиденциальности и Портфолио и в качестве типа элемента меню выберите "Системные ссылки" > "Псевдоним меню".
Затем вы можете связать его с пунктом меню из уже созданного меню.
Таким образом, вы сможете изменить исходную ссылку статьи в любое время, и все псевдонимы будут обновляться.
Ответ 5
<?php
$menuitemid = JRequest::getInt( 'Itemid' );
if ($menuitemid)
{
$menu = JSite::getMenu();
$menuparams = $menu->getParams( $menuitemid );
$params->merge( $menuparams );
}
$propvalue= $params->get('property_name');
?>
Ответ 6
Не проще ли создать новое меню, содержащее два псевдонима, в меню, которое вы хотите, а затем загружать их в любом месте на веб-сайте, используя {loadposition}
или что-то еще?
Ответ 7
Я думаю, что вы должны создать новое меню в joomla, а затем создать псевдонимы типа элементов меню, вы должны сделать это, чтобы убедиться, что вы не получаете повторяющиеся проблемы с содержимым.
Я думаю, что ответ Алекс одобрен, если вы хотите сделать это с помощью кода, но его сложнее поддерживать, а кому-то понять, кто приходит. Поскольку это элемент меню, он, по моему мнению, не принадлежит к компоненту или модулю.
Ответ 8
Получить все пункты меню в joomla backend/administrator. Протестировано в Joomla 3.3 +
<?php
// Create JApplicationSite instance to get all menu
$site = new JApplicationSite;
$menu = $site->getMenu();
// Get menu items - array filtered by access level of current user. Replace with `getMenu` to get all items or check @don-gilbert answer.
$menuItems = $menu->getItems(null, null);
// Build please select option for no itemid
$selectOption = array();
$selectOption[] = JHTML::_(
'select.option',
'',
JText::_('COM_REDSHOP_PLEASE_SELECT'),
'id',
'title'
);
// Merge items to build select list.
$items = array_merge($selectOption, $menuItems);
// Just print array to understand the structure
echo "<pre>";
print_r($items);
echo "</pre>";
// Or create a select list directly using array.
echo JHtml::_(
'select.genericlist',
$items,
'menu_item_id',
'',
'id',
'title',
$this->detail->menu_item_id
);