Иерархическое меню с сохранением выбора пользователя при переходе между страницами

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

Аватар пользователя Eugene_S Eugene_S 10 декабря 2008 в 4:57

Здравствуйте!
Помогите, пожалуйста, в решении такой задачи:
Нужно, чтобы на сайте было одно меню для выбора города, типа:
"Петербург|Москва|Екатеринбург|Новосибирск|и т. д."
И чтобы однажды выбрав город, пользователь в дальнейшем получал материалы только по нему. Т.е. чтобы при переходе между страницами выбор города сохранялся.
Материалы организованы с помощью views (напр., новости, статьи, каталог фирм и пр.).

Поиск здесь и на Drupal.org показал, что с такой проблемой люди уже сталкивались неоднократно, но внятного решения я так и не нашел.

Пробовал по-разному организовывать таксономию, применять Hierarhical select, однако ничего не вышло. Сохранять значение города постоянно не получается.

Умозрительно решение вижу так:
При нажатии на пункт меню (город) устанавливается значение некой переменной, и потом оно проверяется при каждой загрузке страницы (т.е. хранится в базе постоянно или до конца сессии). И уже исходя из этого выводится материал (напр., переменная подставляется в урл всех нужных ссылок в качестве аргумента для views).
Как такое реализовать, не знаю.

Заранее спасибо.

Комментарии

Аватар пользователя Eugene_S Eugene_S 18 декабря 2008 в 1:54

Решение нашел. Работает, но есть ряд минусов. Просьба к тем, кто силен в программировании, покритиковать.

Итак:

1. Создаем словарь "Города"
Каждому материалу, относящемуся к каком-либо городу, присваиваем соответствующий термин. Пусть, у нас будут два города:
- Moscow
- SPb

2. Создаем меню "города". Каждому пункту прописываем путь:
- "&city=moscow"
- "&city=spb"
(минус: нужно корректировать функцию drupal_urlencode, иначе символы & и = отображаются неправильно).

3. Создаем блок, в котором будет меню основных разделов сайта. Проверяем значение "city" из адресной строки и при его наличии записываем в соответствующую переменную сессий.
Проверяем значение переменной и отображаем меню.

<?php
if ($_GET['city']) $_SESSION['city_value'] = $_GET['city'];
$city = $_SESSION['city_value'];
print l("Новости", "news/$city");
print l("Статьи", "articles/$city");
print l("Каталог фирм", "catalog/$city");
?>

(Минус: меню можно создавать только вручную таким вот извращенным способом, т.к. переменную через стандартное меню не передашь. Тут, надо, наверное, писать свой модуль, но я в этом не силен).

4. Дальше все просто. Создаем Views для каждого типа материалов, в качестве аргумента используем "Taxonomy: Term Name".
Все работает.

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 18 декабря 2008 в 2:30

Вы хотите, чтобы пользователь получал доступ только к тем нодам, которые соответствуют выбранному им городу, или чтобы каждый раз, когда views делает выборку, пользователю выдавались данные, отфильтрованные по этому городу?