Усовершенствованный модуль Profile

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

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 12 декабря 2008 в 10:39

Задача

Работая над проектом, возникла задача, чтобы пользователь указывал в какой школе он учится. Школ в регионе много, поэтому нужно чтобы выбирался район области и подгружался список школ. Эта информация должна сохраняться в профиле пользователя (Район –> Школа). И хорошо бы, вывести список пользователей из определенной школы (района).

Решение

В стандартной поставке 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.zip19.07 КБ

Комментарии

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 12 декабря 2008 в 11:29

Все пользователи могут по разному называть свою школу. А идея корректировать руками плохая, да и незачем это делать, когда можно автоматизировать и красиво всё оформить.

Аватар пользователя kodo kodo 12 декабря 2008 в 12:04

Менять код модуля конечно не хорошо. Но давать пользователям вводить такие вещи руками вообще недопустимо и безграмотно! Так что задача решена, мои поздравления. Может кто предложит более красивое решение?

Аватар пользователя penexe penexe 12 декабря 2008 в 12:15

"kodo" wrote:
Может кто предложит более красивое решение?

отказаться от модуля profile, сделать профиль нодой с cck

Аватар пользователя Larus@drupal.org Larus@drupal.org 12 декабря 2008 в 12:29

penexe wrote:
"kodo" wrote:
Может кто предложит более красивое решение?

отказаться от модуля profile, сделать профиль нодой с cck

Hierarhical Select НЕ поддерживает интеграцию с ССК с сохранением всех узлов цепочки.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 12 декабря 2008 в 12:44

"penexe" wrote:
отказаться от модуля profile, сделать профиль нодой с cck

Это тоже не самый лучший вариант:
- непонятно как сделать функционал аналогичный Hierarhical Select.
- сложность выбора пользователей с определенным значением поля.
- не красиво: отдельная нода для каждого пользователя, которая будет выводится в общем списке нод.

Аватар пользователя penexe penexe 12 декабря 2008 в 13:02

"<a href="mailto:Larus@drupal.org">Larus@drupal.org</a>" wrote:
Hierarhical Select НЕ поддерживает интеграцию с ССК с сохранением всех узлов цепочки.

зато он поддерживает таксономию очень хорошо
"<a href="mailto:pachkow@drupal.org">pachkow@drupal.org</a>" wrote:
- непонятно как сделать функционал аналогичный Hierarhical Select.
- сложность выбора пользователей с определенным значением поля.
- не красиво: отдельная нода для каждого пользователя, которая будет выводится в общем списке нод.

1) также как и вы сделали
2) не сложнее чем у вас
3) в каком месте она будет выводится?

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 12 декабря 2008 в 13:12

"penexe" wrote:
1) также как и вы сделали
2) не сложнее чем у вас
3) в каком месте она будет выводится?

Это лишь доказывает, что поставленную задачу можно было решить множеством способов. Я рассказал сообществу о своём решении.

Аватар пользователя Химический Али Химический Али 12 декабря 2008 в 16:14

непонятно как сделать функционал аналогичный Hierarhical Select.

А зачем вообще этот "функционал" притом, что пользователь будет его использовать 1 раз при регистрации? Достаточно было сделат ьстандартным модулем выбор из списка, а вы изобрели велосипед.

Аватар пользователя batbug batbug 12 декабря 2008 в 20:56

Автору - зачет!

"Химический Али" wrote:
Достаточно было сделать стандартным модулем выбор из списка, а вы изобрели велосипед.

Стандартный выбор из списка и Hierarhical Select - это две большие разницы!

Аватар пользователя pri@drupal.org pri@drupal.org 12 июня 2009 в 14:15

это уже вопрос организации бд.
можно сделать разбивку по районам... хотя конечно хрен его знает.
все таки иерархический список тут можно и не использовать. если бы было какое то подобие автокомплита, учитывающего иерархию, как например тут http://www.ati.su/Trace/

Аватар пользователя pri@drupal.org pri@drupal.org 13 июня 2009 в 13:36

Ну перво-наперво нужно проверять на наличие массива в 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 строки исправить так:

      case 'selection_hs':
        $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);
Аватар пользователя Gedler Gedler 19 августа 2009 в 22:50

в прикрепленном модуле нужно раскомментировать 266 строку

      case 'textfield':
      case 'selection':
        //return $browse ? l($value, 'profile/'. $field->name .'/'. $value) : check_plain($value);
      case 'selection_hs':

иначе невозможно будет использовать ни textfield ни selection.
а по альтернативному модулю вопрос остается открытым.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 21 августа 2009 в 7:03

Gedler wrote:
в прикрепленном модуле нужно раскомментировать 266 строку

      case 'textfield':
      case 'selection':
        //return $browse ? l($value, 'profile/'. $field->name .'/'. $value) : check_plain($value);
      case 'selection_hs':

иначе невозможно будет использовать ни textfield ни selection.
а по альтернативному модулю вопрос остается открытым.

Спасибо за замечаение. А про альтернативный модуль я не задумывался, так как меня устраивает текущая реализация (описанная на этой странице).

Аватар пользователя Arturus Arturus 11 декабря 2009 в 9:15

У меня после установки этого модуля при сохранении параметров профиля выдавал пустую страницу
Оказалось profile.module сохранен не корректно, убрал в начале файла до <? паразитные символы, заработало

А почему в profile.module
case 'textfield': - пустое?
у меня из-за этого текстовые поля не отображались
добавил
case 'textfield':
return check_markup($value);

появились

Чтобы ссылки с названиями Страна-Регин-Город были активны в настройках поля поставил галки на "Использовать при регистрации", "Общедоступное поле" и написал заголовок типа "Люди, которые живут в городе %value" теперь в профиле ссылка с добавленного поля в виде "profile/profile_region/1960" ведет на список пользователей из этого города (страны, региона)

А как сделать выборку (views) чтобы выдавались пользователи с данного региона? У меня через views не получается.

Аватар пользователя Petro Petro 3 января 2010 в 9:52

Господа, поставил модуль, вернее заменил стандартный, вроде все исправил, но все равно

"Arturus" wrote:
У меня после установки этого модуля при сохранении параметров профиля выдавал пустую страницу

в файле profile.module до <? никаких знаков не вижу. Что делать? Никто не поделится исправленным файликом?

Аватар пользователя musiclabo.ru musiclabo.ru 11 января 2010 в 18:05

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.»

Аватар пользователя SORM@drupal.org SORM@drupal.org 13 января 2010 в 11:50

Ковыряние стандартных модулей это ИМХО зло, надо уходить от этого и или юзать готовые решения, или писать решения с использованием API CMS, а нарушение целостности - это дурной тон, все имхо Wink

Аватар пользователя Arturus Arturus 15 января 2010 в 11:24

"<a href="mailto:SORM@drupal.org">SORM@drupal.org</a>" wrote:
Ковыряние стандартных модулей это ИМХО зло, надо уходить от этого и или юзать готовые решения, или писать решения с использованием API CMS, а нарушение целостности - это дурной тон, все имхо

Ну сделайте как надо, мы Вас спасибо скажем!!!

Аватар пользователя Arturus Arturus 18 февраля 2010 в 5:54

Еще актуально:
как сделать выборку (views или сниппет) чтобы выдавались пользователи с данного региона? У меня через views не получается.

Аватар пользователя Jackinua Jackinua 10 ноября 2015 в 11:46

если надо чтоб работал при регистрации с модулем user_type, то прийдется обойтись без регистрации *Обычного пользователя*. Модифицированный модуль

Аватар пользователя LonelyAngel LonelyAngel 1 апреля 2010 в 18:23

кто-нибудь сделал, чтобы при нажатии в профиле на адрес выдавалась вся иерархия целиком а не только текущий параметр?

не "Все организации находящиеся по адресу д.25"
а "Все организации находящиеся по адресу Советский район Ул. Сергея Лазо д.25"

????

Аватар пользователя Dmitriy.ua Dmitriy.ua 15 июля 2010 в 19:41

Можно не менять модуль профайл, а использовать модуль hs_user_terms, только внимательно прочесть описание установки и включения.

Аватар пользователя hypnoser hypnoser 13 августа 2010 в 23:49

Все сделал как описано, в профиле создались поля-ссылки, в моем случае это область, район, населенный пункт, но если нажать на эту ссылку (она вида profile/profile_region/1953, к примеру) то выбрасывает на страницу с надписью " Страница не найдена ". Что можно сделать подскажите пожалуйста.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 30 августа 2010 в 8:56

К записи прикреплен файл с архивом, в котором и есть модуль Profile, который надо использовать вместо вместо основного. Приведенный здесь модуль дорабатывался довольно давно и Drupal за это время много раз обновлялся. Может моя версия уже и не работает с последней версией Drupal.

Аватар пользователя cinderella cinderella 3 сентября 2010 в 12:16

У меня ваш модуль работал не корректно, он конечно данные сохранял правильно, но постоянно появлялся белый экран, пришлось вернуть прежний модуль и искать дальше решение проблемы

Аватар пользователя cinderella cinderella 3 сентября 2010 в 16:27

"Dmitriy.ua" wrote:
Можно не менять модуль профайл, а использовать модуль hs_user_terms, только внимательно прочесть описание установки и включения.

Вот это помогает и работает исправно, зачем портить модули

Аватар пользователя cinderella cinderella 9 сентября 2010 в 11:00

Нет после того как обновила друпал до 6.19 такое стало появляться а после замены на стандартный профайл белый экран исчез