- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Генерация дружественных для поисковиков ссылок
На данный момент ссылки на наши Обзоры (http://localhost/joomla/index.php?option=com_reviews&id=1
&task=view&Itemid=1) выглядят как длинные GET-строки. Наши критики отметили, что они ненавидят такие ссылки. Кроме того, эти ссылки не очень понятны для поисковых систем в их стремлении индексировать наш сайт. Было бы желательно, чтобы ссылки выглядели примерно так:
http://www.ourdomain.com/reviews/view/1 .
Чтобы достичь этого, мы определимся как генерировать и декодировать дружественные для поисковиков (Search-Engine Friendly – SEF) ссылки. Перед тем, как писать код, перейдем в ИА и разрешим SEF ссылки: Site/ Configuration и убедимся, что SEF имеет значение Да.
Если вы используете Apache, как веб-сервер и mod_rewrite включен, вы также можете разрешить использование mod_rewrite. Таким образом index.php будет полностью удален из URL. С использованием mod_rewrite, часть экрана конфигурация должна выглядеть следующим образом:
Если вы не можете использовать mod_rewrite, система все равно будет генерировать SEF URL, однако он будет иметь index.php в середине, например:
http://www.yoursite.com/index.php/search/engine/friendly/link.
Нажмите кнопку Save. Если вы используете mod_rewrite, убедитесь, что вы переименовали htaccess.txt в .htaccess. Если вы получаете сообщение о том, что ваш файл конфигурации защищен от записи, откройте configuration.php файл в корне Joomla! и установите JConfig переменную $sef в 1 вместо 0.
Создание url сегментов
При создании внутренних ссылок при построении страницы в Joomla, Компоненты и Модули будут вызывать функцию JRoute::_(). Эта функция принимает относительные ссылки в качестве параметра и возвращает SEF-ссылку.
Функция JRoute::_() сначала парсит (разбирает на части) относительную ссылку в массив, а затем удаляет элемент option и добавляет его первым в новый URL. Далее ищет файл router.php в папке Компонента с названием указанном в option. Если router.php найден, он подключается и будет вызвана функция, название которой начинается с имени Компонента и заканчивается BuildRoute(). В нашем случае это ReviewsBuildRoute(). Чтобы создать эту функцию, вернитесь в /components/com_reviews и создайте файл router.php со следующим кодом:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
function ReviewsBuildRoute(&$query)
{
$segments = array();
if (isset($query['task']))
{
$segments[] = $query['task'];
unset($query['task']);
}
if(isset($query['id']))
{
$segments[] = $query['id'];
unset($query['id']);
}
return $segments;
}
?>
Когда JRoute::_() определяет, что ссылка - это обработка Обзора вызывается ReviewsBuildRoute() и ей передается массив отпарсеного URL (без элемента option). Чтобы закончить строительство SEF ссылки, нам необходимо вернуть упорядоченный массив остальных сегментов URL. Во-первых, определим $segments как пустой массив. Далее, мы проверяем массив $query на предмет присутствия элемента task. Если это так, мы добавляем значение task, как первый элемент $segments, а затем удаляем task из $query. Далее, мы делаем тоже самое с id. Наконец, мы возвращаем $segments, чтобы JRoute::_() смог закончить построение URL.
В функции существуют два метода, участвующих в формировании URL, что имеет решающее значение для получения правильно построенного SEF URL-адреса. Во-первых, массив $query должен быть передан по ссылке (& перед именем функции). При построении сегментов, мы удаляем обработанные элементы из массива $query. Если мы не вызываем $query по ссылке, вызов unset() будет иметь эффект только для нашей локальной копии и все URL элементы появятся снова.
Кроме того, правильная обработка $query, упорядочивает элементы в $segments. В SEF URL нет возможности определять элементы и их значения, и только располагая их в определенном порядке, мы можем говорить о надежности соответствия значений. Когда мы возвращаем $segments, JRoute::_() добавят каждый элемент из этого массива в URL через разделитель. Если есть какие-либо потерянные переменные в $query, они будут добавлены в конец URL в GET стиле.
Хотя у нас теперь есть router.php с функцией генерации SEF URL, наш Компонент не настроен на ее использование.
Откройте /components/com_reviews/reviews.html.php и добавьте выделенный код в HTML_reviews функцию showReviews():
foreach($rows as $row)
{
$link = JRoute::_('index.php?option=' . $option . '&id=' .
$row->id . '&task=view');
echo '<tr><td><a href="' . $link . '">' .
$row->name . '</a></td></tr>';
}
Также проверьте на наличие такого выделенного кода в HTML_reviews::showReview():
<p><em>Notes:</em> <?php echo $row->notes; ?></p>
<?php $link = JRoute::_('index.php?option=' . $option); ?>
<a href="<?php echo $link; ?>">< return to the reviews</a>
Теперь Компонент генерирует SEF URL в соответствие с шаблоном, установленном в ReviewsBuildRoute().