Как получить конкретные пункты меню от Joomla? - PullRequest
17 голосов
/ 24 сентября 2010

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

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

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

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

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

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

Ответы [ 9 ]

31 голосов
/ 24 сентября 2010

Есть 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");
16 голосов
/ 19 апреля 2012

Самый простой способ сделать это в 2.5+:

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

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

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

// 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();
2 голосов
/ 13 июля 2013

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

1 голос
/ 01 января 2014

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

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

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

0 голосов
/ 23 июля 2018
$app = JFactory::getApplication();
$menu = $app->getMenu();
$items = $menu->getItems('menutype', 'mainmenu');
0 голосов
/ 26 февраля 2015

Получить все пункты меню в бэкэнде / администраторе joomla. Протестировано в Joomla 3.3 +

<code><?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 "
"; // Или создать список выбора напрямую, используя массив. echo JHtml :: _ ( 'Select.genericlist', $ пунктов, 'Menu_item_id', '', 'Я бы', 'заглавие', $ This-> detail-> menu_item_id );
0 голосов
/ 07 ноября 2013

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

0 голосов
/ 03 апреля 2013

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

0 голосов
/ 10 октября 2010
<?php

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

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

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...