Задача
Работая над проектом, возникла задача, чтобы пользователь указывал в какой школе он учится. Школ в регионе много, поэтому нужно чтобы выбирался район области и подгружался список школ. Эта информация должна сохраняться в профиле пользователя (Район –> Школа). И хорошо бы, вывести список пользователей из определенной школы (района).
Решение
В стандартной поставке 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, заменить им стандартный модуль (и включите его в админке, если ещё не сделали этого). И всё, можно создавать поля с новым типом.
Вложение | Размер |
---|---|
![]() | 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, а нарушение целостности - это дурной тон, все имхо![Wink](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/wink.gif)
Так это просто написан новый модуль![Wink](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/wink.gif)
Ну сделайте как надо, мы Вас спасибо скажем!!!
подскажите пожалуйста, как же вывести пользователей по регионам?!
Ссылка на всех пользователей из региона будет вида: 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