我有一个自定义组件,我正在编写一个在管理区域运行的导入脚本。我有以下代码:
$newUrl = ContentHelperRoute::getArticleRoute($import->article_id.':'.$import->alias, $import->catid);
$newUrl = JRoute::_($newUrl);
第一部分的工作返回类似于:
index . php ?选项= com_content&视图= article& id = 45: joomla-sociable-and-sharethis-module& catid = 18
第二部分如下所示:
/管理员/index . php ?选项= com_content&视图= article& id = 45: joomla-sociable-and-sharethis-module& catid = 18
上述两个url都是您所期望的组件com_content呈现这些url,就好像我想在管理区域内使用它们一样。
是否知道如何强制JRoute工作,因为它会在前端使用?
NB:这是在我的组件的控制器中使用的,如果它有任何不同,我包括require_once (JPATH_SITE)。'/组件/com_content/助手/route.php ');
对于那些在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);
下面是一个适用于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);
在Joomla 3.9中,他们扩展了JRoute类(现在称为Route类),包含了一个link()静态方法来解决这个问题。
use JoomlaCMSRouterRoute;
$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 .
一个更好的解决方案是创建一个新的路由器实例,因此,代码将像这样:
$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等),$newUrl应该通过后续的方法获得。
我认为这将是一个更简单的解决方案:
$newUrl = JRoute::_(ContentHelperRoute::getArticleRoute($import->id.':'.$import->alias, $import->catid));
这将给出与前面两个答案相同的结果,但编码更少。