Заказать звонок
Логин
Пароль

Правильная (ЧПУ, SEO-СЕО, SEF-СЕФ) ссылка своего MVC компонента на Joomla 2.5 (класс JRoute)

24.08.2019

В этой статье мы рассмотрим особенности роутинга в Joomla при создании ЧПУ ссылкок в модулях или компонентах, а так же создание ссылок на другие компоненты и также принцип построения ЧПУ ссылок.

Итак начнем с построения ЧПУ ссылок! Для этого служит файл router.php, который должен лежать в папке с нашим компонентом пользовательской части!

Файл router.php

В файле router.php должно быть две функции:
имя_компонентаBuildRoute( $query ) - которая служит для построения ЧПУ ссылки и
имя_компонентаParseRoute( $segments ) - которая служит для получения переменных из ЧПУ ссылки для того что бы их использовать в нашем компоненте!

Для того что бы наша ссылка была ЧПУ нужно использовать класс JRoute! Пример создания ЧПУ ссылки:

JRoute::_('index.php?option=com_mycomponent&view=testview&id=10');

После этого произойдет обращение к функции myComponentBuildRoute в файле router.php

В эту функцию в виде ассоциированного масива в переменной $query придут элементы адресной строки . тоесть для нашей строки JRoute::_('index.php?option=com_mycomponent&view=testview&id=10'); в переменной $query будет такое содержимое:

Array
(
    [Itemid] => 110
    [option] => com_mycomponent
    [view] => testview
    [id] => 10
)

В функции мы определяем какие участки строки нам не нужны и удаляем их, но если необходимо использовать их значение в дальнейшем, то мы помещаем значение текущей переменной в массив $segments.
Притом в каком порядке мы удалим в таком порядке и будет сформирование ссылка. То есть если мы напишем так:

if ( isset( $query['view'] ) ) {
    $segments[] = $query['view'];
    unset( $query['view'] );
}
if ( isset( $query['id'] ) ) {
    $segments[] = $query['id'];
    unset( $query['id'] );
}
То получим ссылку
mycomponent/testview/10

Если напишим:

if ( isset( $query['id'] ) ) {
    $segments[] = $query['id'];
    unset( $query['id'] );
}
if ( isset( $query['view'] ) ) {
    $segments[] = $query['view'];
    unset( $query['view'] );
}
То вид ссылки будет:
mycomponent/10/testview

После того как мы переходим по такой же ссылке в браузере то Joomla перехватывает нашу ссылку и определяет какой компонент и вызывает функцию mycomponentParseRoute в файле router.php этого компонента. В переменной $segments приходит обычный массив с содержимым url строки в браузере:

Array (
    [0] => testview
    [1] => 10
)

Порядок значений в массиве будет зависеть от того, в каком порядке у вас удаляются переменный в функции myComponentBuildRoute. Мы поочередно перебираем каждый элемент массива и создаем ассоциированный массив где ключом будет наша переменная которую мы удалили перед этим, и значение - значение из массива $segments.
Это нужно для того что бы наш компонент знал какие переменные пришли из url запроса, ибо системе не известно где какие переменные в строке

mycomponent/10/testview или в строке mycomponent/testview/10

Итак небольшие особенности создания ЧПУ ссылок: Во первых если вы хотите создать ссылку на вид в текущем компоненте достаточно написать

JRoute::_('index.php?view=имя_вида&переменная=значение&переменная=значение');

Если вы хотите сделать ссылку из модуля на компонент или из другого компонента на текущий компонент ссылка должна формироваться так:

JRoute::_('index.php?option=com_mycomponent&view=имя_вида&переменная=значение')
. Притом что если в первом варианте ссылка сформируется с учетом псевдонима пункта меню, то во втором случае при создании ссылки на другой компонент ссылка не учтет псевдоним пункта меню и примет такой вид:
mysite.ru/component/mycomponent/testview/10

Если же мы хотим что бы ссылка была с учетом псевдонима пункта меню, созданного в менеджере меню, т.е. например если

mysite.ru/menualias/test/10
, то мы должны добавить к нашей ссылке переменную Itemid значение которой равно полю "ID" нашего меню в менеджере меню, притом что переменную option мы можем упустить:
JRoute::_('index.php?view=имя_вида&переменная=значение&Itemid=110');

Если вы не хотите вручную выставлять значение, а получать Itemid программно, можно воспользоваться следующей функцией:

function getItemid( $component, $view )
{
    $items = JFactory::getApplication()->getMenu( 'site' )->getItems( 'component', $component );
    foreach ( $items as $item ) {
        if($item->query['view'] === $view){
            return $item->id;
        }
    }
}
 
$itemid = getItemid( 'com_blog', 'category' );

На этом все! =) Основа для материала взята с сайта inet-reklama.com.