Швабрашвабр 2 — описание

  • 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.


Вступление

В мае 2008 года я сделал демонстрационную сборку CMS Drupal, работающую как коллективный блог с элементами социальной сети и получившую название Швабрашвабр. В основу этой сборки лег Друпал 5 версии. На тот момент уже был доступен Drupal 6, но под него еще не были портированы все необходимые для реализации задуманного функционала модули. В предложенной сборке был реализован следующий функционал:

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

Спустя полгода (в ноябре 2008 года) я реализовал аналогичный описанному выше функционал уже на шестом Друпале, но на тот момент еще не было возможности безболезненно портировать существующую Швабрушвабр с пятого Друпала на шестой. Эта сборка вместе с её описанием, а также большой статьей посвященной Друпалу была опубликована в журнале PC Magazine/RE, я очень рекомендую, перед дальнейшим чтением этого материала прочитать статью из PC Magazine, так как здесь я не буду описывать основные используемые понятия, которые были описаны в той статье. Кроме того, рекомендую прочитать две других моих статьи, посвященных Друпалу, также опубликованных в PC Magazine/RE, первая доступна по адресу http://pcmag.ru/solutions/detail.php?ID=36589, вторая будет опубликована в ближайшем номере журнала.

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

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

  • каждый пользователь может указывать свой статус, который выводится в виде микроблога в стиле Твиттера,
  • каждый пользователь может создавать персональные фотогалереи и загружать в них свои фотографии,
  • каждый пользователь имеет персональную гостевую книгу (как "стена" во вКонтакте),
  • каждый пользователь имеет список друзей и последних посетителей своего профиля,
  • кроме того, каждый пользователь при регистрации должен выбрать свой тип (в этой реализации — Исполнитель или Заказчик, но эти названия должны зависеть от конкретного проекта) и, в зависимости от типа, ему будут доступны различные настройки своего профиля.
  • на главную страницу теперь могут попадать не только материалы, набравшие определенный рейтинг, но и материалы продвинутые модератором,
  • и т.п.

Блоги теперь являются не основным элементом проекта, а лишь его небольшой частью.

В этой статье я покажу как решить следующие задачи:

  • как подготовить сайт на пятом Друпале к переносу на шестой и как осуществить этот перенос. На самом деле, в этой операции нет ничего сложного, в некоторых случаях достаточно просто скачать c drupal.org и установить шестой Друпал и все модули (их версии под Drupal 6), которые были использованы в сборке пятого Друпала, после чего подключить к этой сборке базу данных от старого сайта на пятом Друпале и запустить скрипт update.php. Этот скрипт сам выполнит все необходимые действия. К сожалению, в случае с Швабройшвабр будет не все так просто, после выполнения указанных действий сборку еще немного надо будет обработать напильником, в частности, нужно будет заново пересоздать "представления" (views — списки документов, которые используются, например, для генерации главной страницы сайта и страницы со списком всех записей в блоге), а также портировать "списки друзей" из устаревшего модуля BuddyList2 в новый User Relationships.
  • Как настроить "представления" для реализации старого (списки всех записей в блогах и записей в блогах для главной страницы) и нового функционала (списки фотогалерей и фотографий).
  • Как перенести списки друзей со старого сайта в новый (из BuddyList2 в User Relationships).
  • Как реализовать функционал персональных фотогалерей практически нативными средствами Друпала (Views и CCK) без применения сторонних модулей типа image или gallery2.
  • Как создать "стену", "статусы", "последних гостей" и вывести все это в профиле юзера.

Готовый пример, разработанный в рамках этой статьи вы можете скачать по ссылкам:

  1. Дистрибутив Друпала 6.14 со всеми необходимыми модулями
  2. Дамп базы данных

В предложенной сборке создано 4 юзера: admin, Заказчик, Исполнитель, Лошадь. У всех пароль — 1111 (к сайту Швабрашвабр.ру он не подходит ;)).

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

Подготовка и перенос сайта с пятого Друпала на шестой

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

Еще раз напомню логику переноса сайта с пятого Друпала на шестой:

  1. снимаем дамп базы данных с сайта на 5 Друпале и на его основе создаем новую базу данных;
  2. скачиваем и устанавливаем Друпал 6, а также все модули, которые были задействованы в сборке сайта на пятом Друпале;
  3. в файле sites/default/settings.php новой сборки в переменной $db_url прописываем настройки соединения с копией базы данных от сайта на пятом Друпале, которая была создана на первом этапе;
  4. запускаем скрипт update.php;
  5. очищаем все кеши системы, донастраиваем те модули, которые не были корректно перенесены обновляющим скриптом, в нашем случае это модули Views и BuddyList 2. Последний в новой сборке заменен на User Relationships.

Для собственного удобства при переносе сайта я создам три копии первоначального сайта:

  1. первая копия будет полной, неизмененной копией боевого сайта на пятом Друпале (те же файлы и база данных), она останется в моем музее выполненных проектов. Эта копия получит имя shvabr5, будет лежать в корне моего веб-сервера в папке shvabr5 и доступна на локальном компьютере по адресу shvabr5;
  2. вторая копия изначально будет соответствовать первой (копия той же базы данных, те же файлы модулей и тот же пятый Друпал), но в ней я поотключаю ненужные модули и сделаю некоторые подготовительные для переноса действия. Копия базы этого сайта получит имя shvabr5_6 и именно её дамп будет использован для дальнейшего обновления. Сайт будет лежать в папке shvabr5_6 и доступен по адресу shvabr5-6;
  3. третья копия сайта получит имя shvabr6 будет содержать уже шестой Друпал, все необходимые модули под шестой Друпал и базу данных shvabr6, изначально представляющую из себя копию базы shvabr5_6. После запуска скрипта update.php база shvabr6 уже не будет совпадать по структуре и данным с базой shvabr5_6.

Итак, первый скринкаст "Перенос сайта с Drupal 5 на Drupal 6", в котором я выполняю описанные выше действия. Всего 5 пунктов, а скринкаст длится 16 минут.

Настройка Views

По моей задумке, необходимо реализовать два списка записей в блогах:

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

Для реализации первого списка кроме модуля Views нам понадобится модуль Views OR, который позволяет создавать списки документов отфильтрованные с логикой ИЛИ (по умолчанию в модуле Views доступна только фильтрация с логикой И). Очень подробно о настройках модуля Views я рассказывал в своей первой статье для PC Magazine/RE, по этому за подробностями предлагаю обратиться к ней. В следующем скринкасте я прдлагаю посмотреть на процесс настройки представлений.

Для этого раздела я записал два скринкаста:

  1. Активация необходимых модулей
  2. Настройка Views

Перенос "Друзей"

Модуль User Relationships позволяет создавать различные типы связей между пользователями, например "друзья", "коллеги по работе" и т.п., а также задавать различные настройки для каждого из типов связей, например некоторые типы связей могут быть односторонними (пользователь А считает себя другом пользователя Б, а пользователь Б себя не считает другом пользователя А) или двухсторонними (если пользователь А считает себя другом пользователя Б, то эта связь не будет считаться активной до тех пор, пока пользователь Б не подтвердит через специальную форму то, что он действительно является другом пользователя А); некоторым связям можно задать "автоаппрув".

Также модуль User Relationships позволяет легко перенести "связи" из модуля BuddyList 2 для пятого Друпала. Для начала нужно сначала создать новый тип связи, например "друг", а затем воспользоваться модулем Migrate from BuddyList2. А вот и скринкаст на эту тему.

Настройка персональных фотогалерей

Для решения этой задачи мы воспользуемся связкой модулей Views + CCK + FileField + ImageField + ImageAPI + ImageCache. По моему опыту, с помощью этих модулей можно реализовать фотогалерею любой сложности, при этом такое решение будет гораздо более гибким чем в случае использования стандартных модулей типа image или gallery2.

Логика работы фотогалерей будет такой:

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

Для решения этих задач мы:

  • создадим тип контента "Общая галерея" и разрешим создавать материалы этого типа только администраторам сайта;
  • создадим тип контента "Персональная галерея" и разрешим создавать материалы этого типа всем юзерам;
  • создадим тип контента "Фотография" с двумя дополнительными CCK полями:
    • картинка (Imagefield);
    • привязка к галерее (node reference). С помощью этого поля можно связать два любых документа сайта друг с другом, причем по умолчанию поле этого типа будет выводиться как выпадающий список (или автокомплит поле), содержащее полный список всех материалов определенного типа, например, полный список всех фотогалерей, в нашем же случае в материале типа "Фотография" должен выводиться только список общих галерей и список галерей, созданных текущим пользователем, по этому для решения этой задачи мы создадим дополнительное представление (view), которое будет выбирать только нужные галереи, исходя из контекста.

Смотрим скринкаст.

В скринкасте не рассказано о темизации созданных галерей, чтобы разобраться в этом вопросе изучите исходные коды файлов sites/all/themes/aberdeen-shva/node-personal_gallery.tpl.php, node-common_gallery.tpl.php и node-image.tpl.php, которые находятся в архиве предложенного выше дистрибутива сборки.

Настройка "статусов", "стены" и "гостей"

Для реализации этих задач нам понадобятся модули Facebook_statuses (микроблог), Guestbook (стена) и User visits (список гостей). Их достаточно скачать, установить и раздать пользователям права на использование, после чего информация из них сразу же станет доступной в профиле пользователя, ее, при желании, останется только темизировать.

Настройка выбора роли и дополнительных настроек профиля для разных ролей

Для реализации этих задач необходимо настроить модули Auto Assign Role, реализующий автоматическое присваивание роли пользователю, и Content Profile — модуль, позволяющий привязать к каждому профилю материал определенного типа. Этот модуль имеет большое преимущество перед стандартным модулем Profile, так как позволяет накидать в профиль пользователя любые CCK-поля, а также дать доступ на редактирование созданного профиля только определенным пользователям, таким образом мы можем создать несколько разных типов профилей, с разным набором полей и разрешить редактировать каждый из типов профилей определенным группам пользователей. В нашем случае будут созданы роли "Исполнитель" и "Заказчик" и типы профилей "Профиль исполнителя" и "Профиль заказчика". Смотрим шестой скринкаст.

И еще раз о...

Disclaimer

Внимание! Данная сборка предоставляется не как готовое к использованию решение, а как демонстрация возможностей CMS Drupal. Я убежден, что каждый создаваемый сайт должен иметь свои индивитуальные черты, подчеркивающие особенности конкретного решения. Создаете сайт о футболе? Нет ничего сложного в том, чтобы реализовать на Друпале каталог команд и футболистов:

  • Создайте новый тип контента "Футбольная команда".
  • Создайте новый тип контента "Футболист" и с помощью CCK-поля node reference привяжите футболистов к командам.
  • С помощью Views создайте списки команд и футболистов, привязанных к команде.
  • С помощью CCK + Imagefield + Imagecache реализуйте возможность прикреплять к командам/футболистам фотографии.

Все эти задачи в том или ином виде реализованы в этой сборке, нужно только потратить время на то чтобы понять и осознать основные понятия, используемые в Друпале и вы, обладая минимальными знаниями в HTML + CSS + PHP, сможете создать сайт со структурой и связями любой сложности. Да, к сожалению, без минимальных знаний языков программирования и разметки вы не сможете на 100% воспользоваться возможностями системы, но вам и не обязательно быть PHP-гуру, чтобы разобраться в представленной сборке, достаточно уметь читать html-код и иметь представления об основных принципах программирования: условные операторы, циклы, функции.

К сожалению, у меня совершенно нет времени на то, чтобы заниматься поддержкой пользователй, по этому за ответами на возникающие вопросы прошу обращаться на Друпал.ру. Надеюсь, мое начинание будет поддержано сообществом Друпал.ру и Швабрашвабр, силами сообщества, будет развиваться и обрастать новым функционалом.

P.S.

Посмотреть описанные выше возможности можно на примере профилей: Заказчик, Исполнитель, Лошадь.

Комментарии

теме абердин - швабрашвабр на странице профиля пользователя выдает такие вот 2 ошибки (

user warning: Unknown column 'i.field_image_image_fid' in 'on clause' query: SELECT DISTINCT f.filepath, i.nid, n.title FROM content_type_image i INNER JOIN node n ON n.nid = i.nid INNER JOIN files f ON f.fid = i.field_image_image_fid WHERE i.field_image_gallery_nid = 1797 LIMIT 0,4 in /home/archnet/data/www/archnet.ru/sites/all/themes/aberdeen_shva/template.php on line 262.

warning: Invalid argument supplied for foreach() in /home/archnet/data/www/archnet.ru/sites/all/themes/aberdeen_shva/user-profile.tpl.php on line 128.

Если сменить шаблон то ошибки исчезают но и исчезают галереи из профиля пользователя !

Подскажите как устранить ошибки или как вывести галерея в профиль пользователя в другом шаблоне дизайна?

решил адаптировать свой сайт под shvabr
поставил, залил базу, перенес свои ноды, юсеров и роли. все вроде как работает, но постоянно вываливается:
Parameter 2 to user_relationship_blocks_user_relationships_type() expected to be a reference, value given in /var/www/shah-online.ru/includes/module.inc on line 471

Подскажите, что может быть????? В интернете все спокойно по этому поводу :)

аватар: Wild Diablo

А не подскажете, как потом это всё модерировать? Возможно ли сделать, чтобы на почту приходил отчёт о каждом добавленом комментарии и о каждой фотографии в профайле. Т.к., допустим, если это будет портал с посещаемостью 5 тыс человек в сутки, то отследить всех станет очень сложно. Особенно если спамеры начнут писать комментарии в топики полугодичной давности.

спасибо за новую версию) и массу описаний, скринкастов и статей.

Вопрос к знатокам.

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

Как появившиеся новые данные потом перенести на новую, обновленную версию ?
кроме копипаста, есть ли решения - залезть в таблицы и т.д. , по времени создания материалов как то ?

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

Приятно читать Ваш проект, вот в таких обзорах. Ромка, СПАСИБО!!!

Back to top