Задача
Работая над проектом, возникла задача, чтобы пользователь указывал в какой школе он учится. Школ в регионе много, поэтому нужно чтобы выбирался район области и подгружался список школ. Эта информация должна сохраняться в профиле пользователя (Район –> Школа). И хорошо бы, вывести список пользователей из определенной школы (района).
Решение
В стандартной поставке Drupal 6 есть модуль Profile. Но создаваемые им поля, ни как не взаимодействуют с базой данных. Следовательно, было принято решение его доработать с применением API модуля Hierarchical Select (на момент написания статьи был доступен 6.x-3.x-dev 2008-Dec-03, для наших нужд его хватает). Хорошей подсказкой как это сделать была статья.
Вся база школ была сформирована с помощью иерархии таксономии (рисунок 1). Был написан небольшой скрипт, чтобы из текстового файла определенного формата сделать экспорт в базу данных Drupal.
Доработан код модуля Profile (полный код для Drupal 6.x можно скачать из прикрепленных файлов). Среди добавляемых полей появился тип «hierarchical select» . При создании поля с данным типом надо указать ID словаря таксономии.
В результате при редактировании профиля у пользователя будет следующая картинка (рисунок 2):
А при просмотре информации о пользователе (рисунок 3):
При щелчке по ссылкам будут выводиться соответствующие списки пользователей (рисунок 4).
Причем всё работает без внесения изменений в базу данных. Информация с выбранной информацией сохраняется в базе в виде текстовой строки. В самом модуле прописано ограничение на три уровня иерархии (в случае необходимости можно без проблем увеличить).
Установка: скачать и включить модуль Hierarchical Select, скачать из прикрепленных файлов к этому посту архив с модифицированным модулем Profile, заменить им стандартный модуль (и включите его в админке, если ещё не сделали этого). И всё, можно создавать поля с новым типом.
Вложение | Размер |
---|---|
profile.zip | 19.07 КБ |
Комментарии
Обновление модуля и снова копаемся в коде? Сделали бы свободно заполянемое поле, а потом бы руками корректировали.
Все пользователи могут по разному называть свою школу. А идея корректировать руками плохая, да и незачем это делать, когда можно автоматизировать и красиво всё оформить.
Менять код модуля конечно не хорошо. Но давать пользователям вводить такие вещи руками вообще недопустимо и безграмотно! Так что задача решена, мои поздравления. Может кто предложит более красивое решение?
отказаться от модуля profile, сделать профиль нодой с cck
Hierarhical Select НЕ поддерживает интеграцию с ССК с сохранением всех узлов цепочки.
Это тоже не самый лучший вариант:
- непонятно как сделать функционал аналогичный Hierarhical Select.
- сложность выбора пользователей с определенным значением поля.
- не красиво: отдельная нода для каждого пользователя, которая будет выводится в общем списке нод.
зато он поддерживает таксономию очень хорошо
1) также как и вы сделали
2) не сложнее чем у вас
3) в каком месте она будет выводится?
Это лишь доказывает, что поставленную задачу можно было решить множеством способов. Я рассказал сообществу о своём решении.
норм)
непонятно как сделать функционал аналогичный Hierarhical Select.
А зачем вообще этот "функционал" притом, что пользователь будет его использовать 1 раз при регистрации? Достаточно было сделат ьстандартным модулем выбор из списка, а вы изобрели велосипед.
Автору - зачет!
Стандартный выбор из списка и Hierarhical Select - это две большие разницы!
Можно еще добавить возможность ограничения выборки только листовой вершины (сейчас пока ее не вижу)
О! Мои извинения: нашел внутри модуля ))
Супер.
А для 5-го Друпала сложно будет переделать?
Незнаю. Работаю только с 6-м.
Круто. Реально круто. Это спасло мой проект!!!!!!!!!!
Мэни сенкс, однако, как будет время, я подправлю Ваши ошибки \;-=)
а что будет если в городе будет не 100 а 1000 школ?
Список однако получится большим.
это уже вопрос организации бд.
можно сделать разбивку по районам... хотя конечно хрен его знает.
все таки иерархический список тут можно и не использовать. если бы было какое то подобие автокомплита, учитывающего иерархию, как например тут http://www.ati.su/Trace/
Ну перво-наперво нужно проверять на наличие массива в foreach при выводе чего-то там в строке 269 profile.module, а то оно матюкается
[color=#FF0000]>warning: Invalid argument supplied for foreach() in /home/dude/www/coalnet/public_html/modules/profile/profile.module on line 269.[/color]
Советую в profile.inc около 269 строки исправить так:
$ss = array(); $str = array();
if(is_array($value)) {
foreach ($value as $val) {
$ss = (array)taxonomy_get_term($val);
$str[] = l($ss['name'], 'profile/'. $field->name .'/'. $val);
}
}
$str = implode(" -> ", $str); //Склеиваем строку
return $str;
//return $browse ? l($value, 'profile/'. $field->name .'/'. $value) : check_plain($value);
Я рад, что мои разработки помогли ещё кому-то!
И спасибо за найденные и исправленные ошибки.
большое спасибо.
а никто не задумывался оформить это в качестве альтернативного модуля?
в прикрепленном модуле нужно раскомментировать 266 строку
case 'selection':
//return $browse ? l($value, 'profile/'. $field->name .'/'. $value) : check_plain($value);
case 'selection_hs':
иначе невозможно будет использовать ни textfield ни selection.
а по альтернативному модулю вопрос остается открытым.
Спасибо за замечаение. А про альтернативный модуль я не задумывался, так как меня устраивает текущая реализация (описанная на этой странице).
У меня после установки этого модуля при сохранении параметров профиля выдавал пустую страницу
Оказалось profile.module сохранен не корректно, убрал в начале файла до <? паразитные символы, заработало
А почему в profile.module
case 'textfield': - пустое?
у меня из-за этого текстовые поля не отображались
добавил
case 'textfield':
return check_markup($value);
появились
Чтобы ссылки с названиями Страна-Регин-Город были активны в настройках поля поставил галки на "Использовать при регистрации", "Общедоступное поле" и написал заголовок типа "Люди, которые живут в городе %value" теперь в профиле ссылка с добавленного поля в виде "profile/profile_region/1960" ведет на список пользователей из этого города (страны, региона)
А как сделать выборку (views) чтобы выдавались пользователи с данного региона? У меня через views не получается.
ага, есть проблема с лишними символами в этом файле
Господа, поставил модуль, вернее заменил стандартный, вроде все исправил, но все равно
в файле profile.module до <? никаких знаков не вижу. Что делать? Никто не поделится исправленным файликом?
Petro, В Notepad++ измени кодировку на UTF-8(без BOM).
По всем постам выше исправления сделаны, но при сохранении все равно выдает
«warning: Invalid argument supplied for foreach() in P:\home\musiclab.ru\www\sites\all\modules\user_terms\user_terms.module on line 212.»
Ковыряние стандартных модулей это ИМХО зло, надо уходить от этого и или юзать готовые решения, или писать решения с использованием API CMS, а нарушение целостности - это дурной тон, все имхо
Так это просто написан новый модуль
Ну сделайте как надо, мы Вас спасибо скажем!!!
подскажите пожалуйста, как же вывести пользователей по регионам?!
Ссылка на всех пользователей из региона будет вида: www.example.ru/profile/profile_school/1534, где 1534 - ID термина (региона) из словаря таксономии.
разобрался, спасибо)
Еще актуально:
как сделать выборку (views или сниппет) чтобы выдавались пользователи с данного региона? У меня через views не получается.
При регистрации не работает
если надо чтоб работал при регистрации с модулем user_type, то прийдется обойтись без регистрации *Обычного пользователя*. Модифицированный модуль
кто-нибудь сделал, чтобы при нажатии в профиле на адрес выдавалась вся иерархия целиком а не только текущий параметр?
не "Все организации находящиеся по адресу д.25"
а "Все организации находящиеся по адресу Советский район Ул. Сергея Лазо д.25"
????
используй views с аргументом, передавай tid и должно заработать
Можно не менять модуль профайл, а использовать модуль hs_user_terms, только внимательно прочесть описание установки и включения.
Все сделал как описано, в профиле создались поля-ссылки, в моем случае это область, район, населенный пункт, но если нажать на эту ссылку (она вида profile/profile_region/1953, к примеру) то выбрасывает на страницу с надписью " Страница не найдена ". Что можно сделать подскажите пожалуйста.
Предполагаю, что это связано с обновленным модулем Profile, только не знаю где, может кто подсажет?
К записи прикреплен файл с архивом, в котором и есть модуль Profile, который надо использовать вместо вместо основного. Приведенный здесь модуль дорабатывался довольно давно и Drupal за это время много раз обновлялся. Может моя версия уже и не работает с последней версией Drupal.
У меня ваш модуль работал не корректно, он конечно данные сохранял правильно, но постоянно появлялся белый экран, пришлось вернуть прежний модуль и искать дальше решение проблемы
Вот это помогает и работает исправно, зачем портить модули
белый экран, проверьте не добавились ли в начало файла лишнии (паразитные) символы?
Нет после того как обновила друпал до 6.19 такое стало появляться а после замены на стандартный профайл белый экран исчез
Во views не отображается это созданное в profile поле.
Поэтому не могу ничего вывести в него.
Автор - красавчик!!! но у меня этот модуль уже не сработал ((( Нашёл аналогичный модуль на drupal.org http://drupal.org/project/hs_user_terms