代码之家  ›  专栏  ›  技术社区  ›  Martin Müller

强制Joomla JRoute使用菜单项

  •  5
  • Martin Müller  · 技术社区  · 10 年前

    我正在为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 ….我仍然希望所有链接都能转到 /米亚普 前缀

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

    3 回复  |  直到 7 年前
        1
  •  3
  •   soenguy    8 年前

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

    这只在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
  •  2
  •   Martin Müller    10 年前
    //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查询中的正确语言。

        3
  •  0
  •   RichardB    10 年前

    理想情况下,您需要将路由器设置为组件的一部分。菜单管理器将覆盖组件/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创建链接)。。。

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

    例如,在没有itemid或选项的情况下,从主页(或一组以外的任何页面使用组件)调用它,它可能会认为您正在使用主页菜单项。

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

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