2010-09-24 3 views
15

Этот вопрос немного специфичен для Joomla.Как получить конкретные пункты меню из joomla?

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

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

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

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

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

ответ

28

Есть 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"); 
+0

Спасибо Алекс. Я выбрал вариант 2 – jtanmay

0
<?php 

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

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

?> 
+0

, это не сработает, потому что если вы находитесь в представлении компонентов, ItemID будет из пункта меню, который приведет к компоненту. Это далеко. – Alex

+0

'JRequest' устарел. Вам нужно использовать 'JFactory :: getApplication() -> input' –

14

Самый простой способ для достижения этой цели в 2.5+ является:

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

Просто замените «mainmenu» на menutype, который вы хотите вытащить. Это будет соответствовать системному имени вашего меню, так же, как вы выбрали бы в модуле меню.

Редактировать в ответ на @ промежуточный мозг-то вопрос ниже: Получить меню объекта точно так же, как описано выше, а затем:

// 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(); 
+0

Спасибо Дону! Кажется, стоит снова проверить мой собственный вопрос! :) – jtanmay

+0

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

+0

Дон Гилберт - есть ли способ использовать это в 2.5 для получения всех пунктов меню из всех меню? Я вижу, что _items защищен. – betweenbrain

0

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

2

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

0

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

2

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

Просто сделайте второе меню с просто Конфиденциальность & портфолио в и как тип пункта меню выберите System Links> Меню Алиас Элемента. Затем вы можете связать его с пунктом меню из уже созданного меню.

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

0

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