Человекопонятные ссылки в Joomla 1.5 — продолжение
Начало здесь.
Представленная дальше функция обрабатывает адрес:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | function [Componentname]ParseRoute( $segments ) { $vars = array(); switch($segments[0]) { case 'categories': $vars['view'] = 'categories'; break; case 'category': $vars['view'] = 'category'; $id = explode( ':', $segments[1] ); $vars['id'] = (int) $id[0]; break; case 'article': $vars['view'] = 'article'; $id = explode( ':', $segments[1] ); $vars['id'] = (int) $id[0]; break; } return $vars; } |
В этой функции элементы в $query организованы в заданной последовательности. При обработке $segments[0] результатом является получение доступа к виду. Адрес, генерируемый в этом примере, содержит внутри себя название вида, е отображая при этом иерархической последовательности. Ссылка отображается так:
1 | http://www.example.com/[menualias]/[view]/[slug] |
В более сложном примере будет создана иерархия:
При просмотре записи: http://www.example.com/[menualias]/[category]/[article]
При просмотре одной рубрики: http://www.example.com/[menualias]/[category]
При просмотре рубрик://www.example.com/[menualias]
После первых двух шагов ссылка на запись будет выглядеть таким образом:
1 | JRoute::_( 'index.php?view=article&catid='.$row->catslug .'&id='.$row->slug ); |
Ссылка на рубрику будет выглядеть так:
1 | JRoute::_( 'index.php?view=category&id='.$row->catslug ); |
Так выглядит router.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function [Componentname]BuildRoute(&$query){ $segments = array(); if(isset( $query['catid'] )) { $segments[] = $query['catid']; unset( $query['catid'] ); }; if( isset($query['id']) ) { $segments[] = $query['id']; unset( $query['id'] ); }; unset( $query['view'] ); return $segments; } |
Имя вида не добавляется в массив. Дополнительное значение catid при нажатии $ сегментов. Переменное значение $query[‘view’] отключается и значение catid передается в $segments.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function [Componentname]ParseRoute($segments) { $vars = array(); $menu =& JMenu::getInstance(); $item =& $menu->getActive(); // общее число сегментов $count = count( $segments ); //вид ID switch( $item->query['view'] ) { case 'categories': if($count == 1) { $vars['view'] = 'category'; } if($count == 2) { $vars['view'] = 'article'; } $id = explode( ':', $segments[$count] ); $vars['id'] = (int) $id[0]; break; case 'category': $id = explode( ':', $segments[$count] ); $vars['id'] = (int) $id[0]; $vars['view'] = 'article'; break; } return $vars; } |
Здесь задействовано несколько частей слага, так как, не имея вида в $segments, мы все-таки должны выискать способ его передачи. Чтобы узнать уровень иерархии, нужно узнать название вида в активном меню:
1 | $item->query['view'] |
Еще одна задача – нужно знать число элементов в $segments: $count = count( $segments ); . Владея этими данными, можно правильно установить иерархию во всех трех вариантах. Как результат всей нашей работы – человекопонятная ссылка (ЧПУ).
Оцените статью по 5-бальной шкале: