В предыдущих статьях данной серии мы создали всего два файла xml и php. Я уверен, после этого вы уже прописали какой то функционал в свой компонент. Но вот незадача: обращение к компоненту в joomla оставляет желать лучшего.

index.php?option=component&data=lala&to=topolya

при включении ЧПУ (SEF) ситуация улучшается не сильно

/component/moy_component/?data=lala&to=topolya

В век человеко-ориентированных URL такой адрес будет не удобен, и хочется, чтобы он был более красивым. К примеру таким

/moy/lala/topolya.html

Как это сделать, читайте ниже

Joomla предоставляет удобный инструмент роутинга. Это файл router.php в корне компонента. А в нем, всего две функции

<?php
function Moy_ComponentParseRoute( $segments ){}
function Moy_ComponentBuildRoute( $query  ){}

Первая, как не сложно догадаться по названию парсит ЧПУ URL , и раскладывает его в обычный &name=value.

К примеру запрашиваем страницу 

/moy/lala/topolya.html

на вход Moy_ComponentParseRoute в параметр $segments подается array('moy','lala','topolya.html'). По каким критериям это преобразовывать в массив array('option'=>'com_moy_component','data'=>'lala','to'=>'topolya') решать исключительно вам, но на выходе функции должен быть именно такой массив.

Вторая, делает обратную операцию. Берет массив ключ значение и на выходе отдает массив значений сегментов. Т.е. из array('option'=>'com_moy_component','data'=>'lala','to'=>'topolya') вы по какой-то своей логике должны получить array('moy','lala','topolya.html').

Эти две операции и делают все волшебство с модификацией из одного формата URL в другой. Теперь сделать SEF ссылки в вашем компоненте не сложнее чем скачать гонки на планшет андроид. Мой 5-ти летний сын сделал это сам, мы до сих пор не знаем как.

Посмотрим на примере, чтобы понять это лучше

<?php
function Moy_componentParseRoute( $segments ){
	$vars = array('view'=>'jqueryplugins');
	if( count($segments) ){
		switch($segments[0]){
			default:
			$vars['view'] = 'item';
			$vars['task'] = 'readitem';
			$vars['cpu'] = $segments[0];
			break;
		}
	}
    return $vars;
}
function Moy_componentBuildRoute( $query  ){
    $segments = array('moy');
    unset($query['option']);
    return $segments;
}

Пока наш плагин не заработает, так как нужно. В адресной строке вы все еще будете видеть /component/moy_component/

Чтобы избавится от этого префикса, необходимо добавить в какое-либо меню на сайте ссылку на наш компонент и в alias прописать требуемое сокращение. К примеру moy, тогда это префикс отпадет.

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

Комментарии  

Егор
# Егор 24.06.2014 01:54
Шикарная статья. Обидно, что у меня 5-и летнего сіна получилось, а у меня избавиться от component/sobipro/ не получается...
Егор
# Егор 24.06.2014 02:14
XDan, можете на примере моего тестового сайта показать что я не так делаю?