Аналог Follow из различных соц. сетей.
Flag — маленький, простой модуль, но он открывает новые горизонты для разработки сайтов на Drupal, при этом позволяет реализовывать множество различного функционала в связке с Views.
В этой статье я расскажу как с помощью данного модуля сделать подписки на пользователей. Аналог этого всем известные follow/unfollow как в твиттере и везде.
Для начала запасаемся модулем Flag, а также модуль-помощник во всем — Views.
Немного отойду в сторону и вернусь к рассказу о модуле Flag. Он предназначен, чтобы ставить “флаги” при определенных действиях (зачастую клик), а затем использовать помеченные “флагом” сущности. А теперь перейдем к делу.
Создание “флага” подписаться/отписаться
Для начала нам просто нужно включить модуль Flag.
Затем переходим в настройки модуля флаг (admin/structure/flags) и создаем свой новый флаг.
На этапе выбора, к чему будет привязан флаг, нам необходимо указать “Users”, ведь наш флаг позволяет подписываться/отписываться на юзеров, соответственно и привязка должна быть именно к пользователям.
Дальше заполняем настройки для нашего флага:
- Название: Подписка на пользователей, машинное имя: user_subscribe;
- Flag link text: “Подписаться” — это текст, который будет показан когда флаг не установлен.
- Unflag link text: “Отписаться” — тоже что выше, ток наоборот :)
- Roles that may use this flag: выбираем роли, которые смогут подписывать и отписываться. В гостях смысла нету, потому-что их в таком случае не отследить, а вот авторизованные и выше смело получают от нас по 2 галочки ( подписываться и отписываться).
- Users may flag themselves — эту галочку мы убираем, ведь нам не нужно чтобы люди могли следить сами за собой? Это же абсурд!
- Этих настроек достаточно, поэтому сохраняем наш флаг.
Теперь если зайти на страницу пользователя, мы увидим поле для подписки на него:
Вы не поверите, но это всё! Да, так просто.
Усложняем задачу
Окей, это конечно все хорошо, но толку от этого мало, поэтому начнем с того, что создадим два представления: кто подписан и на кого подписан.
На кого подписан пользователь
- Создаем новое представление: Подписки пользователей, маш. user_subscribe;
- Выбираем что показывать нужно Users;
- Убираем галочку “create new page” и жмем: “Сохранить и редактировать”.
Сейчас мы сами создадим страницу со всем необходимым.
- На странице настройки представления жмем “Добавить страницу”;
- Указываем заголовок “На кого подписан пользователь”;
- Выбираем что показывать будем, допустим поля, и добавим для вывода поле “Изображения профиля” (аватарка);
- Указываем путь страницы: users/%/follow;
- Добавляем отношение: Flags: User flag. В его настройках выбираем наш флаг, а также ставим галочку “Любой пользователь” и указываем ему название, например “Follow”. Не оставляйте стандартное название, вы потом вообще запутаетесь окончательно, будет 100500 полей с одним названием;
- Добавляем второе отношение Flags: User, где выбираем связь с нашим предыдущим отношением. В качестве идентификатора укажите, например “User follow”;
- Добавляем контекстуальный фильтр User: Uid, и в связи выбираем наш “User follow”;
- В разделе “Когда значение не в URL” мы указываем “Предоставить значение по-умолчанию”, а в типе выбираем “ID пользователя из URL”;
- Сохраняем наше представление.
Теперь если мы подпишемся админом на парочку пользователей, а затем зайдем по адресу users/1/follow, то мы увидим на кого мы подписаны.
Кто подписан на пользователя
А теперь давайте сделаем обратное представление.
- Всё в том же представлении добавляем новую страницу;
- Даём ей название “Кто подписан на данного пользователя”;
- В контекстуальном фильтре убираем связь с “User follow”;
- И к полю “Изображение” (или тому как выводим на странице пользователей) добавляем связь на “User follow”;
Теперь можно зайти на страничку пользователя, которую вы подписались и посмотреть, работает или нет.
Вывод содержимого тех на кого подписан
Еще в качестве примера создадим представление, которое выводит только то содержимое, авторами которых являются те люди, на которых подписались вы.
В моём случае я с помощью devel generate создал туеву хучу материалов типа “Article”. Поэтому, для начала, я создаю страницу (/follow_article) на которой будут показаны все материалы типа Article. Это самое обычное представление по выводу содержимого.
А теперь время его поднастроить под нас:
- Для начала добавляем отношение Content: Author;
- Создаем еще одно отношение: Flags: User flag, в нем указываем отношение на автора (то что выше), затем выбираем наш флаг и указываем “Любой пользователь”;
- Добавляем третье отношение: Flags: User у которого отношение будет с предыдущим;
- Затем создаем контекстуальный фильтр User: Uid где связью указываем название отношения из пункта 3 (у меня не измененный Flag user). Также в фильтре указываем что предоставлять значение по-умолчанию, а в качестве предоставляемого значения выбираем: “User ID from logged in user” ( авторизовавшегося).
Сохраняем, заходим по адресу example.com/follow_article и видим только те статьи, чьи авторы ваши подписчики.
Заключение
Только на одном флаге “Подписка” можно добавить не хилую гибкость своему сайту. Это только одно из применений флагов, в дальнейшем, скорее всего, я расскажу другие варианты применения.
Данный метод (1 в 1), только оттемезированный я уже использую на одном сайте, так что вы можете посмотреть в живую как я это релизовал на сайте FollowPath.
Вот пример из под юзера, чтобы не регаться:
Ссылки
Комментарии
Добрый день! Таким же способом сделал подачу заявки на подписку на материал. Подскажи, вожможно ли реализовать чтобы автор материала одобрял/отклонял заявку на подписку?
Спасибо за материал, будем пробовать!
Все получилось, спасибо! Вопрос по последнему скрину как вы это все на одну страницу вывели, блоки сделали в тех же вьюшках?
Нет, переоформил страницу и вывел там несколько views.
Прочитал Вашу статью, все получилось реализовать, большое спасибо!
Подскажите, пожалуйста, как настроить связи, для такой схемы. Есть содержимое на которое пользователи могут поставить флаг, "согласен". Необходимо вывести пользователей, которые "согласились" с определенным материалом, пока получается вывести только пользователей которые просто нажали на флаг "согласиться", а вот только с определенным материалом не выходит.
Может обычный фильтр по типу материала добавить
Решил при помощи добавления контекстного фильтра, флаг:идентификатор сущности
Очень информативный и полезный пост. В общем-то только здесь и нашла исчерпывающий ответ на свой запрос. Спасибо. Но есть вопрос. А как в этой подписке можно реализовать то, чтобы показывались только те материалы пользователя, которые были размещены уже после подписки. По этому уроку выводятся материалы за все время.
И еще. Отправила сообщение и получила системное сообщение "Обнаружена атака в виде подбора CAPTCHA Статус Комментарий добавлен.". Это что значит? А если галочку в роботе не поставить, то оказывается я неправильно ответила на секретный вопрос. Мелочи, но броские.
"Вывод содержимого тех на кого подписан... и видим только те статьи, чьи авторы ваши подписчики."
Мне кажется здесь несостыковка. Да и не получается этот пункт реализовать, особенно без скринов)