Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samouchitel_po_razrabotke_rasshireny_dlya_Jooml....docx
Скачиваний:
3
Добавлен:
10.11.2018
Размер:
2.53 Mб
Скачать

Генерация дружественных для поисковиков ссылок

На данный момент ссылки на наши Обзоры (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().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]