[РЕШЕНО] Регистрация пользователей: стандартные роли и специальные (доступные по приглашению)

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

Аватар пользователя lanzs lanzs 5 августа 2010 в 18:43

На сайте имеется несколько ролей пользователей. По задумке есть общедоступная роль и роль, регистрация в которую происходит только по приглашению.

Возникла необходимость сделать следующее - две формы регистрации:
1. общая, для всех пользователей
2. специальная, т.е. для тех, у кого есть специальный код и ссылка на эту регистрацию (пользователь получает приглашение со ссылкой и кодом по e-mail)
При этом, в "общей" форме должна быть ссылка для "запроса" приглашения на регистрацию в качестве особого пользователя.

Поэтому возникает вопрос: как можно реализовать такую регистрацию, когда она доступна всем, но если кто-то хочет зарегистрироваться в специальную роль, то он должен получить приглашение (запросить его, а потом перейти по ссылке)?
Через Invite можно сделать так, чтобы все пользователи регистрировались через приглашение.
Пока придумался только вариант сделать общую регистрацию, а потом, те кому нужно, запрашивают "повышение роли", но это не очень хорошо..необходимо сделать сразу регистрацию для разных ролей.

Комментарии

Аватар пользователя lanzs lanzs 5 августа 2010 в 22:02

autoassignrole уже стоит, только он немного не то делает - он же просто роль назначает, но не дает возможности выставить "ограничения".

Уже пробовал и с Invites и с Registration Codes.
Пока все немного не то - не дают сделать именно "разграничение": либо закрыть путь для регистрации для специальной роли и сделать его доступным после ввода специального кода, либо сделать отдельную форму регистрации для специальной роли, где будет пункт "валидации кода" (полученного по e-mail), в котором, опять же, подтверждается, что данному пользователю можно зарегистрироваться под данной ролью.

Может есть какие-то модули, которые позволяют закрыть ("запаролить") определенный путь? Или же как-то возможно сделать отдельную регистрацию с пунктом валидации?

Вся проблема именно в том, чтобы это работало независимо от "общей, обычной" регистрации, потому что она тоже должна работать и не должна создавать трудностей для обычных пользователей.

Как решить данную проблему - пока понять не могу, поэтому надеюсь на помощь

Аватар пользователя kirillnvnsk kirillnvnsk 5 августа 2010 в 22:28

Я делал это следующим образом:
Приглашения для определенной роли с помощью Invite
С помощью Content_profile создавал набор полей доступных для определенной роли
Когда пользователь регистрировался по приглашению, в своем профиле мог заполнить специфичные поля, в то время как у обычного пользователя их не было.

Аватар пользователя WiseMan WiseMan 5 августа 2010 в 22:41

Тогда вот так попробуйте: registration_role_with_approval

Либо небольшой модуль писать.

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

Если этого нет в стабильной ветке, то смотрите dev версию - там точно есть.

Аватар пользователя lanzs lanzs 6 августа 2010 в 14:26

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

Я уже думал разные варианты: например, можно сделать, что изначально регистрируются все под обычную роль, а потом, кому необходимо - запрашивают "повышение" роли... но это немного не то.

Через Invites тоже пробовал и пока оставил это как некое дополнение, т.е. если уже зарегистрированный под специальной ролью пользователь захочет пригласить друга, то приглашенный будет зарегистрирован под этой же ролью... но это тоже немного не то.

Пробовал сделать с помощью 'Registration code' или 'Registration secret code'. Оба модуля добавляют в регистрацию поле для специального кода. Данный специальный код позволяют зарегистрироваться под специальной ролью. Соответственно это поле было сделано обязательным для заполнения, а AutoAssignRole был отключен (иначе был вариант, что пользователю дается сразу две роли). Был добавлен "публичный ключ", который регистрирует в обычную роль, никогда не истекает, не имеет ограничений на использование и написан в регистрации. А для регистрации в "специальную роль" создавались временные ключи, по которым пользователь должен был автоматически получать специальную роль.
И уже казалось, что проблема почти решена. Но оба модуля имели одну и туже проблему: если человек имеет хоть какой-то код (а в данном случае у нас был публичный ключ), то может зарегистрироваться под любой ролью.
А задумывалось все достаточно хорошо через эти модули.

Сейчас думаю над вариантом реализации с помощью AutoAssignRole через путь. Но тут встает проблема: как сделать так, чтобы путь регистрации в специальную роль не был доступ всем. Просто не говорить его обычным пользователям, а говорить только особым - не подходит.

Кстати, изначально и задумывалось реализовать через AutoAssignRole, но стоял вопрос в том, как "обезопасить" "специальный путь". "Обезопасивание" пути видится пока только двумя способами: либо проверять сам путь и выхватывать от туда специальную переменную-валидатор, которая бы сравнивалась с "тикетом" из базы; либо добавлять в регистрационную форму специальное поле, куда вводится "тикет". Но добавляется, опять же, всем.. а как добавить только в форму доступную по определенному пути - пока не ясно.

Складывается впечатление, что стандартными методами эту задачу не решить, а времени на разработку специального модуля нет... итак проект уже должен функционировать..

Может, все же, есть еще идеи?

Аватар пользователя WiseMan WiseMan 6 августа 2010 в 23:48

так в чем проблема, если хотите приглашать только избранных приглашайте через роль админа. Т.е. пусть админ высылает приглашения и только по таким приглашениям можно получить эту "секретную роль". И делов-то.

Ссылку на запрос приглашения + страницу типа webforms, полагаю придумаете куда вставить. Это чтобы по быстрому. Потом придумаете что-нить более изящное для запроса приглашения.

Или вы хотите чтобы роль давалась по приглашениям от любых пользователей? тогда в чем секретность роли?

Аватар пользователя lanzs lanzs 7 августа 2010 в 13:45

WiseMan, спасибо Вам за Вашу помощь и активное участие!
Именно так, как Вы и описали изначально и задумывалось, т.е. админ приглашает и по этому приглашению и получают эту специальную роль.
Но на сколько я понял пока в Invites нет возможности сделать определенную роль доступной только по приглашениям, а все остальные роли доступные всем. В этом и есть проблема, т.е. либо мы делаем регистрации во все роли по приглашениям, либо мы делаем все открытыми. По крайней мере я так понял из настроек Invite и страницы настройки пользователей (user/settings), где в поле "регистрация" стоят пункты:

  • Только администраторы могут создавать новые учетные записи пользователей
  • Посетители могут создавать учетные записи, разрешение администратора не требуется
  • Посетители могут создавать учетные записи, но требуется разрешение администратора
  • New user registration by invitation only

Именно поэтому и понадобилось искать решение этой проблемы, т.е. либо добавлять поле "валидатор", либо закрывать определенный путь.

Если я не прав по этому поводу и можно базовыми настройками задать такое разграничение на регистрацию (т.е. определенная роль регистрируется свободно, а определенная только по приглашения), поправьте пожалуйста, буду рад!

Пока что решение видиться только через "запрет" определенного пути.

Аватар пользователя WiseMan WiseMan 7 августа 2010 в 17:08
  1. отключаете AutoAssignRole совсем, чтобы не было двойных ролей. Или оставляете настройки "только по пути" для всех общедоступных ролей.
  2. ставите registration_role_with_approval - упоминал о нем выше. Сморели, щупали? Wink Там можно выбрать какие роли будут видны при регистрации и какие требуют модерации. Я бы выбрал только общедоступные роли, а в настройках инвайтс разрешил приглашать админу с назначением нужной секретной роли. Если же всем регситрирующимся назначать обычную роль зарегисрированное пользователя, то модуль registration_role_with_approval вообще не нужен.
  3. Секретная роль вполне себе назначается через приглашения админа.

можно так же глянуть apply_for_role если ролей много. Может даже еще удобней будет чем registration_role_with_approval, т.к. опции отображения на странице регистрации более гибкие. Но в отличии от registration_role_with_approval все доступные роли будут требовать модерации.

P.S. Если хотите перекрыть стандартный путь регистрации, чтобы был доступен скажем, только при наличии приглашения, то поставьте проверку в hook_user() для case 'register': что-то типа:

<?php
       $invite 
invite_load_from_session();
    if (!
$invite) {
        
// здесь то что хотите, например, так:
          
drupal_goto('user/newrole'); //путь заданный в AutoAssignRole
    
}
?>

Если же сложно даже такой простой модуль сделать, то можной пойти по "некошерному" пути и добавить вышепрведенное условие прямо в код шаблона.

Включайте голову, пробуйте на практике! Wink

P.P.S. Да и включать регистрацию только по приглашениям может быть ни к чему. Хотя возможет и такой вариант - пользователи приглашают всех, но только в публичные роли, а админ в секретную роль.

Аватар пользователя lanzs lanzs 8 августа 2010 в 20:48

WiseMan, спасибо за активное участие и помощь! Похоже что этот вариант то, что нужно.

Правда вчера сам смог решить эту проблему несколько иным путем Smile

Вот мой вариант:

1. Создаём несколько ролей
Если необходимо, можно поставить 'user types' чтобы назначять разные поля для разных ролей

2. Ставим 'registration codes', который позволяет регистрировать с использование специальных кодов.
Добавляем в специальный словарь "Registration codes" пару терминов связанных с ролями, например "термин A" для роли A и "термин В" для роли В
В настройках устанавливаем связь роли и термина из словаря.
Далее создаем "публичный код" для регистрации (без истечения и ограничения на использование). Это код связан с термином для публичной роли (А) и, следовательно, автоматически присваивает новому пользователю роль А.

3. "Убиваем" путь к регистрации "другой" роли (по примеру роль В). Для этого используем hook_menu_alter() - т.е. создаем небольшую функцию и помещаем туда код: unset($items['user/register/Роль']); в нашем случае, вместо "Роль" должно стоять B

Для регистрации специального пользователя достаточно просто прислать ему специальный код, который связан с нужной ролью. "Убивать" путь необходимо для того, чтобы предотвратить "присваивание роли по публичному коду" - небольшой баг в модуле Wink

Все!
похоже, что всегда существует несколько путей Smile