Добрый день сообщество!Прошу сильно не карать, пишу первый раз на данном ресурсе!
Задача стояла следующая! На Drupal 7 реализовать:
- раздельную регистрацию для разных групп пользователей
- создание страницы пользователя отличной от стандартной
Немного поразмыслив и почитав рекомендации принял решения, что для реализации необходимо несколько модулей Rules,Profile2 и profile2_regpath.
В настройках создал еще 2 группы пользователей с различными правами А и В. После включения модулей, в меню Администрирование-Содержимое, появилась новая вкладка "ТИП ПРОФИЛЯ". Заходим в "Тип профиля", создаем 2 типа профиля, для пользователей A и B(машинное имя я им присвоил соответственно prof_a и prof_b).В настройках вновь созданного типа профиля ставим галочку, в какую группу необходимо поместить пользователя после регистрации. Прошу Вас обратить внимание именно на машинное имя созданных профилей, в дальнейшем они нам понадобятся.
В этих профилях создаем поля которые нам необходимо будет выводить пользователю при регистрации, для разных пользователей они будут разные соответственно. Кстати модуль Profile2(в связке с дополнением profile2_regpath) очень гибкий, в нем можно создавать не только различные формы регистрации, но и формы авторизации и восстановления пароля. После создание форм регистрации у Вас будут различные адреса для различных групп пользователей. Для примера у меня (http://site.ru/prof_a/register->для группы А и http://site.ru/prof_b/register->для группы B). Верстку дизайна здесь описывать не буду, думаю что это личное дело каждого. И так, первая проверка, заполняем все поля формы регистрации, регистрируем пользователя, и зарегистрированный пользователь попадает в ту группу которую мы назначили для формы данного профиля при регистрации. И так, задача решена.
Переходим к решению другой задачи, создаем в шаблоне темы page--user--%.tpl.php - шаблон, страницы пользователя, выводим все необходимые блоки, и другую информацию. Обновляем тему, и шаблон страницы пользователей начинает работать. И тут стал вопрос, а как же вывести поля пользователя которые он вводил при регистрации? Запросив вывод переменной $user, ничего нового не увидел, стандартный массив в котором не хранятся поля введенные с помощью модуля Profile2. Немного поразмыслив, попросил помощи поисковиков, но не нашел к сожалению более внятной информации. Немного почитав информации о модуле Profile2, понял одно, что он работает с помощью сущностей(Entity). А как же в моем шаблоне вывести поля которые пользователь вводил при регистрации? Немного покопав на сайте drupal.org, наткнулся на очень интересную функцию которая мне помогла в дальнейшем field_view_field. С помощью данной функции возможно выводить любые поля из модуля Profile2.
Для примера вывода полей Фамилия и Имя на странице пользователя. $profile['prof_a'] - вот это указатель на машинное имя именно того профиля, из которого необходимо выводить поля. Более детально описывать данную функцию не буду, все есть в документации API Drupal.
<?php
$profile = profile2_load_by_user($user->uid) ;
render(field_view_field( 'profile2' , $profile [ 'prof_a' ] , 'field_name', array( 'label'=>'hidden', )) ) ;
render(field_view_field( 'profile2' , $profile [ 'prof_a' ] , 'field_surname', array( 'label'=>'hidden', )) ) ;
?>
P.S. Спасибо Вам за внимание, надеюсь данная информация будет Вам полезна, готов выслушать все замечания и предложения. В дальнейшем планирую постепенно добавлять информацию по работе в данном направлении.
Комментарии
Спасибо, и правда очень полезно!
Как я понял профиль пользователя по данной схеме это профиль, а не тип материала? Хорошо. Получается, что каждой роли свой тип профиля. Вроде как это можно сделать разрулив права через Fied Permiimon, но для админа поля всех ролей будут в одной куче, как я понимаю, что неудобно. А если с вашим способом такого нет, то это вообще супер.
Поставил, как описано. Получается, что профиль - тип материала.
Подскажите с помощью какого кода можно вывести поля из profile2 в advanced forum код который выше в этой теме не подходит.Если выводить просто из стандартного профиля то вставляем вот этот код
<?php if (isset($account->field_gorod['und'])) print render(field_view_value('user', $account, 'field_gorod', $account->field_gorod['und'][0])); ?>
в папку модуля advanced forum - naked-autor pane, только меняем название своего поля.Кто знает подскажите как из profile2?
Уважаемые профи, не сочтите за наглость помогите с кодом.
Вопрос: Как отключить дефолтную страницу регистрации - user/register
А сделать там выбор - для какой роли регистрироваться?
нашел ответ здесь
А как поставить разрешение для анонима для адресов - http:// site.ru/prof_a/register - а то у меня доступ запрещён. А где разрешить не знаю?
а если мне пару полей нужно при регистрации вывести, как это можно сделать?
Как я понял, Profile2 это тип материала, заводятся поля и там где-то галочка вроде была, что выводить тип материала при регистрации, а в разрешениях полей на эти поля дать права анонимам. Я делал по схеме топикастера один раз ради эксперимента, все вроде получалось.
Ну как вариант. Конечно было бы лучше как в 6ке у каждого поля из профиля вывод в регистрацию без всяких там галочек для анонимов.
В 6-ке и-за этого помню путаница была. Да и по моему там тоже надо было галочки на права ставить.
Право доступа - Profile2
есть только :
- Редактировать свой профиль
- Редактировать любой профиль
- Просмотр своего профиля
- Просмотр любого профиля
А создать профиль - нет галки!
Что делать то?
Ну дык, в шестерке с Content Profile тоже так. Если дать анонимусам и ролям зарегистрированных пользователей права на создание профиля, как типа материала (как ноды), они же себе целые кучи смогут создавать. Там, как я понял рулят права на редактирование полей этого типа материала Profile2.
а если два профиля обще поля. как вывести в регистрацию общее поле
Алексей (evtifiev), я как понял, включил и всё работает, а как что и почему не работает - это не к нему, а разработчику модуля...)))
- я думаю это надо в профиль - main ставить.что это за такой профиль?
у меня есть 2 профиля
первый - lalala второй blablabla
в lalala поля:
name
hobby
music
в blablabla поля:
name
music
в регистрацию нужно вывести только поле name
пи.эс. у нас же 2 вида профиля два вида регистрации, два пути для выбора кем хотим быть lalala Или blablabla
что это за такой профиль?
у меня есть 2 профиля
первый - lalala второй blablabla
в lalala поля:
name
hobby
music
в blablabla поля:
name
music
в регистрацию нужно вывести только поле name
пи.эс. у нас же 2 вида профиля два вида регистрации, два пути для выбора кем хотим быть lalala Или blablabla
Вот я тупорылый олень...))) пол дня потратил... и модуль смотрел - 'access callback' => 'user_is_anonymous', и dev версию поставил(удалил) а вся фигня то была в том, что я дописал в ссылке user - site.ru/user/prof_a/register - вот доступ и запрещен - писал бы друпал по человечески - такой страницы нет. я бы сразу всё понял...)))
- профиль main ставится по умолчанию - видимо ты его удалил. Я просто предлагаю сделать общий профиль и в нём общее поле. Это как вариант в твоей ситуации. И поставить галку - Show on all user account registration forms. - тогда его будет видно при регистрации в любом профиле.
а зачем юзеру 2 профиля заполнять причем на разных вкладка/страницах?
профиль main по умолчанию - для одной роли, например, покупатели. А другой профиль, который нужно создать, для другой роли, например, продавцы.
Почему на одной? Это же не обязательные поля в регистрации. А потом будет заполнять поля в двух профилях...
Что то какая то ерунда выходит.
Тогда одинаковое поле, но не общее, а два разных, в двух профилях, но доступные для редактирования каждый своей роли.
а если роль изменится у юзера и соответсвенно профиль. ему что по второму разу те же поля заполнять?
Надо так делать, чтобы не менялась...)))
А вот с этим фиг его знает. Можт Rules'ами можно будет автоматом заполнять..
А можно хитрее сделать. Делаем все поля, которые будут у роли А и у роли Б, а профиль один. Только те поля, которые нужны роли А делаем права для роли А, а те поля, которые для роли Б - права для роли Б.
Хм) А как изменить что бы при регистрации выводилась не стандартная форма профиля Main, а типа что бы был выбор между профилем А и профилем Б? Прям галочка что бы стояла "Вы А или Б"?
а то все вроде нормально, но форма регистрации то стандартная лезет, та что по умолчанию....my_site/user/regisration
Я же уже ответил сам себе и вам...
На этой же странице рассказывается, что можно сделать это и через вьюс.
Читайте внимательней.
Да, спасибо - пропустила ссылку!
нечего не выводит, тупо пустая страница. Можно полный код для страницы пользователя?
У меня ситуация проще, у меня нет разных групп пользователей. Но я так и не поняла - по какому адресу можно посмотреть профиль пользователя?
Доступны только страницы "Мой аккаунт", "Мой профиль". А как посмотреть профиль другого пользователя?
Подскажите, кто знает
/user/[uid]/edit/[машинное_имя_профиля]
автор , молодец !!!
а можно ли получать поля новых пользователей на стадии регистрации по событии создания нового аккаунта? мне это нужно чтобы эти поля записывать в свои таблички.
предложенный пример автором мне наверно не подходит , так как это для авторизованных пользователей
(использую триггер hook_user_presave)
Присоединяюсь к вопросу andron81_81.
При такой реализации:
render(field_view_field( 'profile2' , $profile [ 'name_profile' ] , 'field_email', array( 'label'=>'hidden', )) ) ;
в моем случае данное поле видит только админ, т.к. email от анонимов и даже авторизованных юзеров скрыт.
Как сделать так, чтобы email можно было достать независимо от роли?
Ну судя по этому
у вас эмейл это просто обычное поле? дайте права всем просматривать это поле.
Field Permissions в помощь
Boozenok, да, это обычное поле.
Логика работы сайта выстроена таким образом, чтобы не делать это поле общедоступным!
Field Permissions используется, но в других целях.
Конкретно есть некий код, который дергает мыло вышеуказанным способом в модуле Custom tokens и подставляет токен в модуль webform. Соответственно, если на страницу с webform заходит НЕ админ, то выдается ошибка, т.к. этот код:
render(field_view_field( 'profile2' , $profile [ 'name_profile' ] , 'field_email', array( 'label'=>'hidden', )) ) ;
только для тех, у кого есть права на просмотр соответствующих профилей/полей profile2.
Пока единственное, что приходит в голову, это дернуть поле SQL запросом, но сам сделать не могу, т.к. не программист.
Может кто подскажет, как правильно в подобном случае составить запрос?
[РЕШЕНО] Таки работает конструкция!
Для тех кто будет использовать указанное в топике решение - все работает для анонимов, проблемы возникают только тогда, когда вытаскиваемое поле пустое!
То есть дело не в правах, Field Permissions здесь не нужен.
Всем удачи!
Подскажите пожалуйста, первый раз работаю с этим модулем.
Есть тип members (поля стандартные) и тип anketa (для анкет пользователей - много полей, возраст, город, страна, рост, вес, семейное положение и тд..).
Делаю с помощью этого модуля поля в типе anketa - при этом на странице регистрации /anketa/register появляются сразу все поля. Мне нужно их все скрыть, чтобы пользователь сначала зарегистрировался по username\email, а потом уже начал заполнять свой профайл. Нигде не нашел в настройках убрать определенные поля (в отображении везде поставил "Скрытый", со страницы профиля пропадают, а на странице регистрации остаются...).
Как убрать их со страницы регистрации? (в данный момент вижу один способ - display:none для этого блока... но это же не совсем правильно...)
И второй вопрос. Хочу сделать функционал с "VIP-статусом" анкеты. Сделал поле VIP - логическое да\нет. Как сделать так, чтобы это поле мог редактировать только admin? Field Permissions?
И третий вопрос (продолжение второго) - по сути сейчас это способ вручную. Хочу привязать автоматическое поднятие анкеты при оплате кредитной картой. В какую сторону копать? Может кто-нибудь сталкивался с этим?
shread777,
1. В настройках профиля: /admin/structure/profiles
Ссылка Изменить и там есть галка - Отображать в процессе регистрации.
2. Да, Field Permissions это просто и быстро.
3. Я делал через wiews + userpoint + Balance.
1. Я так понимаю ссылка "Отображать в процессе регистрации" - Show on all user account registration forms ?
Чекбокс у меня пустой, при этом site/user/register без дополнительных полей, а вот site/anketa/register со всеми полями... Мне же нужна раздельная регистрация, как описано в другой теме:
"Ставим модули (без патчей), настраиваем их. Создаём статичную страницу с адресом /user/register, на которой описываем типы регистрации и вставляем ссылки на регистрацию (типа /user/register/buyer, /user/register/simple, ...).
Всё."
Спасибо Алексею за разъяснения, очень подробно и по делу, не то что в куче английских TV-кастов. Я вынужден был использовать этот модуль для достижения внутренней эстетики и порядка. У меня на сайте есть три типа пользователей - админ, модератор и автор (Что может быть проще?). Админ следит за сайтом, - он один, модератор проверят статьи, а автор регается и присылает их. Когда я создаю из админки модератора (их несколько) я как дурак вынужден заполнять поля автора, что неприемлемо и просто тупо до бесконечности, ему эти поля вообще не нужны, зачем модератору указывать, например, свою творческую биографию или научного руководителя?
В итоге своих работ и долгих разбирательств с этими модулями понял, что добиваться подобной эстетики и порядка надо только костылями (т.е. жертвовать внутренним порядком кода), вроде скрывания полей через CSS и так далее, модуль бесполезен в моём случае. И думаю так не только в друпале дела обстоят. Когда надо сделать наитупейший блог, - есть куча предложений, когда задача немного усложняется и становится не тупо-тривиальной, то все "мегакрутейшие и функциональыне" решения оказываются говном и превращается в тыкву. Надеюсь в 8 версии это исправят.
Аналогичная труба в друпале обстоит с плейсхолдерами, с регистрацией по емейлу и через контакт да и много ещё с чем. Мораль проста - о всякой эстетике и думать забудьте, надо очень сильно постараться, чтобы сделать юзабельным интерфейс модератора, например. При этом 80% усилий как правило уходит на борьбу с друпалом и его дурацкими устоями.