Использование JRoute :: _ () в администраторе Joomla

У меня есть настраиваемый компонент, над которым я работаю, и я пишу сценарий импорта, который выполняется в области администрирования. У меня такой код:

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

первая часть работает, возвращаясь к этому:

index.php? option = com_content & view = article & id = 45: joomla-sociable-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 работать так, как если бы он использовался во внешнем интерфейсе?

NB: это используется в контроллере моего компонента, если это имеет значение, и я включаю require_once (JPATH_SITE. '/Components/com_content/helpers/route.php');


person udjamaflip    schedule 19.07.2011    source источник


Ответы (5)


Для тех, кто нашел это в 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);
person udjamaflip    schedule 20.07.2011
comment
как я могу получить URL статьи в cli? - person Ekta Puri; 06.09.2019

Вот фрагмент, который будет работать для 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);
person Valery    schedule 16.09.2016

Лучшим решением было бы создать новый экземпляр маршрутизатора, поэтому код будет примерно таким:

$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 должен быть получен с помощью последовательного метода.

person Alberto S.    schedule 23.10.2013
comment
как я могу получить URL статьи в cli? - person Ekta Puri; 06.09.2019

Я думаю, что это было бы более простым решением:

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

Это даст вам тот же результат, что и два других предыдущих ответа, но с меньшим количеством кода.

Надеюсь это поможет.

person Marcos Mercedes    schedule 19.01.2014

В 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.

person Robbie Jackson    schedule 16.12.2019