Генерируем 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);
Может быть и этот код окажет кому-нибудь службу
Комментарии