5

我有一个正在处理的自定义组件,我正在编写一个在管理区域中运行的导入脚本。我有以下代码:

$newUrl = ContentHelperRoute::getArticleRoute($import->article_id.':'.$import->alias, $import->catid);
$newUrl = JRoute::_($newUrl);

第一部分的工作与此类似:

index.php?option=com_content&view=article&id=45:joomla-socialable-and-sharethis-module&catid=18

第二部分显示如下:

/administrator/index.php?option=com_content&view=article&id=45:joomla-sociable-and-sharethis-module&catid=18

上述两个 url 与您期望组件 com_content 呈现这些 url 一样,就好像我想在管理区域中使用它们一样。

知道如何强制 JRoute 像在前端使用时那样工作吗?

注意:这是在我的组件的控制器中使用的,如果它有任何区别并且我包括 require_once (JPATH_SITE . '/components/com_content/helpers/route.php');

4

5 回答 5

7

对于那些在 Google 上找到这个并在使用 JRoute::_() 和 contentHelper::getArticleRoute() 时遇到困难的人。

$newUrl = ContentHelperRoute::getArticleRoute($import->article_id.':'.$import->alias, $import->catid);

// better will be check if SEF option is enable!
$router = new JRouterSite(array('mode'=>JROUTER_MODE_SEF));
$newUrl = $router->build($newUrl)->toString(array('path', 'query', 'fragment'));
// SEF URL !
$newUrl = str_replace('/administrator/', '', $newUrl);
//and now the tidying, as Joomlas JRoute makes a cockup of the urls.
$newUrl = str_replace('component/content/article/', '', $newUrl);
于 2011-07-20T15:50:43.427 回答
6

这是适用于 Joomla 3.6 的片段

$routerOptions = [];
if (JFactory::getConfig()->get('sef')) {
    $routerOptions['mode'] = JROUTER_MODE_SEF;
}
$siteRouter = JRouter::getInstance('site', $routerOptions);
$link = $siteRouter->build($yourRoute)->toString();
$link = preg_replace('#^/administrator#', '', $link);
于 2016-09-16T15:04:17.650 回答
1

更好的解决方案是创建一个新的路由器实例,因此,代码将如下所示:

$app    = JApplication::getInstance('site');
$router = &$app->getRouter();    

$newUrl = ContentHelperRoute::getArticleRoute($import->article_id.':'.$import->alias, $import->catid);

$newUrl = $router->build($newUrl);
$parsed_url = $newUrl->toString();
$parsed_url = str_replace('/administrator', '', $parsed_url);

这样,您将始终获得该项目的正确 URL,无论它是 joomla 文章、K2 文章等...

** 请注意,根据项目的类型(k2、joomla 等),应使用 consequent 方法获取 $newUrl。

于 2013-10-23T12:25:54.533 回答
1

我认为这将是一个更简单的解决方案:

$newUrl = JRoute::_(ContentHelperRoute::getArticleRoute($import->id.':'.$import->alias, $import->catid));

这将为您提供与前两个答案相同的结果,但编码更少。

希望这可以帮助。

于 2014-01-19T05:20:05.167 回答
1

在 Joomla 3.9 中,他们扩展了 JRoute 类(现在称为 Route 类)以包含解决此问题的 link() 静态方法。

use Joomla\CMS\Router\Route;
$newUrl = ContentHelperRoute::getArticleRoute($import->article_id.':'.$import->alias, $import->catid);
$newUrl = Route::link("site", $newUrl);

Route::link()Route::_()除了您必须提供额外的第一个参数来指定您希望为其构建 URL 的客户端之外,其工作方式相同。请参阅https://api.joomla.org/cms-3/classes/Joomla.CMS.Router.Route.html#method_link

于 2019-12-16T16:29:47.337 回答