Поговорим о модуле profile2, Drupal 7.
Модуль расширяет наши возможности в создании и управлении профилями пользователей. Мы сможем создать несколько типов профилей со своими полями, получим отдельные страницы регистрации для каждого из типов пользователей и отдельные страницы просмотра и редактирования профиля.
Установка
Страница проекта модуля — drupal.org/project/profile2. Качаем последнюю версию, добавляем в свой проект (например, в sites/all/modules/). Я также устанавливаю модуль profile2_regpath, чтобы получить отдельные страницы регистрации.
На странице модулей drupal мы получаем примерно такую картинку:
Настройка
Настройки есть только у модуля Profile2, где мы создаём и настраиваем типы профилей [admin/structure/profiles]. Я создал целых три профиля — для организации (organization), частного лица (private person) и ИП (self-employed). У каждого свой набор полей.
Рассмотрим подробно настройки профилей, т.к. именно от них зависит будет ли у нас раздельными страницы регистрации, редактирования и т.п.
Название и машинное имя. От последнего будут зависеть генерируемые пути к страницам отображения и редактирования профилей. В данном примере пути просмотра и редактирования будут выглядеть так:
profile-org/1/view — просмотр (view) профиля организации (org) пользователя с user_id = 1
profile-org/1/edit — редактирование (edit) профиля организации (org) пользователя с user_id = 1
Пара чекбоксов позволяет сделать общие настройки профиля.
Первый из них решает показывать ли поля данного профиля на всех формах регистрации (что то вроде общего для всех профиля), второй чекбокс позволяет выделить редактирование и просмотр полей данного типа профиля на отдельные страницы, убирая их с базовой страницы профиля (как в примерах выше — profile-org/1/view и profile-org/1/edit).
Включаем опции модуля Profile2 registration path.
Галочка разворачивает целый набор настроек. Большинство из них не требует пояснения — это настаиваемые заголовки страниц, текст сообщения о регистрации и т.п.
Здесь же настраивается путь к форме регистрации данного типа профиля.
А также можно подключить роль данного пользователя после регистрации, т.е. связать тип профиля и роли пользователей на сайте.
У меня была только одна роль — администратор, она и показана в «списке». Советую для каждого профиля создать и ассоциировать свою роль [admin/people/permissions/roles]. Тогда можно будет ограничить редактирование профилей только тем профилем, редактирование которого разрешено в настройках выбранной роли пользователя. Т.е. настройки разрешений [admin/people/permissions] могут выглядеть вот так
Здесь каждая из ролей позволяет редактировать и просматривать только свой профиль и только того типа, который ассоциирован с данной ролью.
Немного программирования
Замечательно, что у нас есть отдельные страницы с просмотром и редактированием профиля. Но иногда надо вставить эти страницы либо как часть своей страницы, либо используя блок (block). Вот пример в нескольких строках кода, который вам поможет решать такую задачу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//глобальная переменная drupal - учетная запись текущего пользователя global $user; //подключаем нужный файл из модуля profile2 require_once drupal_get_path('module', 'profile2'). '/contrib/profile2_page.inc'; //некая функция, получающая тип профиля, например, опираясь на список ролей пользователя. $profile_type = detectProfileType($user); //этот код для случая просмотра профиля if ($profile_type) { //грузим профиль нужного типа $p = profile2_load_by_user($user, $profile_type); //осуществляем его рендеринг $out = render(profile2_page_view($p)); } else $out = t('Типа профиля не определен.'); //этот код для случая редактирования профиля if ($profile_type) //рендерим форму профиля $out = render(entity_ui_get_form('profile2', profile2_load_by_user($user, $profile_type))); else $out = t('Типа профиля не определен.'); //чтобы пример имел законченный вид, приведу пример //кода функции по определению типа профиля. function detectProfileType($user) { if (in_array('org', $user->roles)) return 'org'; if (in_array('ip', $user->roles)) return 'ip'; if (in_array('private', $user->roles)) return 'private'; //не определена роль профиля return false; } |