Каталог на Drupal 7 из сторонних данных.

Опубликовано Опубликовано в рубрике Drupal, PHP, SQL

В этой статье речь пойдёт об организации каталога на основе сторонней базы данных при помощи CMS Drupal. Таксономию и Views использовать не будем, что делает метод практически универсальным.
Итак, постановка задачи. Дано:
База данных с таблицами:
1. Страны (>300 записей, поля: ID страны, имя страны русское, имя страны английское).
2. Города (>65000 записей, поля: ID города, ID страны, имя города русское, имя города английское).

Задача: Составить каталог со структурой «корень(список стран)->страна(описание страны + список городов)->город(описание города).

Примечание 1. Описания подтягиваются из других таблиц, что не является сложной задачей.
Примечание 2. Каждая нода каталога должна иметь структурированный ЧПУ (типа domain.ru/Russia/Moscow)
Примечание 3. Вывод списков будет идти в три колонки.

Сразу же отвечаю на вопрос «А почему не таксономия?». База дана сторонняя, обширная и неповоротливая. Импортировать ЭТО в Drupal было сочтено нецелесообразным.

Решение задачи.

Начинать стоит с вывода первого уровня каталога, т.е. списка стран. Запрос будет очень простой:

SELECT `id страны`, `имя страны англ.`, `имя страны русское` FROM `страны`

На выходе будем иметь массив $result, который выведем в трёхколоночную таблицу. За отрисовку таблицы будет отвечать триггер $trigga, который меняется от 1 до 3. Затем построчно читаем массив в переменную $row. Код будет вот такой

$trigga = 1;
	?>
	

Т.е. для триггера равного 1 мы открываем строку, для 2 просто пишем значение, а для 3 закрываем строку. Здесь мы не заморачиваемся с закрытием недостающей ячейки. На крайняк её можно дописать вручную — пример не такой сложный.

Помимо вывода русских имён мы выводим в цель ссылки английское имя страны. Оговоримся сразу — все имена подготовлены, внутри себя не имеют пробелов, запятых и прочего. Вместо пробелов — знак «тире».

Отлично! Список сформирован. Но как же теперь по полученной ссылке отображать шаблонную страницу для страны?

Из коробки Drupal 7 имеет модуль path, который позволяет задавать ЧПУ-алиасы адресов. Они хранятся в таблице drupal_url_alias.

Создадим новую ноду с пустым телом и дадим ей какой-нибудь алиас. Например, «alias». В указанную выше таблицу добавится строка соответствия вида id страницы (автоинкрементальный параметр) — адрес (node/<номер_ноды>) — алиас. В силу большого количества страниц стоит отказаться от работы с БД через скрипты. Скачаем дамп таблицы в формате CSV (comma separated values) и откроем его в чём-нибудь типа MS Excel.

Теперь возьмём английские имена стран и скопируем их ниже имеющихся записей в открытом Excel-документе в колонку алиасов. Колонку адресов растянем до конца с тем же значением (node/<номер_ноды>), что и было у последней созданной ноды (на которой будет размещена информация о выбранной стране). ID заполним до конца таблицы с номерами по порядку. Сохраним обратно в CSV и выгрузим в таблицу drupal_url_alias. Теперь нашей ноде с номером <номер_ноды> соответствуют много алиасов стран. Таким образом, набирая в адресной строке что-то типа domain.ru/Russia мы получим не ошибку об отсутствии страницы, а просто пустую страницу, идентичную адресу domain.ru/node/<номер_ноды>.

Ссылки стали активными. Но система должна наполнять страницу в соответствии с адресом. Запросим из глобального массива SERVER значение REDIRECT_URL. Оно вернёт нам значение вида /Russia. Слеш нам не нужен — уберём его, и, вуаля, будем иметь готовое имя текущей страны!

Код:

$curname = $_SERVER[REDIRECT_URL];//взяли нужный кусок текущего URL
$curname = str_replace ("/", "", $curname);//убрали из него слеш

Теперь мы можем вывести список городов этой страны! Запросим id текущей страны, после чего отфильтруем по нему города.

SELECT DISTINCT `id страны` FROM `страны` WHERE `имя страны англ.` = '$curname' //получили ID

SELECT DISTINCT `имя города рус.` FROM `города` WHERE `id страны` = 'полученный ID'

Массив городов выводится по тому же принципу, что и массив стран. Аналогично каждому городу присваивается ссылка, а при переходе по ней выводится информация о городе.

Таким образом, мы получили каталог с ЧПУ (который будет крайне полезен для SEO), который может базироваться на любой CMS, поддерживающей алиасы ссылок.

Генерация одной страницы каталога занимает пару секунд.

Задача решена!

Безошибочного кода Вам!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *