Как получить конкретные пункты меню от joomla?

этот вопрос немного специфичен для Joomla.

У меня есть главное меню, состоящее из:

Главная|О НАС|Политика конфиденциальности|портфолио|контакты.

каждый пункт меню является ссылкой на статью.

теперь на полном сайте есть много мест в компонентах и модулях, где мне нужно показать две ссылки : Политика конфиденциальности и портфолио.

может кто-то пожалуйста, руководство мне? Я не хочу жестко кодировать ссылки как идентификатор элемента будет отличаться в производстве.

9 ответов


есть 2 способа сделать это:

Вариант 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.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();

в Joomla есть возможность связать с любым меню с конкретной опцией гиперссылки. Из структуры бэкэнд-меню, где вы помещаете ссылку на статью, оттуда вы можете выбрать другую ссылку.


стандартный способ сделать это здесь: http://docs.joomla.org/Help32:Menus_Menu_Item_Menu_Item_Alias

просто сделайте второе меню с помощью политики конфиденциальности и портфолио и в качестве типа элемента меню выберите Системные ссылки > пункт псевдоним меню. Затем вы можете связать его с пунктом меню из меню, которое вы уже создали.

таким образом, Вы сможете изменить исходную ссылку на статью в любое время, и весь псевдоним будет обновляться.


<?php

$menuitemid = JRequest::getInt( 'Itemid' );
if ($menuitemid)
{
    $menu = JSite::getMenu();
    $menuparams = $menu->getParams( $menuitemid );
    $params->merge( $menuparams );
}

$propvalue= $params->get('property_name');

?>

Не проще ли создать новое меню, содержащее два псевдонима меню, которые вы хотите затем загрузить их в любом месте на веб-сайте, используя {loadposition} или что?


Я думаю, что вы должны создать новое меню в joomla, а затем сделать псевдонимы типа пунктов меню, вы должны сделать это, чтобы убедиться, что вы не получите повторяющиеся проблемы с контентом. Я думаю, что Алекс ответ в порядке, если вы хотите сделать это с кодом, но его сложнее поддерживать и для кого-то понять, кто приходит. Поскольку это пункт меню, на мой взгляд, он не принадлежит компоненту или модулю.


чтобы получить все пункты меню в 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's 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
);

$app = JFactory::getApplication();
$menu = $app->getMenu();
$items = $menu->getItems('menutype', 'mainmenu');