Роутер Joomla своими руками

Сокращение сегментов URL в CMS Joomla

Назовём наш компонент com_tests. Cоздадим файл router.php в папке компонента. Этот файл состоит из двух функций, это функция (Имя компонента)BuildRoute – функция для построения ссылки, и (Имя компонента)ParseRoute – функция для распознавания ссылки. Будем рассматривать эти функции по очереди.

(Имя компонента)BuildRoute – функция для построения ссылки

Опись функции:

1
2
function TestBuildRoute(&$query)
{}

У нас есть ссылка вида: /index.php?option=com_test&view=task&id=/{task_id}&Itemid=2, наша задача сделать из неё /tests/{test_id}_{test_name}.html

Давайте посмотрим, что нам передается для построения ссылки, массив $query, для задачи с id = 1.

1
2
3
4
5
6
Array (
[option] => com_tests
[view] => test
[id] => 1
[Itemid] => 2
)

Эта функция должна вернуть массив частей ссылки, которые нам нужно, между частями Joomla потом ставит «/».

01
02
03
04
05
06
07
08
09
10
function TestsBuildRoute(&$query)
{
$segments = array();
if ($query['view'] == 'test') {
$segments[] = $query['id'].'_'.$name;
unset($query['view']); // удаление не нужных уже элементов массива
unset($query['id']);
}
return $segments;
}

С помощью этой функции наша ссылка получила вид: /component/tests/1_.html.

Как видите, у нас получилось не то, что хотелось. Потому что мы получили не совсем понятный, для нас /component/. Это слово написала Joomla для того, чтоб знать к какому компоненту обращаться. Заметьте, что tasks в ссылке это название компонента. Если сделать пункт меню с указанием нашего компонента, задать alias этому пункту и в ссылках при выводе писать Itemid={id нашого компонента}, то мы будем иметь то, что нам надо.

Сделаем пункт меню с именем Tests и alias goodtest с указанием на компонент и получил, такую ссылку: test/1_.html. Тут test это alias пункта меню.

Вернемся к просмотру, что мы написали в функции построения. Как вы видите, мы удаляем некоторые елементы массива, потому что те елементы, которые мы не удалим, Joomla подставит как параметр. Например, если не писать unset($query['view']);, то мы бы получили ссылку вида /tests/1_.html?view=test.

Еще хочу обратить ваше внимание, что мы пока что не вытянули имя задачи. Мы могли сделать, чтоб для данной $query['id'] запросом в базу получить имя. Но при этом, если у нас на одной странице 100 ссылок на задачи, то у нас будет 100 запросов в базу. И это не очень логичный шаг. В этом случаем нам надо сделать отдельную функцию для сбора имен всех задач. Создадим helper route для нашего компонента. Для этого в папке нашего компонента создадим папку helpers и в нем файл route.php.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
jimport('joomla.application.component.helper');
class TestsHelperRoute
{
public static $tests = null;
function getTests()
{
if (self::$tests) return self::$tests;
$db = &JFactory::getDBO();
$query = «SELECT `id`, `name` FROM `#__tests`»;
$db->setQuery($query);
$res = $db->loadObjectList();
foreach ($res as $r) {
self::$tests[$r->id] = $r->name;
}
return self::$tests;
}
}

Теперь подключим этот файл, вызовем функцию, и подставим имя задачи.

01
02
03
04
05
06
07
08
09
10
11
include_once(JPATH_ROOT.DS.'components'.DS.'com_tasts'.DS.'helpers'.DS.'route.php');
function TestsBuildRoute(&$query){
$segments = array();
$tasks = TestsHelperRoute::getTests();
if ($query['view'] == 'tast') {
$segments[] = $query['id'].'_'.$tests[$query['id']];
unset($query['view']);
unset($query['id']);
}
return $segments;
}

Теперь мы получили ссылку вида /tests/1_a_plus_b.html

За счет того, что у нас переменная в классе helpers статическая, то запрос в базу будет только один раз. В том же helpers можно обрабатывать название: забирать пробелы, делать все символы в нижнем регистре и т.д.

Для того, чтоб ЧПУ работало, нужно не только строить, а еще разбирать ссылки. Для этого надо «познакомить» данную ссылку с системой.

(Имя компонента)ParseRoute – функция для распознавания ссылки

Описывается данная функция так:

1
2
function TestsParseRoute($segments)
{}

Массив $segments точно такой же, как мы вернули в функции построения. Вернуть надо массив $vars, такой же как мы получали в функции построения.

В данном случае нам передастся такой $segments:

1
2
3
Array (
[0] => 1_a_plus_b
)

В данном примере view у нас должно быть всегда test, у нас нету ссылок другого вида. И теперь нам надо со строки {id}_{name } достать только {id}. Это делается просто с помощью функций для работы со строками.

1
2
3
4
5
6
function TestsParseRoute($segments)
{
$vars['view'] = 'test';
$vars['id'] = substr($segments[0], 0, strpos('_', $segments[0])+1);
return $vars;
}


Роутер Joomla своими руками - Генератор расширений Joomla и многое другое на нашем сайте посвященном работе расширений, компонентов, модулей, плагинов для линейки Joomla. Отправляйте ссылку на страницу своим друзьям и в социальные сети воспользовавшись графическими иконками выше.

Блог

Календарь приёма объявлений

Небольшой пример из повседневной практики. Организация меняет реквизиты, и они вступят в силу через  пару недель. На сайте идет приём объявлений и объявления принимаются на несколько месяцев в...

Дырка в com_content

Сегодня у товарища, сайт которого находится на старой  Joomla 1.0.3, была сильная нагрузка на сервере, просматривая логи обнаружил не вежливый запрос такого порядка: http://сайт/index2...

Лечим вирус на сайте

  Первоначальный осмотр сайта обнаружил, что у клиента закрыт доступ по фтп, что сузило круг подозреваемых уязвимостей, стало быть отверстие в какомто скрипте движка joomla. Касперский яро...

Troj/JSRedir-MH

Снова грянул гром зарежения сайтов новым вирусом  Troj/JSRedir-MH.  И так в коротко по вирусу Troj/JSRedir-MH. Вирус или троян куда интереснее чем свои предшествиники, тепер...

Доработка расширения для рассылки Send Email JK

Сегодня поделюсь немного интересной информацией для владельцев сайтов собранных ан joomla.  Рано и поздно возникает задача подписки и рассылки информации с сайта, это может быть разная постановка зада...

Привет Ie 10 регулярка

И вот и мне пришлось столкнулся с проблемами перехода на win 8 в придачу с ie 10, некоторых постоянных пользователей моих сайтов. На многих сайтах  имеющих раздел по приёму объявлений, использ...

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

Всем привет, снова снова кунена, получил задание на допиливание популярного форума Kunena, сегодня потребовалось поменять ссылку на профиль пользователя. Это связано с тем, что на сайте стоит социа...

Работает на Kunena - зачем на каждой странице?

  Все у кого стоит форум kunena мешает надпись с двумя ссылкам внизу форума "Работает на Kunena". Сея надпись висит на каждой странице форма, а также страница разработчиков содержит множество вн...

Kunena избавимся от лишних quote

Для тех кто действительно делает сайт для людей, моя следующая заметка. Расскажу вам, как избавиться от лишних quote в постах на форуме kunena. У меня несколько тематических сайтов с нормальной посеща...

Kunena решаем проблему с пропажей аватаров

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

Джомлавикам

Обработка параметров расширений joomla

При разработке расширений для CMS Joomla, таких как плагины, модули, компоненты или шаблоны, часто возникает необходимость получить параметры разрабатываемого или любого другого расширения. В этой ...

Кunena крамсаем шаблон

1. В папке \components\com_kunena\template\ваш_шаблон\ находим файл template.xml и вставляем в него такой кусок (чтобы была возможность выбора показывать это поле или нет): <param name="l...

Подключить свои классы и методы в Joomla?

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

3 новых полезных класса в Joomla 2.5

В платформе Joomla 11.3 разработчики добавлил несколько полезных новых классов для разработчиков. Рассмотрю некоторый из них - JGrid (для построения HTML таблиц), JWebClient (для получения информац...

Репозиторий файлов на Joomla средствами Apache

Создадим две вложенные директории /files/files в корне сайта. Если вы пожелаете использовать другие имена директорий, то вам необходимо будет внести соответствующие правки в дальнейшем. ...