Роутер 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. Отправляйте ссылку на страницу своим друзьям и в социальные сети воспользовавшись графическими иконками выше.