Как стать автором
Обновить

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

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



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


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

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

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

function TestBuildRoute(&$query)
{}

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

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

Array (
[option] => com_tests
[view] => test
[id] => 1
[Itemid] => 2
)

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

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.

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;
}

}

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

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 – функция для распознавания ссылки

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

function TestsParseRoute($segments)
{}

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

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

Array (
[0] => 1_a_plus_b
)

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

function TestsParseRoute($segments)
{
$vars['view'] = 'test';
$vars['id'] = substr($segments[0], 0, strpos('_', $segments[0])+1);
return $vars;
}
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.