Внесу и свою лепту в обсуждение.
Решение, которое я применил, тоже не универсальное, оно конкретно в данном случае, применимо только к компоненту com_content. Но как принцип может быть использовано и в других похожих случаях.
Суть в том, что даже если я в каком-нибудь своем коде, исполняемом в админке (например плагин расширяющий редактор) внесу конструкцию:
$nonSefUrl = ContentHelperRoute::getArticleRoute($articleSlug,$categoryId);
$app = JApplicationCms::getInstance('site');
$router = $app::getRouter('site');
$this->articleUrl = str_replace('administrator//administrator/','',JURI::base().$router->build($nonSefUrl));
то на выходе у меня (joomla 3.3), получается SEF ссылка, но с ошибкой: в алиас подкатегории дописывался алиас родительской категории. Это могло выглядеть так:
/video/13-video/dances/3-first-video-dance
хотя правильной ссылкой будет:
/video/13-dances/3-first-video-dance
Вариантов кода перепробовал много, все какие давали SEF - все с одинаковой ошибкой.
В общем, покопался в коде, и нашел что проблему создает роутер компонента материалов, тем что он в своей работе использует ссылку на объект приложения "administrator", из-за этого в дальнейшем проблемно получить правильные ссылки. Для правильных ссылок он должен работать с объектом фронтенда. То есть, если в файле components/com_content/router.php в строке 35 вместо:
JFactory::getApplication();
написать:
JApplicationCms::getInstance('site');
то указанная выше конструкция возвращает правильную чпу-ссылку.
Редактировать сам роутер - не дело, поэтому проблему решил тем, что создал новый системный плагин, который в админке, в контексте "com_content" переопределяет код роутера материалов. При этом роутер на лицевой панели сайта - действует родной. Сам код системного плагина может быть примерно таким:
<?php
defined("_JEXEC") or die("Access denied.");
defined("DS") or define(DS,DIRECTORY_SEPARATOR);
$application = JFactory::getApplication();
if("com_content" == JRequest::getCMD("option") && $application->isAdmin()) {
require_once dirname(__FILE__).DS."contentrouter".DS."router.php";
}
где require_once dirname(__FILE__).DS."contentrouter".DS."router.php" - это отредактированный файл роутера компонента материалов, размещенного в файловой системе плагина.
Если хотите более подробно посмотреть, то я это описал здесь:
http://webengineer.pro/refinement-of-joomla-and-her-extensions/23-generatsiya-sef-url-v-administrativnoy-chasti-sistemy-joomla-3.
Конечно, пока не могу сказать насколько это хорошее решение и стабильное (срок работы пока маленький), но пока никаких проблем не обнаружил.
Может кому пригодится.