На сайте имеется несколько ролей пользователей. По задумке есть общедоступная роль и роль, регистрация в которую происходит только по приглашению.
Возникла необходимость сделать следующее - две формы регистрации:
1. общая, для всех пользователей
2. специальная, т.е. для тех, у кого есть специальный код и ссылка на эту регистрацию (пользователь получает приглашение со ссылкой и кодом по e-mail)
При этом, в "общей" форме должна быть ссылка для "запроса" приглашения на регистрацию в качестве особого пользователя.
Поэтому возникает вопрос: как можно реализовать такую регистрацию, когда она доступна всем, но если кто-то хочет зарегистрироваться в специальную роль, то он должен получить приглашение (запросить его, а потом перейти по ссылке)?
Через Invite можно сделать так, чтобы все пользователи регистрировались через приглашение.
Пока придумался только вариант сделать общую регистрацию, а потом, те кому нужно, запрашивают "повышение роли", но это не очень хорошо..необходимо сделать сразу регистрацию для разных ролей.
Комментарии
посмотрите autoassignrole
autoassignrole уже стоит, только он немного не то делает - он же просто роль назначает, но не дает возможности выставить "ограничения".
Уже пробовал и с Invites и с Registration Codes.
Пока все немного не то - не дают сделать именно "разграничение": либо закрыть путь для регистрации для специальной роли и сделать его доступным после ввода специального кода, либо сделать отдельную форму регистрации для специальной роли, где будет пункт "валидации кода" (полученного по e-mail), в котором, опять же, подтверждается, что данному пользователю можно зарегистрироваться под данной ролью.
Может есть какие-то модули, которые позволяют закрыть ("запаролить") определенный путь? Или же как-то возможно сделать отдельную регистрацию с пунктом валидации?
Вся проблема именно в том, чтобы это работало независимо от "общей, обычной" регистрации, потому что она тоже должна работать и не должна создавать трудностей для обычных пользователей.
Как решить данную проблему - пока понять не могу, поэтому надеюсь на помощь
Я делал это следующим образом:
Приглашения для определенной роли с помощью Invite
С помощью Content_profile создавал набор полей доступных для определенной роли
Когда пользователь регистрировался по приглашению, в своем профиле мог заполнить специфичные поля, в то время как у обычного пользователя их не было.
Тогда вот так попробуйте: registration_role_with_approval
Либо небольшой модуль писать.
А вообще, если внимательно посмотреть настройки Invites, то там можно сделать так, чтобы приглашения отправленные от имени опредленной роли давали при регистрации заданную роль. Только не забудьте этой роли (тому кто будет приглашать) дать разрешение на отправку приглашений. Тогда увидите опцию в настройках Invites.
Если этого нет в стабильной ветке, то смотрите dev версию - там точно есть.
Поля для разных ролей уже сделаны, вопрос именно в том, чтобы сделать изначально две разные регистрации для разных ролей: одна открытая для всех, а вторая доступная только по приглашению.
Я уже думал разные варианты: например, можно сделать, что изначально регистрируются все под обычную роль, а потом, кому необходимо - запрашивают "повышение" роли... но это немного не то.
Через Invites тоже пробовал и пока оставил это как некое дополнение, т.е. если уже зарегистрированный под специальной ролью пользователь захочет пригласить друга, то приглашенный будет зарегистрирован под этой же ролью... но это тоже немного не то.
Пробовал сделать с помощью 'Registration code' или 'Registration secret code'. Оба модуля добавляют в регистрацию поле для специального кода. Данный специальный код позволяют зарегистрироваться под специальной ролью. Соответственно это поле было сделано обязательным для заполнения, а AutoAssignRole был отключен (иначе был вариант, что пользователю дается сразу две роли). Был добавлен "публичный ключ", который регистрирует в обычную роль, никогда не истекает, не имеет ограничений на использование и написан в регистрации. А для регистрации в "специальную роль" создавались временные ключи, по которым пользователь должен был автоматически получать специальную роль.
И уже казалось, что проблема почти решена. Но оба модуля имели одну и туже проблему: если человек имеет хоть какой-то код (а в данном случае у нас был публичный ключ), то может зарегистрироваться под любой ролью.
А задумывалось все достаточно хорошо через эти модули.
Сейчас думаю над вариантом реализации с помощью AutoAssignRole через путь. Но тут встает проблема: как сделать так, чтобы путь регистрации в специальную роль не был доступ всем. Просто не говорить его обычным пользователям, а говорить только особым - не подходит.
Кстати, изначально и задумывалось реализовать через AutoAssignRole, но стоял вопрос в том, как "обезопасить" "специальный путь". "Обезопасивание" пути видится пока только двумя способами: либо проверять сам путь и выхватывать от туда специальную переменную-валидатор, которая бы сравнивалась с "тикетом" из базы; либо добавлять в регистрационную форму специальное поле, куда вводится "тикет". Но добавляется, опять же, всем.. а как добавить только в форму доступную по определенному пути - пока не ясно.
Складывается впечатление, что стандартными методами эту задачу не решить, а времени на разработку специального модуля нет... итак проект уже должен функционировать..
Может, все же, есть еще идеи?
так в чем проблема, если хотите приглашать только избранных приглашайте через роль админа. Т.е. пусть админ высылает приглашения и только по таким приглашениям можно получить эту "секретную роль". И делов-то.
Ссылку на запрос приглашения + страницу типа webforms, полагаю придумаете куда вставить. Это чтобы по быстрому. Потом придумаете что-нить более изящное для запроса приглашения.
Или вы хотите чтобы роль давалась по приглашениям от любых пользователей? тогда в чем секретность роли?
WiseMan, спасибо Вам за Вашу помощь и активное участие!
Именно так, как Вы и описали изначально и задумывалось, т.е. админ приглашает и по этому приглашению и получают эту специальную роль.
Но на сколько я понял пока в Invites нет возможности сделать определенную роль доступной только по приглашениям, а все остальные роли доступные всем. В этом и есть проблема, т.е. либо мы делаем регистрации во все роли по приглашениям, либо мы делаем все открытыми. По крайней мере я так понял из настроек Invite и страницы настройки пользователей (user/settings), где в поле "регистрация" стоят пункты:
Именно поэтому и понадобилось искать решение этой проблемы, т.е. либо добавлять поле "валидатор", либо закрывать определенный путь.
Если я не прав по этому поводу и можно базовыми настройками задать такое разграничение на регистрацию (т.е. определенная роль регистрируется свободно, а определенная только по приглашения), поправьте пожалуйста, буду рад!
Пока что решение видиться только через "запрет" определенного пути.
можно так же глянуть 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
}
?>
Если же сложно даже такой простой модуль сделать, то можной пойти по "некошерному" пути и добавить вышепрведенное условие прямо в код шаблона.
Включайте голову, пробуйте на практике!
P.P.S. Да и включать регистрацию только по приглашениям может быть ни к чему. Хотя возможет и такой вариант - пользователи приглашают всех, но только в публичные роли, а админ в секретную роль.
WiseMan, спасибо за активное участие и помощь! Похоже что этот вариант то, что нужно.
Правда вчера сам смог решить эту проблему несколько иным путем
Вот мой вариант:
1. Создаём несколько ролей
Если необходимо, можно поставить 'user types' чтобы назначять разные поля для разных ролей
2. Ставим 'registration codes', который позволяет регистрировать с использование специальных кодов.
Добавляем в специальный словарь "Registration codes" пару терминов связанных с ролями, например "термин A" для роли A и "термин В" для роли В
В настройках устанавливаем связь роли и термина из словаря.
Далее создаем "публичный код" для регистрации (без истечения и ограничения на использование). Это код связан с термином для публичной роли (А) и, следовательно, автоматически присваивает новому пользователю роль А.
3. "Убиваем" путь к регистрации "другой" роли (по примеру роль В). Для этого используем hook_menu_alter() - т.е. создаем небольшую функцию и помещаем туда код:
unset($items['user/register/Роль']);
в нашем случае, вместо "Роль" должно стоять BДля регистрации специального пользователя достаточно просто прислать ему специальный код, который связан с нужной ролью. "Убивать" путь необходимо для того, чтобы предотвратить "присваивание роли по публичному коду" - небольшой баг в модуле
Все!
похоже, что всегда существует несколько путей
Поставьте, тогда в начале названия темы [РЕШЕНО]
действительно... забыл
--