Генерируем SEF ссылки при помощи Joomla компонента sh404sef

Потребовалось мне как-то автоматически постить на сайт построенный на Joomla статьи. Все делается достаточно просто, можно даже обойтись без использования кодов самой системы. Есть пара таблиц content и category

Но, когда дело дошло до получения ссылки на страницу, тут меня ожидал неприятный сюрприз. Ссылки на сайте генерировал  sh404sef компонент. Поэтому, пришлось изрядно в нем покопаться.

Вот функция, которая на основе id материала, и его id категории, выдает SEF url

 

 

 

 

function poster_sh404sef($id,$catid){
	global $mainframe;
	$mainframe = JFactory::getApplication('site');
	jimport( 'joomla.plugin.plugin' );	
	require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_sh404sef'.DS.'sh404sef.class.php'); 
	require_once(JPATH_ROOT.DS.'plugins'.DS.'system'.DS.'shsef.php'); 
	require_once(JPATH_ROOT.DS.'components'.DS.'com_sh404sef'.DS.'shCache.php');
	require_once(JPATH_ROOT.DS.'components'.DS.'com_sh404sef'.DS.'shSec.php');
	$bad_url = ContentHelperRoute::getArticleRoute($id, $catid);
	$shRouter = new shRouter();
	include_once(JPATH_ROOT.DS.'components'.DS.'com_sh404sef'.DS.'shInit.php');
	$uri = $shRouter->build($bad_url);
	return $uri->toString();
}

 конечно, чтобы функция заработала, необходимо подключить несколько Joomla файлов, и задать несколько констант. В следующем примере кода, подразумевается, что файл с ним лежит в отдельной папке, в корне CMS.

define('_JEXEC', 1);
define('DS', DIRECTORY_SEPARATOR);
if (file_exists(dirname(__FILE__) . '../defines.php')) {
	include_once dirname(__FILE__) . '../defines.php';
}
if (!defined('_JDEFINES')) {
	define('JPATH_BASE', dirname(__FILE__).'/..');
	require_once JPATH_BASE.'/includes/defines.php';
}
include JPATH_BASE.'/includes/framework.php';
require_once JPATH_BASE.'/components/com_content/helpers/route.php';
$app = JFactory::getApplication('site');
$app->initialise();
$app->route();

после этого можно вызывать функцию. 

 

По умолчанию генерирование sef ссылок в joomla можно организовать так

$bad_url = ContentHelperRoute::getArticleRoute($Id, $catid);
$url = JURI::base().substr(JRoute::_($bad_url), strlen(JURI::base(true)) + 1);

Может быть и этот код окажет кому-нибудь службу

 

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

Vallium
# Vallium 03.03.2016 13:01
А как сгенерировать ссылку виртмарта с помощью sh404sef?