Сложности с организацией многоуровневого каталога

Главные вкладки

Аватар пользователя suhinin suhinin 1 августа 2007 в 17:05

Добрый день!

Требуется создать расширенный каталог для информационного сайта по туризму типа:

Город1 -> Размещение -> Все отели --> Описание отеля
Город1 -> Размещение -> Все апартаменты --> Описание апартамента
Город1 -> Размещение -> Все кемпинги --> ...
Город1 -> Размещение -> ...
Город1 -> Обзоры -> Исторические памятники --> Описание места
Город1 -> Обзоры -> Интересные места --> Описание места
Город1 -> Обзоры -> ...
Город1 -> Развлечения -> Опера и балет --> Описание места
Город1 -> Развлечения -> Кинозалы --> Описание места
Город1 -> Развлечения -> ...
Город1 -> Ночная жизнь -> Ночные клубы --> Описание клуба
Город1 -> Ночная жизнь -> Бары и пабы --> Описание бара
Город1 -> Ночная жизнь -> ...
и т.д.

Также есть другие города и места, которые имеют подобный порядок представления информации (в зависимости от места может быть меньше той или другой информации):

Город2 -> Размещение -> Все отели --> Описание отеля
Город2 -> Размещение -> Все апартаменты --> Описание апартамента
... и т.д.

На данный момент я сделал такую классификацию:
а) Словари: Размещение, Обзоры, Развлечения и т.д.
б) Для каждого словаря заполнил термины, например, для словаря "Размещение" термины "Отели", "Апартаменты", "Кемпинги" и проч.
в) Отдельным словарем сделал также Города и места, в котором имеются термины "Город1", "Город2" и т.д.

В зависимости от типа словаря данные могут меняться, т.е. к примеру в описание отеля входят одни данные (адрес, тел, факс, мейл и может быть сайт), то в описание ночного клуба или кинозала входят другие данные. Этот вопрос я решил созданием нескольких типов материалов, совпавших с названиями категорий: Размещение, Обзоры, Развлечения, ... А также - использованием модуля CCK и созданием дополнительных полей, где было необходимо.

Соответственно, каждый словарь связан со своим типом материала. Словарь "Города и места" связан со всеми типами материалов, т.к. любые данные каталого должны быть привязаны к какому-либо определенному городу.

Итак, что касается ввода нужных данных - практически вопрос решен, но теперь возникла сложность корректного вывода всей этой информации на сайте.. Решил использовать модуль Views. Здесь хочу еще раз сказать спасибо Zlata за ее консультации по ICQ и данному топику http://www.drupal.ru/node/5616.

В итоге у меня получилось сделать более-менее работающую страницу /accomodation с помощью Views, где у меня после выбора критериев поиска появлялись нужные страницы. Т.е. заходя по адресу /accomodation я вижу два выпадающих списка, в первом - выбор нужного города (термины из словаря "Города и места"), а во втором - выбор терминов Отели, Апартаменты и проч. из словаря "Размещение". Кстати, здесь почему-то у меня не получилось выводить по умолчанию все возможные страницы до выбора критериев поиска, при загрузке страница /accomodation - пустая, только выпадающие списки поиска.

Но это какой-то недорезультат.. Sad А хочется следующего: чтобы автоматически создавалось меню из всех доступных городов, при нажатии на любой из городов выдавалась страница с возможными категориями (желательно - только с непустыми). Ну и при переходе в категорию, к примеру, Город1 -> Все отели - выдавались все отели этого города.. Это я пока не понимаю, как сделать. Идеальна была бы ситуация при этом видеть в URL что-то навроде: mysite.com/city1/hotels/ Как мне кажется, это можно сделать с помощью аргументов модуля Views, только я не понимаю, как их использовать.

Большая просьба помочь. Ибо не идет как-то, стопорится дело..

P.S.: Был бы очень благодарен за консультацию в ICQ (5414441), взамен могу предложить реальную помощь в работе с CMS MODx (modx.ru).

Комментарии

Аватар пользователя suhinin suhinin 2 августа 2007 в 17:18

Как-то совсем глухо.. Sad пришлось переводить вопрос на английский и спрашивать на оф. форуме.. может быть там подскажут.

Аватар пользователя Piyavkin Piyavkin 3 августа 2007 в 4:02

Здравствуйте!

Пустой список по-умолчанию:
Я не знаю как точно у Вас организована фильтрация, но если используются Аргументы, то нужно зайти в соответствующий View и для всех аргументов изменить настройку Default с Use Empty Text на Display All Values. Возможно причина в этом.

"А хочется следующего":
Я так понимаю, у Вас структура: дерево. Почему бы Вам не использовать книгу стандартного модуля Books, к которому можно в качестве страниц подключать ноды различных типов (в том числе и созданные в CCK). Древовидная структура будет отображена в виде меню книги (которое можно оформить по своему вкусу, в том числе, наверно, и в виде выпадающих списков (?)). По-моему так удобнее. Если, конечно, использование выпадающих списков не вызвано требованиями спецификации или ограничениями дизайна.

Аргументы:
Насколько я понимаю, аргументы - это то, что цепляется к URL помимо стандартых элементов адреса. Т.е. если адрес: node/5/2007/08/02 , то node - это стандартный (неизменный) элемент, а 5, 2007, 08, 02 - это аргументы (переменные части адреса, которые либо интерпретируются соотв. образом, как NID=5, либо просто передаются в качестве аргументов в массиве $args для возможной обработки на усмотрение пользовательской логики). Соответственно, для view в разделе Аргументов можно указать каким переменным какие аргументы соответствуют и как с ними следует обходиться. Здесь же, в группе Argument Handling Code можно разместить свою, более витиеватую логику для обработки переданных данных (см. примеры здесь: http://drupal.org/node/70145 ) и здесь же, наверно, можно разместить тестовую распечатку массива аргументов, чтобы понять какой аргумент под каким номером идет. Что-то типа:

ob_start(); // Start output buffering
print '<pre>';
print_r($args);
print '</pre>';
$view->page_footer .= ob_get_contents();
ob_end_clean(); // End buffering and discard
return $args;

(Если в чем-то ошибаюсь - надеюсь, поправят).

Аватар пользователя Piyavkin Piyavkin 3 августа 2007 в 4:08

В предыдущем посте поправил код.

+ к тому: то, что сказано про аргументы, касается случая, когда view отображается как страница. Если же view отображается как блок на независимой от вида странице, то произвольное добавление переменных частей URL, скорее всего, будет приводить на страницу Page Not Found. Наверно сюда тоже можно передать аргументы, но это делается как-то иначе (возможно через arg() или еще как-то...).

Аватар пользователя suhinin suhinin 7 августа 2007 в 14:47

Спасибо за ответ, уже не ожидал :).
К сожалению, пока не получается ничего.. Странно, но данный код ничего не выводит. Вообще никаких данных.

Аватар пользователя Piyavkin Piyavkin 8 августа 2007 в 23:13

хм... код я специально протестировал на собственном сайте с views...

Проверьте:
1. Действительно ли у Вас view отображается как страница (page): стоит галочка напротив Provide Page View и Вы смотрите список именно по адресу, который указан здесь же в поле URL? ( 1)Для блока такие аргументы работать не будут (похоже они просто не передаются сюда через массив $args); 2) $view->page_footer игнорируется).
2. Список непустой? (В противном случае header и footer страницы не отображаются, а отображается только поле Empty Text).
3. Переданы ли на самом деле какие-то аргументы? (если список всех отелей у Вас выводится по адресу mysite.com/hotels то аргумент "город" можно передать так: mysite.com/hotels/city1 после этого массив $args станет непустым и будет распечатано переданное значение).
Для начала вместо всего этого кода можно попробовать что-то типа:
$view->page_footer .= '111';
return $args;

Но это все упражнения на тему аргументов (исследование того, что именно передается в вид). Вы уверены, что Вам именно это надо?

Я бы Вашу исходную задачу реализовал так:
1. Создать CCK типы для всех отдельных объектов (Город, Отель, Апартамент, Кинотеатр, Кабак, Обзор и т.д.).
2. Страница всех городов ( /cities ). Выводим через view (без всяких аргументов) список всех городов (в фильтре ставим Node type - Is One Of = 'Город'. Имена городов - ссылки (по которой переходим на стр. города).
3. Страница города "Н". ( /cities/gorod_N ). Отображаются все поля нода типа "Город", отображаются через view (блоками) все списки связанных объектов всех прочих (кроме Города) типов. Пример настройки view для списка Отели:
Фильтр:
Node type - Is One Of = 'Отель'
Аргументы:
//Node Reference: id_city - поле, которое должно входить во все связанные с городом объекты CCK типа.
Node Reference: id_city - Default: Use Empty Text
//Это означает, что в случае отсутствия найденных результатов выводить то, что указанно в поле Empty Text (если Вы ничего не укажете, то ничего и не будет выведено).
Argument Code:

if ( arg(0) == 'node' && is_numeric(arg(1))) {
  $args[0] = arg(1);
}
return $args;

//Это проверяется настоящий адрес на соответствие и из него в массив $args перекладывается nid (node id).

В результате на странице города у Вас будут отображаться списки Отелей, Апартаментов и т.д. (разумеется, если создан и связан с данным городом хотя бы один нод такого типа). Как эти списки выглядят Вы сможете настроить воспользовавшись Визардом (Theme wizard: /admin/build/views/wizard ) модуля views. В том числе, если Вам уж так нравятся выпадающие списки, можете перекроить полученный шаблон и под них (впишите в header и footer блока начало и конец формы, а оформление элементов заверните в соответствующий html-код select'а). Но я бы все таки оставил списки (соответственно их отформатировав) - это эстетичнее и проще.
При щелчке на ссылке, скажем Отеля, Вы попадете на адрес cities/gorod_N/hotel_A . Эта же цепочка будет отображена в хлебных крошках. Все относительно просто и эстетично (если не забывать при создании нода правильно указывать URL и место в меню).

Если же все от Города до последнего Отеля должен добавлять любой пользователь и URL и позиция в меню должны задаваться автоматически, то я бы сам чертовски хотел бы знать решение! : (

Аватар пользователя suhinin suhinin 13 августа 2007 в 17:17

Да, что-то я увлекся категоризацией Smile как-то даже в голову не пришло сделать для каждого объекта тип материала.. у меня получалось так, что был к примеру тип Размещение, в нем я создавал дополнительные поля с помощью CCK, а также делал в категории Размещение список терминов Отель, Апартаменты, Кемпинги и т.п. Ну и связывал тип материала "Размещение" со словарем "Размещение". Это повлекло за собой усложнение (по крайней мере мне сейчас так кажется) структуры сайта. Сейчас поступаю по вашему 1-му совету и создаю для каждого объекта свой тип материала. Вроде бы так действительно выглядит легче.

Аватар пользователя suhinin suhinin 23 августа 2007 в 17:18

Я бы Вашу исходную задачу реализовал так:
1. Создать CCK типы для всех отдельных объектов (Город, Отель, Апартамент, Кинотеатр, Кабак, Обзор и т.д.).

Сделано.

2. Страница всех городов ( /cities ). Выводим через view (без всяких аргументов) список всех городов (в фильтре ставим Node type - Is One Of = 'Город'. Имена городов - ссылки (по которой переходим на стр. города).

Тоже получилось. Только при переходе на страницу города я вижу не /cities/gorod_N, а что-то типа /ru/node/6. Как заставить Views выводить ссылку в виде /cities/gorod_N?

3. Страница города "Н". ( /cities/gorod_N ). Отображаются все поля нода типа "Город", отображаются через view (блоками) все списки связанных объектов всех прочих (кроме Города) типов. Пример настройки view для списка Отели:

А вот это не понимаю, как сделать. У меня там сейчас при переходе на страницу города отображаются только поля данного типа документа и все. Может, для каждого нового города вручную свой Views создавать? Или в существующем Views "/cities" что-то изменить?

Аватар пользователя suhinin suhinin 28 августа 2007 в 18:41

Попробовал, как-то не пошло... Sad
Получил ошибку:
You don't seem to have the following requirements: term_node_7
Чтобы ее не было, надо везде поменять цифры 7 и 8, как оказалось, на номера своих терминов.
Но на странице /ru/ad просто пусто..