Несколько фокусов с CMS Joomla! Преобразование адресов сайта в дружественные (SEF) для внешних нужд
- Опубликовано: 25.02.2017
- Автогенерация и отображение эскизов фотоальбомов модулем RokBox
- Доработка горизонтального меню-списка для динамического разворачивания подпунктов
- Единая кнопка «Сохранить изменения» для корзины Интернет-магазина VirtueMart
- Изменение/снятие ограничений на длину строки поиска и его попутная доработка
- Исправление ссылки на главную/домашнюю в горизонтальном меню старого стиля
- Модернизация сайтов на Joomla! старых версий 1.5/2.5 до актуальной 3.6
- Отображение заглушки «сайт в разработке» для всех и всего сайта для избранных
- Подсветка пункта меню типа «внешняя ссылка», или Как сделать ссылки на категории VirtueMart
- Преобразование адресов сайта в дружественные (SEF) для внешних нужд
- Реализация двуязычного сайта с постраничным переключением языков
- Удаление значка печати из списка статей при сохранении его на странице статьи
Преобразование адресов сайта в дружественные (SEF) для внешних нужд
Представьте себе, что есть некоторая задача, когда «страшные» адрес Joomla-сайта вида http://domain.zone/
Чтобы такая задача не казалась искусственной и выдуманной (я-то столкнулся с ней на практике!), я приведу пример: если у вас несколько связанных (Joomla-)сайтов, и вы хотите на одном из них (ну или на всех) осуществлять поиск сразу по всем сайтам – в этом случае механизм поиска может возвращать вам результаты поиска на «внешних» сайтах с адресами приведённого «страшного» вида, а правильно преобразовать их в «красивые» SEF-адреса может только сам сайт http://domain.zone/, точнее, его Joomla-движок, который знает свою структуру меню, категорий и материалов. Вот поэтому внешний относительно него механизм поиска, точнее, вывода результатов нуждается в преобразовании одних адресов в другие по запросу.
Реализация самого преобразования адресов для старенькой Joomla! 1.5 у меня работает такая:
/sef.php
// Инициализация Joomla! для отдельного PHP-файлаdefine('_JEXEC', 1);define('DS', DIRECTORY_SEPARATOR);define('JPATH_BASE', dirname(__FILE__));require_once(JPATH_BASE.DS.'includes'.DS.'defines.php');require_once(JPATH_BASE.DS.'includes'.DS.'framework.php');require_once(JPATH_BASE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php');$mainframe = &JFactory::getApplication('site');$mainframe->initialise();$mainframe->route();// Получение «страшного» адреса из параметра url, его разбиение на части$url = $_GET['url'];$absolute_prefix = substr($url, 0, 23);$relative_url = substr($url, 24);if (substr($relative_url, 0, 4) == 'ndex') $relative_url = 'i'.$relative_url;// Извлечение из относительной части адреса параметров id, alias и catid$slug = substr($url, strpos($url, '&id=') + 4);$slug = substr($slug, 0, strpos($slug, '&'));$id = substr($slug, 0, strpos($slug, ':'));$alias = substr($slug, strpos($slug, ':') + 1);$catid = substr($relative_url, strpos($relative_url, '&catid=') + 7);$catid = substr($catid, 0, strpos($catid, ':'));// Преобразование «страшного» адреса в «красивый» SEF-адрес и его выводjimport('joomla.methods');$sef_url = $absolute_prefix.JRoute::_(ContentHelperRoute::getArticleRoute($id, $catid));if ((strpos($url, '&Itemid=') > 0) && (is_numeric(substr($sef_url, strrpos($sef_url, '/') + 1)))) $sef_url = $sef_url.'-'.$alias;echo $sef_url;
При этом использование результата работы этого PHP-сценария на внешнем сайте выглядит так:
$url = file_get_contents(substr($url, 0, n).'sef.php?url='.urlencode($url));