繁体   English   中英

强制Joomla JRoute使用菜单项

[英]Force Joomla JRoute to use the menu item

我正在为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单独使用此菜单项?

//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查询中检查正确的语言。

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

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

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 如果您需要确定如何构建此链接,请检查您的数据库。

理想情况下,您需要将路由器设置为组件的一部分。 菜单管理器将覆盖组件/ 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。选项默认为当前正在执行的组件的名称,而Itemid默认为当前菜单项的ID。”

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM