Pull to refresh

Роутер 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;
}
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.