强制Joomla JRoute使用菜单项

时间:2014-07-10 13:13:41

标签: php joomla routes joomla2.5 url-routing

我正在为Joomla构建一个组件! 2.5并在里面我使用JRoute::_('index.php?option=com_myapp&view=cpanel')构建我的所有链接。这有效,但它产生的链接看起来像这样:

/component/myapp/cpanel.html

在菜单中,我已经定义index.php?option=com_myapp&view=cpanel的别名是" myapp"所以链接应该是

/myapp/cpanel.html

可以通过此路径访问该组件。如果我这样做,内部生成的所有链接都将具有/myapp前缀。但是要在模板(特殊登录链接)中使用,如果用户偶然发现/component/myapp ....我仍然希望所有链接都转到/myapp前缀。

如何强制JRoute单独使用此菜单项?

3 个答案:

答案 0 :(得分:2)

//look if there is a menu item set for myapp. if yes, we use that one to redirect
$db  = JFactory::getDBO();
$defaultRedirect = 'index.php?option=com_myapp&view=cpanel';
$db->setQuery('SELECT `id` FROM #__menu WHERE `link` LIKE '. $db->Quote($defaultRedirect) .' LIMIT 1' );
$itemId = ($db->getErrorNum())? 0 : intval($db->loadResult());
if($itemId){
    $rpath = JRequest::getString('return', base64_encode(JRoute::_('index.php?Itemid='.$itemId)));
}else{
    $rpath = JRequest::getString('return', base64_encode(JRoute::_('index.php?option=com_myapp&view=cpanel')));
}

注意:这不是语言安全的。它需要在db中找到第一个菜单项。如果为不同的语言设置不同的菜单别名,则必须在SQL查询中检查正确的语言。

答案 1 :(得分:2)

因为我在这个问题上遇到了很多困难,所以我做了一个快速的功能,它将尝试根据菜单项找到链接。它主要基于其他答案。

仅在Joomla 3.5上测试过。不推荐使用JRequest,因此使用$ app->输入。这可能会做得更好,但至少它适用于我的用途。希望它也可以帮助其他人!

public static function getRouteMenu($default_url) {
    $db = JFactory::getDbo();
    $app = JFactory::getApplication();
    $jinput = $app->input;

    $db->setQuery('SELECT `id` FROM #__menu WHERE `link` LIKE '. $db->Quote($default_url) .' AND `published` = 1 LIMIT 1' );
    $itemId = $db->loadResult();
    if($itemId) {
        $route = $jinput->getString('return', JRoute::_('index.php?Itemid='.$itemId));
        $route = str_replace('index.php/', '', $route);
    } else {
        $route = $jinput->getString('return', JRoute::_($default_url));
    }

    return $route;
}

该参数需要未重写的链接,例如:index.php?option=com_content&view=article&id=10。如果您需要确定如何建立此链接,请检查您的数据库。

答案 2 :(得分:0)

理想情况下,您需要将路由器设置为组件的一部分。菜单管理器将覆盖组件/ myapp位,但之后的内容将取决于router.php文件中的内容。

http://docs.joomla.org/Supporting_SEF_URLs_in_your_component

但是,如果您只是需要创建指向特定菜单项的链接,那么您始终只需将Itemid添加到参数

JRoute::_('index.php?Itemid=12')

将指向任何ID为12的菜单项,因此,如果这是com_myapp组件的菜单项ID,它将创建指向该页面的链接的菜单版本。

编辑:

您可以在技术上将相同的组件分配给两个菜单项,因此当您链接到菜单项外部的组件而不给链接指定itemid时,我不认为处理URL的开头是默认行为。 Joomla说(在创建JRoute的链接时)......

  

“请注意,可以省略参数选项和   ITEMID。 option默认为当前组件的名称   执行,并且Itemid默认为当前菜单项的ID。“

即,从您的主页(或一组以外的任何页面使用您的组件)调用它而不使用itemid或选项,它可能会认为您处于com_content和主页菜单项。

如果要链接到菜单项之外的组件但没有对itemid进行硬编码,那么一种方法是将Menuitem字段类型添加到要链接的模块或模板的配置选项中,然后将它生成的itemid添加到您的链接。

您还可以使用JFactory :: getApplication() - > getMenu()来查找链接到您的组件的菜单项。没有机会对此进行测试 - 但使用它也可能意味着您可以在路由器中设置itemid参数。