如何从joomla获取特定的菜单项?

时间:2010-09-24 13:40:55

标签: joomla

这个问题对Joomla来说有点具体。

我有一个主菜单包括:

主页|关于我们|隐私政策|投资组合|联系我们

每个菜单项都链接到一篇文章。

现在在完整的网站上,我需要在组件和模块中有许多地方显示两个链接:隐私政策&投资组合。

有人可以指导我吗?我不想硬编码链接,因为项目ID在生产中会有所不同。

9 个答案:

答案 0 :(得分:31)

有两种方法可以做到:

选项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");

答案 1 :(得分:16)

在2.5+中完成此操作的最简单方法是:

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

只需将'mainmenu'替换为您想要提取的类型。这相当于菜单的系统名称,与在菜单模块中选择的名称相同。

编辑以回应@ 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();

答案 2 :(得分:2)

在Joomla中,有一个选项可以链接任何带有特定超链接选项的菜单。从您放置文章链接的后端菜单结构,您可以从那里选择其他链接。

答案 3 :(得分:1)

这样做的标准方法是: http://docs.joomla.org/Help32:Menus_Menu_Item_Menu_Item_Alias

只需制作第二个菜单,只需使用隐私政策&作为菜单项类型的投资组合选择系统链接>菜单别名项目。 然后,您可以选择将其链接到您已创建的菜单中的菜单项。

这样您就可以随时更改原始文章链接,并且所有别名都会更新。

答案 4 :(得分:0)

<?php

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

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

?>

答案 5 :(得分:0)

是否更容易创建一个包含两个别名的菜单,然后使用{loadposition}或其他任何内容将它们加载到网站的任何位置?

答案 6 :(得分:0)

我认为您应该在joomla中创建一个新菜单然后创建别名类型的菜单项,您应该这样做以确保您不会出现重复的内容问题。 我认为亚历克斯的答案是可以的,如果你想用代码来做,但更难维护,有人知道谁出现。因为它是一个菜单项,我认为它不属于组件或模块。

答案 7 :(得分:0)

获取joomla后端/管理员中的所有菜单项。测试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
);

答案 8 :(得分:-1)

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