Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 强制Joomla JRoute使用菜单项_Php_Joomla_Routes_Joomla2.5_Url Routing - Fatal编程技术网

Php 强制Joomla JRoute使用菜单项

Php 强制Joomla JRoute使用菜单项,php,joomla,routes,joomla2.5,url-routing,Php,Joomla,Routes,Joomla2.5,Url Routing,我正在为Joomla构建一个组件!在2.5版本中,我使用JRoute::(('index.php?option=com\u myapp&view=cpanel')构建我的所有链接。这是可行的,但它会生成如下链接: /component/myapp/cpanel.html 然而,在菜单中,我定义了index.php?option=com\u myapp&view=cpanel的别名为“myapp”,因此链接应该是 /myapp/cpanel.html 可以通过此路径访问该组件。如果我这样做的话

我正在为Joomla构建一个组件!在2.5版本中,我使用
JRoute::(('index.php?option=com\u myapp&view=cpanel')
构建我的所有链接。这是可行的,但它会生成如下链接:

/component/myapp/cpanel.html
然而,在菜单中,我定义了
index.php?option=com\u myapp&view=cpanel
的别名为“myapp”,因此链接应该是

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


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

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

但是,如果只需要创建指向特定菜单项的链接,则始终可以向参数添加Itemid

JRoute::_('index.php?Itemid=12')
将指向id为12的任何菜单项,因此如果这是com_myapp组件的菜单项id,它将创建指向该页面的链接的菜单版本

编辑:

从技术上讲,您可以将同一组件分配给两个菜单项,因此我不认为当您链接到菜单项之外的组件而不给链接一个itemid时,处理URL开头是默认行为。Joomla say(关于为JRoute创建链接)

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

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

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

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

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

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

这只在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\u content&view=article&id=10
。如果您需要确定如何建立此链接,请检查您的数据库。

谢谢您的回答。我的组件中有一个router.php,这部分工作正常。问题是:当我用这个组件设置另一个Joomla时,菜单项将具有不同的id。通常(如果我正确理解core router.php)Joomla应该注意将正确菜单项上的sef路由分配给我的组件。Joomla使用反向查找来查找潜在的匹配菜单项,如果不使用类别,它基本上对您没有多大帮助。因此,您需要为此编写一些自定义处理。您可能需要克隆sef插件并添加您自己的处理。谢谢你们的输入。似乎确实不存在自动检测相应菜单项的方法。现在我只使用我的答案中的代码。您应该在查询中添加“AND
published
=1”,否则您的查询将导致未发布/截断项的错误。