- Друзья:
- Drupal cook book |
- Танцы с Друпалом |
- Уберкарт.ру |
- Сетегном |
- Карикатуры |
Швабрашвабр 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.
Posted ноября 9th, 2009 by Ромка
Вступление
В мае 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.
- Как создать "стену", "статусы", "последних гостей" и вывести все это в профиле юзера.
Готовый пример, разработанный в рамках этой статьи вы можете скачать по ссылкам:
В предложенной сборке создано 4 юзера: admin, Заказчик, Исполнитель, Лошадь. У всех пароль — 1111 (к сайту Швабрашвабр.ру он не подходит ;)).
Перед дальнейшим чтением статьи я рекомендую вам установить эту сборку на собственном сервере, изучить ее возможности и, в случае если у вас возникнут вопросы по настройке тех или иных элементов системы, вернуться к чтению статьи.
Подготовка и перенос сайта с пятого Друпала на шестой
Текст статьи будет разбавлен короткими скринкастами, в которых я покажу те действия, которые, на мой взгляд, проще понять если их один раз увидеть, чем сто раз перечитав текст. Я сразу прошу прощения за качество записей, из-за нехватки времени все скринкасты я записывал в один день без предварительной подготовки и без их дополнительной обработки. По этому в моих действиях иногда возникают ошибки, которые я исправляю прямо по ходу записей. Зато, за один день я записал больше часа инструкций, а в прошлый раз на примерно такой же объем записей я потратил почти две недели свободного времени.
Еще раз напомню логику переноса сайта с пятого Друпала на шестой:
- снимаем дамп базы данных с сайта на 5 Друпале и на его основе создаем новую базу данных;
- скачиваем и устанавливаем Друпал 6, а также все модули, которые были задействованы в сборке сайта на пятом Друпале;
- в файле sites/default/settings.php новой сборки в переменной $db_url прописываем настройки соединения с копией базы данных от сайта на пятом Друпале, которая была создана на первом этапе;
- запускаем скрипт update.php;
- очищаем все кеши системы, донастраиваем те модули, которые не были корректно перенесены обновляющим скриптом, в нашем случае это модули Views и BuddyList 2. Последний в новой сборке заменен на User Relationships.
Для собственного удобства при переносе сайта я создам три копии первоначального сайта:
- первая копия будет полной, неизмененной копией боевого сайта на пятом Друпале (те же файлы и база данных), она останется в моем музее выполненных проектов. Эта копия получит имя shvabr5, будет лежать в корне моего веб-сервера в папке shvabr5 и доступна на локальном компьютере по адресу shvabr5;
- вторая копия изначально будет соответствовать первой (копия той же базы данных, те же файлы модулей и тот же пятый Друпал), но в ней я поотключаю ненужные модули и сделаю некоторые подготовительные для переноса действия. Копия базы этого сайта получит имя shvabr5_6 и именно её дамп будет использован для дальнейшего обновления. Сайт будет лежать в папке shvabr5_6 и доступен по адресу shvabr5-6;
- третья копия сайта получит имя shvabr6 будет содержать уже шестой Друпал, все необходимые модули под шестой Друпал и базу данных shvabr6, изначально представляющую из себя копию базы shvabr5_6. После запуска скрипта update.php база shvabr6 уже не будет совпадать по структуре и данным с базой shvabr5_6.
Итак, первый скринкаст "Перенос сайта с Drupal 5 на Drupal 6", в котором я выполняю описанные выше действия. Всего 5 пунктов, а скринкаст длится 16 минут.
Настройка Views
По моей задумке, необходимо реализовать два списка записей в блогах:
- первый список, который по совместительству будет являться главной страницей сайта, должен содержать документы набравшие определенный рейтинг, а также документы отмеченные для публикации на главной странице модератором (то есть модератор может продвинуть на главную страницу сайта даже те материалы, которые не набрали нужный рейтинг).
- Второй список будет содержать все записи в блога, упорядоченные по дате создания (от новых к старым).
Для реализации первого списка кроме модуля Views нам понадобится модуль Views OR, который позволяет создавать списки документов отфильтрованные с логикой ИЛИ (по умолчанию в модуле Views доступна только фильтрация с логикой И). Очень подробно о настройках модуля Views я рассказывал в своей первой статье для PC Magazine/RE, по этому за подробностями предлагаю обратиться к ней. В следующем скринкасте я прдлагаю посмотреть на процесс настройки представлений.
Для этого раздела я записал два скринкаста:
Перенос "Друзей"
Модуль 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
Подскажите, что может быть????? В интернете все спокойно по этому поводу :)
А не подскажете, как потом это всё модерировать? Возможно ли сделать, чтобы на почту приходил отчёт о каждом добавленом комментарии и о каждой фотографии в профайле. Т.к., допустим, если это будет портал с посещаемостью 5 тыс человек в сутки, то отследить всех станет очень сложно. Особенно если спамеры начнут писать комментарии в топики полугодичной давности.
спасибо за новую версию) и массу описаний, скринкастов и статей.
Вопрос к знатокам.
Время апдейта с 5 на 6 может занять существенное время, в это время на рабочей версии могут появляться новые пользователи и контент.
Как появившиеся новые данные потом перенести на новую, обновленную версию ?
кроме копипаста, есть ли решения - залезть в таблицы и т.д. , по времени создания материалов как то ?
Сам перенос, если знать что делать, займет не больше 1-2 часов, по этому лучше сначала поднять тестовую копию сайта, потренироваться на ней и когда разберетесь с переносом переведите боевой сайт в оффлайн режим, еще раз снимите с него копию, конвертируйте и замените старый сайт новым. Разумеется перенос надо делать не на боевом сайте.
Приятно читать Ваш проект, вот в таких обзорах. Ромка, СПАСИБО!!!