当前位置: 首页 > 知识库问答 >
问题:

强制Joomla JRoute使用菜单项

危寒
2023-03-14

我正在为Joomla构建一个组件!在2.5版本中,我使用的是JRoute::(('index.php?option=com\u myapp

/component/myapp/cpanel.html

然而,在菜单中,我定义了索引。php?option=com\u myapp

/myapp/cpanel.html

可以通过此路径访问该组件。如果我这样做的话,内部生成的所有链接都会有/myapp前缀。但用于模板(特殊登录链接),如果用户无意中发现/component/myapp。。。。我仍然希望所有链接都指向/myapp前缀。

我如何强制JRoad使用这个菜单项条目本身?


共有3个答案

沈伟
2023-03-14

理想情况下,您需要将路由器设置为组件的一部分。菜单管理器将覆盖组件/myapp位,但之后的内容将由路由器中的内容决定。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 say(关于为JRoute创建链接)。。。

请注意,可以省略parameters选项和Itemid。option默认为当前正在执行的组件的名称,Itemid默认为当前菜单项的ID

也就是说,在没有itemid或选项的情况下,从您的主页(或使用您的组件的一个集合之外的任何页面)调用它,它可能会认为您在com_内容中,并且使用主页菜单项。

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

您也可以使用JFactory::getApplication()-

隗昀
2023-03-14
//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')));
}

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

卞云瀚
2023-03-14

因为我在这个问题上做了很多努力,这里有一个我做的快速功能,它将尝试根据菜单项查找链接。这主要是基于其他答案。

这只在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;
}

该参数需要未重写的链接,例如:索引。php?选项=com_内容

 类似资料:
  • 现在我们要在主窗口中加入自己的菜单。菜单编程一般分三步: 1.编辑菜单资源,设置菜单属性(包括菜单名和ID); 2.用ClassWizard自动映射菜单消息和成员函数; 3.手工编辑成员函数,加入菜单消息处理代码。 3.6.1 编辑菜单资源 仍然使用我们前面生成的Hello程序,编辑由AppWizard自动生成的菜单资源。要编辑菜单资源: (1) 选择项目工作区的ResourceView标签,切换

  • 我看到这篇文章给出了使用WebClient将文件上传到ftp的简单想法。这很简单,但如何强制它使用SSL?

  • sp_get_menu($id,$menu_root_ul_id,$filetpl,$foldertpl,$ul_class,$li_class,$menu_root_ul_class,$showlevel,$dropdown) 功能: 生成指定ID的导航 参数: $id:导航id $menu_root_ul_id:菜单根节点ul标签的id属性值 $filetpl:没有子菜单的菜单的html模板

  • 问题内容: 我们正在与第三方进行集成,该第三方发送的XML的Content-Type标头为text / html。我们正计划使用Spring的RestTemplate将其映射到我们从xsds生成的类,但是RestTemplate无法找到合适的转换器用于内容。第三方拒绝修复内容类型,因为它可能破坏其他伙伴的集成。 Spring的RestTemplate是否有办法强制其使用特定的转换器?我们基本上只是

  • 问题内容: 我正在运行没有代理并且使用SSL的node.js express 3服务器。 我试图弄清楚如何强制所有连接通过https。 Google搜索向我显示了这一点: https://groups.google.com/forum/#!topic/express- js/Bm6yozgoDSY 当前没有办法强制执行https重定向,尽管这似乎有点奇怪。我们有一个仅使用https的应用程序,并且

  • 我们正在与第三方集成,该第三方以text/html的形式发送带有content-type标题的xml。我们计划使用Spring的RestTemplate将其映射到我们从xsds生成的类,但是RestTemplate未能为内容找到合适的转换器。第三方拒绝修复内容类型,因为这可能会破坏其他合作伙伴的集成。 Spring的RestTemplate有办法强制它使用特定的转换器吗?我们基本上只是在做以下几点