Описание

  • strict warning: Declaration of views_handler_field_user_name::init() should be compatible with views_handler_field_user::init(&$view, $data) in /var/www/shvabrashvabr.ru/sites/all/modules/views/modules/user/views_handler_field_user_name.inc on line 61.
  • strict warning: Declaration of views_handler_argument_many_to_one::init() should be compatible with views_handler_argument::init(&$view, $options) in /var/www/shvabrashvabr.ru/sites/all/modules/views/handlers/views_handler_argument_many_to_one.inc on line 169.


Оглавление

Статья получилась большой, по этому я ее разбил на несколько страниц:

  • на первой странице, то есть здесь, размещено описание задачи, описание используемых для ее решения средств, а также первоначальная настройка коллективных блогов;
  • вторая страница рассказывает о настройке прав доступа пользователей;
  • на третьей странице рассказывается о настройке системы рейтингов;
  • четвертая страница посвящена настройке модуля Views, отвечающего за фильтры содержимого;
  • на пятой странице приведено описание дополнительных модулей;

Формулировка задачи

Необходимо разработать коллективный блог с элементами социальной сети, работающий по следующим правилам:

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

Используемые средства

  • CMS Drupal 5.7 — ядро нашего проекта;
  • модуль Views — инструмент для фильтрации записей по различным критериям;
  • небольшим недостатком модуля Views является то, что все заданные им условия используются с логикой И, для реализации логики ИЛИ понадобится модуль Views Union;
  • для создания коллективных блогов будет использован модуль Oragnic Groups;
  • чтобы иметь возможность задавать псевдонимы коллективным блогам пригодится мой модуль OG Alias, который зависит от модуля CCK;
  • за реализацию голосований отвечают модули Voting API и Vote Up Down;
  • механизм "кармы", а также распределение ролей при получении пользователем кармы определенного уровня реализует модуль User Karma;
  • облака тэгов реализуются при помощи модуля Tagadelic;
  • списки друзей — Buddy List 2 + Usernode;
  • и еще небольшой список модулей, рекомендованных мною для использования: FCKEditor, Global Redirect, Google Analytics, Pathauto, Token, Excerpt, Nodewords;

Подготовительные действия

Скачайте и установите Друпал (ссылка выше), после этого скачайте и распакуйте все приведенные выше модули в папку "sites/all/modules" (это путь относительно корня Друпала). После выполнения этих действий перейдите в админку, в меню "Modules" ("admin/build/modules") и активируйте следующие модули: Buddy API, Buddylist UI, Content, Text, Blog, Path, Usernode, Organic groups, OG Alias, Tagadelic, User Karma, User Karma - give node plugin, User Karma - give votes plugin, User Karma - votes on comments plugin, User Karma - votes on nodes plugin, Views, Views RSS, Views UI, Views Union, Voting API, Vote up/down. Кроме того, вы можете активировать те модули, которые выше в списке я назвал рекомендованными.

Небольшое пояснение

В тексте иногда будут встречаться названия пунктов меню, если это название набрано обычным шрифтом, то это заголовок, если курсивом, то это путь из адресной строки. То есть текст "меню "Acces control" ("admin/user/access")" означает, что сейчас речь идет о меню с названием "Acces control", которое доступно по адресу example.com/admin/user/acccess.

Шаг 1. Настройка коллективных блогов

Первым делом было бы логично создать группы пользователей и раздать права доступа для них, но, для того чтобы позже сделать это одним махом, сначала нужно выполнить настройку модуля Organic Groups. В свойствах этого модуля нужно указать какой тип контента будет использоваться в качестве "домашней страницы" (контейнера) для групп, по этому необходимо в меню "Content types" ("admin/content/types") перейти на вкладку "Add content type" и создать новый тип материала с именем "Коллективный блог" и типом "group".

После того как новый тип материала сохранен нужно зайти в его свойства (в нашем случае это "admin/content/types/group/"), перейти на вкладку "Add field" (она появляется если включен модуль Content, кроме того в группе модулей CCK должен быть активирован модуль "Text") и добавить поле типа "Text — Text Field" с именем (Name) "alias" и заголовком (Label) "Псевдоним". Важно указать именно это имя, так как оно используется модулем OG Alias, для создания псевдонимов. Это поле необходимо сделать обязательным (галочка Required).

Для того чтобы заврешить настройку OG необходимо перейти в меню "Organic groups configuration" ("admin/og/og"), в группе свойств "Group home page" выбрать созданный нами тип "Коллективный блог" и сохранить изменения.

Продолжение на следующей странице.

Шаг 2. Настройка прав доступа

Теперь займемся настройкой прав пользователей. В первую очередь создадим новую группу пользователей в меню "Roles" ("admin/user/roles") и назовем ее, например, "Продвинутый юзер". Позже эта роль автоматически будет присваиваться пользователям, набравшим определенную карму.

Для изменения прав доступа существующих групп пользователей необходимо перейти в меню "Access control" ("administer/user/access") и расставить галочки, приведенные в следующей таблице. Здесь приведены только необходимые настройки, остальные можете менять по своему усмотрению. В этом примере единственным отличием продвинутого пользователя от авторизованного пользователя является возможность создавать коллективные блоги (право доступа "create group content ").

Право доступа для анонима для авторизованного юзера для продвинутого юзера
blog module
edit own blog
(разрешено вести персональный блог)
buddylist_ui module
maintain buddy list
(разрешено вести списки друзей)
view buddy lists
(разрешено просматривать списки друзей)
comment module
access comments
(просмотр комментариев)
administer comments
(администрирование комментариев)
post comments
(размещение комментариев)
post comments without approval
(размещение комментариев без премодерации)
node module
access content
(разрешено просматривать содержимое сайта)
administer content types
(разрешено управлять типами материалов)
administer nodes
(разрешено управлять материалами)
create group content
(разрешено создавать "Коллективные блоги")
create page content
(разрешено создавать материалы типа "Page")
create story content
(разрешено создавать материалы типа "Story")
edit group content
(разрешено редактировать все "Коллективные блоги")
edit own group content
(разрешено редактировать свои "Коллективные блоги")
edit own page content
edit own story content
edit page content
edit story content
revert revisions
(разрешено создавать ревизии)
view revisions
(разрешено просматривть ревизии)
og_alias module
update og alias
(разрешено редактировать псевдонимы коллективных блогов)
user module
access user profiles
(разрешено просматривать профили пользователей)
administer access control
(разрешено менять права доступа)
administer users
(разрешено редактировать профили пользователей)
change own username
(разрешено редактировать свое имя пользователя)
usernode module
edit own usernode
(разрешено редактировать свои персональную страницу)
edit usernodes
(разрешено редактировать все персональные страницы)
views module
access all views
(разрешено просматривать все представления (views, вьюшки))
vote_up_down module
access up-down vote statistic
(разрешено просамтривать статистику голосов за материалы и комментарии)
administer up-down vote
(разрешено управлять голосованиями)
use up-down vote
(разрешено голосовать за материалы и комментарии)
view up-down vote
(разрешено видеть форму голосования)

Следует помнить, что авторизованный пользователь наследует все права анонимного, то есть если у анонима стоит галочка "access content", а у авторизованного юзера — нет, то ему все равно будет разрешено просматривать контент. Точно также любая группа пользователей созданная нами вручную наследует права доступа от авторизованного пользователя.

Продолжение на следующей странице.

Шаг 3. Настройка голосований

Сейчас настроим голосования, для этого в админке необходимо перейти в меню "Vote up/down" ("admin/settings/voteupdown"). Здесь в группе свойств "Node types" установите галочку "Blog entry", то есть мы разрешаем голосовать за контент типа "Запись в блоге", при жалении можно разрешить голосовать и за "Коллективные блоги", тогда надо поставить и эту галку.

В остальных группах свойств также можно:

  • настроить вид голосовалок (классический +1/-1 или альтернативный +1);
  • определить когда отображать эти голосования, а когда нет (в тизерах и полных нодах или в одном из этих вариантов по отдельности);
  • разрешить или запретить голосовать анонимам (если голосование разрешить, то, кроме того, это голосование должно быть разрешено и в "Access control");
  • разрешить или запретить юзерам отменять свои голоса.

Шаг 4. Настройка кармы

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

Для решения этой части задачи перейдем в меню "User karma" ("admin/settings/user_karma") и в группе свойств "Roles eligible for user karma" отметим роли "авторизованные пользователи" и "продвинутые пользователи". Этим действием мы включим механизм кармы для выбранных ролей. После сохранения внесенных изменений в этом же меню "User karma" появятся новые группы свойств для каждой из выбранных ролей. В свойствах кармы для продвинутого юзера в поле "From" поставим, например, цифру 10. Это означает, что набрав 10 очков кармы пользователь автоматически станет "Продвинутым юзером".

Галочки "Show karma in the user profile page" и остальные можете поставить, а можете и нет, они отвечают за отображение кармы и места в рейтинге в профиле юзера, а также за добавление к объекту $user кармы и рейтинга.

Логика начисления кармы простая: если за пост в блоге или комментарий пользователя проголосовали, то этот голос определенным образом влияет на карму. Очевидно, что "вес" положительного голоса за пост должен быть выше веса положительного голоса за комментарий. По этому все в том же меню "User karma" на вкладках "On comments" и "On nodes" в поле "How much karma will be assigned for each vote" укажем единицу для комментариев и 3 для постов.

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

Всё, теперь наши пользователи могут плюсовать и минусовать друг друга, эти плюсы и минусы будут влиять на карму и, как следствие, на возможности юзеров, но пока эти плюсы не влияют на расположение постов. Этим мы займемся на следующем шаге и следующей странице.

Шаг 5. Фильтрация контента

Для Друпала создан мощный инструмент, позволяющий фильтровать материалы по большому количеству параметров и создавать из выбранным документов ленты различного вида. Этот инструмент – модуль Views. Массивы документов, созданные модулем Views, я буду называть "представлениями" или "вьюшками".

Небольшим недостатком модуля Views является то, что все заданные в нем фильтры используются с логикой И. То есть, например, нельзя задать такую логику "создать ленту новостей, в которую будут входить посты с рейтингом больше чем 5 ИЛИ посты отмеченные модератором". Для реализации такой логики нам поможет модуль Views union, суть которого сводится к тому, что мы сначала создадим две вьюшки: одну с фильтром "все посты с рейтингом больше чем 5", вторую с фильтром "все помеченные модератором посты". Затем мы создадим третью "master" вьюшку, которая объединит первые две.

Кроме условий фильтрации в модуле Views можно выбирать критерии сортировки контента, в нашем случае эти критерии должны задаваться только в master-вьюшке.

Итак, приступим к настройке. Для начала создадим ленту для главной страницы, на которой должны выводиться опубликованные записи из блога, которые набрали 5 баллов, а также должны выводиться все посты отмеченные модератором как "Sticky". Создадим вьюшку, которая будет выводить только посты набравшие 5 очков.

В админке, в меню "Views" ("admin/build/views") выбираем вкладку "Add". В группе свойств "Basic Information" задаем имя представления — "main_more_then_five". В группе "Page" ставим галку "Provide Page View", указываем URL "more5" и "View type" — "Teaser List". В группе свойств "Filters" добавляем фильтры "Node: Published, equals yes", "Node type: blog entry", "VotingAPI points vote result (sum): is greater then 5". Сохраняем представление. Если бы мы создавали одиночную вьюшку, то еще необходимо было бы задать параметры "Sort criteria", но так как мы используем модуль Views union, то сортировку зададим в мастер-вьюшке.

Теперь создадим представление, которое будет выводить "прикрепленные" модератором посты. Для этого опять в меню "Views" переходим на вкладку "Add", указываем имя вьюшки "sticked_posts", ставим галку "Provide Page View" и указываем URL "sticked", "View type" — "Teaser List". В фильтрах выбираем: "Node: Published, equals yes", "Node type: blog entry", "Node: Stycky, equals yes". Тоже не забываем сохранить изменения.

Ну и последнее действие. Создаем третье представление с именем "main", URL'ом "main" и параметрами "Provide Page View" и "View type" — "Teaser List". В группе свойств "Sort criteria" создаем два критерия: "Node: Sticky – Desc" и "Node: created time – Desc". В группе "Union" выбираем первые две вьюшки: "main_more_then_five" и "sticked_posts". Сохраняем представление. Всё, теперь у нас есть вюшка, отображающая все последние посты с определенным рейтингом и все прикрепленные посты. Чтобы прикрутить это представление к главной странице нужно в меню "Site information" ("admin/settings/site-information") в поле "Default front page" указать URL нашей вьюшки "main".

Аналогичные действия нужно проделать и для вьюшки, в которой будут отображаться все новые посты вне зависимости от рейтинга, за исключением того, что здесь не нужен будет фильтр по "VotingAPI points vote result (sum)".

Кроме представлений-страниц, модуль Views позволяет создавать представления-блоки, как раз такое представление сейчас мы используем для создания блока "Прямой эфир", в котором будут отображаться заголовки и ссылки всех последних комментариев.

Добавляем новое представление, указываем ему имя "live" и описание "Прямой эфир", в группе свойств "Block" ставим галку "Provide Block" и тип "Table view". В группе свойств "Fields" выбираем "Comment: Author Name", "Node: Title" и "Comment: Comment ID". В группе "Filters" выбираем "Comment: Comment Count — is greated then 0". В "Sort criteria" выбираем "Comment: Created Time — Desc". Сохраняем вьюшку и преходим в меню "Blocks" ("admin/build/block"), в котором выводим наш новый блок "live", например, в правую колонку ("Right side bar").

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

function theme_views_view_live($view, $type, $nodes){
$output = "";
for($i = count($nodes) - 1; $i >= 0; $i--){
$output .= "comments_uid . "\">" . $nodes[$i]->comments_name . "nid . "#comment-" . $nodes[$i]->comments_cid . "\">" . $nodes[$i]->node_title . "
";
}
return $output;
}

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

Тэги и облака тэгов

Тэг (или ярлык, или метка) — ключевое слово, которым можно пометить любой документ, любой тэг может быть присвоен нескольким статьям, любая статья может иметь несколько тэгов. При наличии большого количества материалов на сайте очень удобно фильтровать контент по тэгам, например можно вывести "список всех документов, у которых есть тэги А и Б" или "список документов, у которых есть теги А, В, но нет тэга Б".

Для удобства пользователей на сайтах с большим количеством материалов формируются "облака тэгов" — списки ключевых слов, отсортированные, обычно, в случайном порядке. Размер шрифта, которым в таком списке выводится тэг прямо пропорционален "популярности" тэга, то есть чем больше существует на сайте статей, к которым привязан тэг А, тем крупнее в облаке тэгов будет его шрифт.

В Друпале механизм тэгов реализуется модулем Taxonomy (входит в стандартную поставку), облака тэгов — модулем Tagadelic. Слово Taxonomy (таксономия) часто пугает новичков, которые только начинают работать с Друпалом, но, на самом деле, в этом модуле нет ничего сложного. Логика простая: в меню "Categories" ("admin/content/taxonomy") создается словарь (вкладка "Add"), этот словарь привязывается к нужному типу контента (в нашем случае к "Blog entry"). Если необходимо, чтобы пользователи сами могли указывать любые тэги, то в настройках словаря нужно поставить галку "Free tagging", если нужно обязать юзеров выбрать хотя бы один тэг, то надо поставить галку "Required". Если галка "Free tagging" не установлена, то в словарь необходимо добавить несколько терминов (тэгов).

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

Для того чтобы сформировать "облако тэгов" достаточно в меню "Blocks" ("admin/build/block") включить нужный блок, например, для блока "tags in Имя_словаря" выбрать регион "Right sidebar". При желании, используя API этого модуля можно сформировать облака тэгов из нескольких словарей.

Списки друзей

Списки друзей реализуются модулем Buddylist2, который настраивается в меню "Buddylist UI Settings" ("admin/settings/buddylist_ui"). Установок у модуля всего три:

  • Односторонний или двусторонний способ добавления в друзья;
  • показывать список друзей профиле;
  • показывать ссылки типа "добавить в друзья" в профиле;

Думаю, из названий ясно что делает каждая из настроек.

Другие полезные модули

  • Privatemsg — внутренняя почта для сайта;
  • Global Redirect — борьба с разными ссылками ведущими к одному материалу. Если материал доступен по ссылкам www.example.com/node/1, example.com/node/1/, example.com/alias_for_node_1 — это может негативно сказаться на результатах поиска, выдаваемых Гуглом, Яндексом и другими поисковиками. Модуль Global Redirect решает эту проблему;
  • Google Analytics — интеграция с Гугловским сервисом сбора статистики. К слову, очень удобный сервис;
  • XML Sitemap — генерация XML-карты сайта. Эти карты очень любят Гугл, Яху и другие поисковики;
  • Pathauto — автоматическая генерация человекопонятных URL;
  • Token — вспомогательный модуль, необходимый для работы некоторых других модулей;
  • Excerpt — этот модуль добавляет отдельное поле teaser к форме добавления материала (по умолчанию этого поля нет и Друпал пытается сам найти тизер в документе);
  • Nodewords — модуль для добавления мета-тэгов к странице;

Зе енд

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

На выделенном сервере с 8 Гб памяти и 3,2 Xeon'ом эта сборка выдержит порядка 10-15 тысяч уникальных посетителей в день (50-150 тысяч хитов), при необходимости производительность можно увеличить за счет подключения memcached и выделения отдельного сервера под БД. В такой конфигурации Друпал выдержит примерно до 50к уников в день.

Любые вопросы, комментарии и пожелания приветствуются. Писать можно или здесь, в комментариях, или на е-почту mne@romka.eu.

Комментарии

Ром, можешь выложить скриншот admin/build/modules ?

[х] Content 5.x-1.7 Allows administrators to define new content types.
Required by: Content Copy (disabled), Fieldgroup (disabled), Node Reference (disabled), Number (disabled), OG Alias (enabled), Option Widgets (disabled), Text (disabled), User Reference (disabled)

Ой, проглядел этот комментарий. Модуль "Text" должен быть активирован.

Появилось. Но только одно поле и один радио.

Create new field
---
Name: * [______]

The machine-readable name of the field.
Allowed characters : unaccentuated a-z, numbers and _. All other characters will be discarded.
You'll be able to choose a human-readable label for the field on next page

Field type: *
Text
( ) Text Field

Привет
У меня проблема.
На этом пункте:
--
После того как новый тип материала сохранен нужно зайти в его свойства (в нашем случае это "admin/content/types/group/"), перейти на вкладку "Add field" (она появляется если включен модуль Content) и добавить поле типа "Text — Text Field" с именем (Name) "alias" и заголовком (Label) "Псевдоним". Важно указать именно это имя, так как оно используется модулем OG Alias, для создания псевдонимов. Это поле необходимо сделать обязательным (галочка Required).
--
Модуль Content включен. Но перехожу на вкладку (admin/content/types/group/add_field) и вижу: No field modules are enabled. You need to enable one, such as text.module, before you can add new fields.

Что делать? Помогите)

А модуль "Text" в группе модулей "CCK" точно активирован? Добавил это уточнение к тексту статьи.

Активирован
Все равно нет того что ты описываешь

Активируй все модули группы CCK

С вьюисами косяк получился. Мэйн читается как ссылка на вьюшку в сконкретными действиями: Изменить и т.д., но показывать отказывается.

Права на "access views" у юзера есть? Галка "Provide page view" в настройках представления стоит?

Есть, стоит. Сама вьюшка на прилепленные блоги не работает.

http://socnet.shellmultimedia.com/ - демо соцсеть..

Спасибо =)

Back to top