Joomla 1.5 и ЧПУ

Для каждого сайта очень важно ЧПУ (Человекопонятные УРЛ), для того, чтоб его очень «любили» поисковые системы и для того, чтоб можно ключевое слово написать в ссылку.

Для Joomla 1.5 существует очень много компонент для создания ЧПУ. Эти компоненты работают, записывая в БД все ссылки. Это совсем не логично для сайта с большим количеством страниц, потому как много данных хранится в БД. Еще для этих компонент нужно писать свои плагины, для того, чтоб он записал правильно ссылки вашого компонента.

В общем, я никогда не был сторонником этих компонент. Один раз только я использовал, и не сказал бы, что это то, чем я хотел бы пользоваться. Такое строение ЧПУ, я бы назвал «шаманством». И для того, чтобы не писать такое «шаманство», в Joomla 1.5 есть стандартные способы создания ЧПУ для ваших компонентов.

Сначала в административной части, в конфигурации, надо включить ЧПУ. И все ссылки выводить с помощью JRoute::_(‘ссылка’). Будем рассматривать создание ЧПУ, на примере моего компонента.

Маленький рассказ про компонент. Этот компонент я создал для создания базы олимпиадных задач с системой проверки. Его я писал для своей курсовой. Как вы поняли, это должно быть что-то по типу известного acm.timus.ru. В общем, у нас есть база данных олимпиадных алгоритмических задач по информатике. Человек выбирает задачу, отправляет решение, смотрит результат, имеет возможность просматривать статистику каждой задачи. Но ЧПУ для примера, я буду строить только для просмотра задачи. Если будут вопросы, как сделать для большего количества, пишите. Но в принципе, это делается по аналогии.

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

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


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

function TasksBuildRoute(&$query)
{}


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

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

Array ( 
[option] => com_tasks
[view] => task
[id] => 1
[Itemid] => 2
)


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

function TasksBuildRoute(&$query)
{
$segments = array();
if ($query['view'] == 'task') {
$segments[] = $query['id'].'_'.$name;
unset($query['view']); // удаление не нужных уже елементов массива
unset($query['id']);
}
return $segments;
}


С помощью этой функции наша ссылка получила вид: /component/tasks/1_.html.

Как видите, у нас получилось не то, что хотелось. Потому что мы получили не совсем понятный, для нас /component/. Это слово написала Joomla для того, чтоб знать к какому компоненту обращаться. Заметьте, что tasks в ссылке это название компонента. Если сделать пункт меню с указанием нашего компонента, задать alias этому пункту и в ссылках при выводе писать Itemid={id нашого компонента}, то мы будем иметь то, что нам надо.

Я сделал пункт меню с именем Tasks и alias tasks с указанием на компонент и получил, такую ссылку: tasks/1_.html. Тут tasks это alias пункта меню.

Вернемся к просмотру, что мы написали в функции построения. Как вы видите, мы удаляем некоторые елементы массива, потому что те елементы, которые мы не удалим, Joomla подставит как параметр. Например, если не писать unset($query['view']);, то мы бы получили ссылку вида /tasks/1_.html?view=task.

Еще хочу обратить ваше внимание, что мы пока что не вытянули имя задачи. Мы могли сделать, чтоб для данной $query['id'] запросом в базу получить имя. Но при этом, если у нас на одной странице 100 ссылок на задачи, то у нас будет 100 запросов в базу. И это не очень логичный шаг. В этом случаем нам надо сделать отдельную функцию для сбора имен всех задач. Создадим helper route для нашего компонента. Для этого в папке нашего компонента создадим папку helpers и в нем файл route.php.

jimport('joomla.application.component.helper');

class TasksHelperRoute
{
public static $tasks = null;
function getTasks()
{
if (self::$tasks) return self::$tasks;


$db = &JFactory::getDBO();
$query = "SELECT `id`, `name` FROM `#__tasks`";
$db->setQuery($query);
$res = $db->loadObjectList();
foreach ($res as $r) {
self::$tasks[$r->id] = $r->name;
}
return self::$tasks;
}


}


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

include_once(JPATH_ROOT.DS.'components'.DS.'com_tasks'.DS.'helpers'.DS.'route.php');
function TasksBuildRoute(&$query){
$segments = array();
$tasks = TasksHelperRoute::getTasks();
if ($query['view'] == 'task') {
$segments[] = $query['id'].'_'.$tasks[$query['id']];
unset($query['view']);
unset($query['id']);
}
return $segments;
}


Теперь мы получили ссылку вида /tasks/1_a_plus_b.html. С этой задачей мы справились.

За счет того, что у нас переменная в классе helpere статическая, то запрос в базу будет только один раз. В том же helpere можно обрабатывать название: забирать пробелы, делать все символы в нижнем регистре и т.д.

Для того, чтоб ЧПУ работало, нужно не только строить, а еще разбирать ссылки. Для этого надо «познакомить» данную ссылку с системой.

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


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

function TasksParseRoute($segments)
{}


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

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

Array ( 
[0] => 1_a_plus_b
)


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

function TasksParseRoute($segments)
{
$vars['view'] = 'task';
$vars['id']  = substr($segments[0], 0, strpos('_', $segments[0])+1);
return $vars;
}


Ну вот, в общем мы и познакомили систему с нашими ссылками.

Мы рассмотрели один из самых легких примеров. Более сложное вы сможете сделать сами, опираясь на этот пример. Жду вопросов, предложений по улучшению, критики.



Joomla 1.5 и ЧПУ - Генератор расширений Joomla и многое другое на нашем сайте посвященном работе расширений, компонентов, модулей, плагинов для линейки Joomla. Отправляйте ссылку на страницу своим друзьям и в социальные сети воспользовавшись графическими иконками выше.

Блог

Календарь приёма объявлений

Небольшой пример из повседневной практики. Организация меняет реквизиты, и они вступят в силу через  пару недель. На сайте идет приём объявлений и объявления принимаются на несколько месяцев в...

Дырка в com_content

Сегодня у товарища, сайт которого находится на старой  Joomla 1.0.3, была сильная нагрузка на сервере, просматривая логи обнаружил не вежливый запрос такого порядка: http://сайт/index2...

Лечим вирус на сайте

  Первоначальный осмотр сайта обнаружил, что у клиента закрыт доступ по фтп, что сузило круг подозреваемых уязвимостей, стало быть отверстие в какомто скрипте движка joomla. Касперский яро...

Troj/JSRedir-MH

Снова грянул гром зарежения сайтов новым вирусом  Troj/JSRedir-MH.  И так в коротко по вирусу Troj/JSRedir-MH. Вирус или троян куда интереснее чем свои предшествиники, тепер...

Доработка расширения для рассылки Send Email JK

Сегодня поделюсь немного интересной информацией для владельцев сайтов собранных ан joomla.  Рано и поздно возникает задача подписки и рассылки информации с сайта, это может быть разная постановка зада...

Привет Ie 10 регулярка

И вот и мне пришлось столкнулся с проблемами перехода на win 8 в придачу с ie 10, некоторых постоянных пользователей моих сайтов. На многих сайтах  имеющих раздел по приёму объявлений, использ...

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

Всем привет, снова снова кунена, получил задание на допиливание популярного форума Kunena, сегодня потребовалось поменять ссылку на профиль пользователя. Это связано с тем, что на сайте стоит социа...

Работает на Kunena - зачем на каждой странице?

  Все у кого стоит форум kunena мешает надпись с двумя ссылкам внизу форума "Работает на Kunena". Сея надпись висит на каждой странице форма, а также страница разработчиков содержит множество вн...

Kunena избавимся от лишних quote

Для тех кто действительно делает сайт для людей, моя следующая заметка. Расскажу вам, как избавиться от лишних quote в постах на форуме kunena. У меня несколько тематических сайтов с нормальной посеща...

Kunena решаем проблему с пропажей аватаров

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

Джомлавикам

Обработка параметров расширений joomla

При разработке расширений для CMS Joomla, таких как плагины, модули, компоненты или шаблоны, часто возникает необходимость получить параметры разрабатываемого или любого другого расширения. В этой ...

Кunena крамсаем шаблон

1. В папке \components\com_kunena\template\ваш_шаблон\ находим файл template.xml и вставляем в него такой кусок (чтобы была возможность выбора показывать это поле или нет): <param name="l...

Подключить свои классы и методы в Joomla?

Иногда случается, что набор собственных функций или библиотек нужно подключить в Joomla. Но иногда подключить их нужно так, чтобы они присутсвовали во всей системе, вне зависимо...

3 новых полезных класса в Joomla 2.5

В платформе Joomla 11.3 разработчики добавлил несколько полезных новых классов для разработчиков. Рассмотрю некоторый из них - JGrid (для построения HTML таблиц), JWebClient (для получения информац...

Репозиторий файлов на Joomla средствами Apache

Создадим две вложенные директории /files/files в корне сайта. Если вы пожелаете использовать другие имена директорий, то вам необходимо будет внести соответствующие правки в дальнейшем. ...