Разработка сайта на Drupal. Часть 4. Пример разработки корпоративного интранет-сайта на Drupal

Submitted by Ромка on Вс, 03/01/2010 - 02:51

Ромка аватар

Постановка задачи

Предположим, что имеется компания, которая занимается разработкой и интеграцией ПО. В ней работает несколько независимых групп разработчиков, каждая из которых занимается своим проектом. Задача секретаря компании — распределение входящих звонков между сотрудниками организации. Секретарь может не знать тонкостей работы отделов и технических терминов, а также кто из сотрудников занимается решением вопроса, с которым обращается позвонивший клиент, но при этом она должна направлять звонок в нужный отдел.

Решение

На основе CMS Drupal разрабатываем сайт, интегрированный с Active Directory. Благодаря такой интеграции пользователи могут для авторизации на сайте использовать логины и пароли от своих рабочих компьютеров. Для каждого сотрудника создается персональная страница с полями, частично доступными для редактирования самим сотрудником (краткая информация о себе, фотография), и частично доступными для редактирования сотрудниками отдела кадров (фамилия, имя, отчество, должность, контактный телефон и десяток ключевых слов — тэгов). Аналогичные страницы создаются для каждого отдела, по каждому из них имеется описание, телефоны, список всех сотрудников и информация о руководителе. Страница отдела описывается несколькими тегами, характеризующими его работу. При наличии такой системы секретарю достаточно двух-трех слов в вопросе клиента, после чего с помощью системы поиска он находит человека, который с наибольшей вероятностью сможет ответить на вопросы звонящего. Достаточно простой, но наглядный пример. Возможны более сложные варианты, кроме телефонного справочника, корпоративный сайт может содержать модули CRM, Helpdesk, «Доска объявлений» или «Доска почета», корпоративный чат или форум и др.

Сначала определимся со структурой сайта. Основными типами контента у нас будут «Отдел» и «Сотрудник». Управлять этими материалами смогут только пользователи с определенными правами доступа, например сотрудники отдела кадров. У каждого «Отдела» будут поля — название, описание, изображение, телефоны ответственных лиц, ссылка на страницу начальника отдела. В материале типа «Сотрудник» будут содержаться поля с информацией об имени человека, отделе, где он работает, контактные данные, а также поля, доступные для редактирования сотруднику, которому посвящена страница — фотография и текстовое поле с краткой информацией. Со страницы сотрудника автоматически будет проставляться ссылка на страницу отдела, где будут выводиться имена и ссылки на страницы всех сотрудников этого отдела. Кроме того, дадим возможность всем сотрудникам общаться на внутреннем форуме, вести свой дневник, закачивать изображения, а также разрешим определенному кругу лиц публиковать новости.

На главной странице будет выводиться список отделов, последние новости, форумные обсуждения и записи в дневниках. Если в сети компании настроен сервис каталогов LDAP (например, сервер OpenLDAP или контроллер домена Windows Active Directory), авторизацию пользователей можно организовать по протоколу LDAP. Для решения задачи нам понадобятся собственно система Drupal 6, модули CCK, Views, LDAP Integration, Panels, Filefield, Imegefield, Imageapi, ImageCache, FCKEditor, IMCE, Token и тема оформления Pixture Reloaded. Эти файлы можно найти на сайте http://drupal.org в разделах Modules и Themes.

Реализация

Загружаем с сайта drupal.org модули и CMS, следуя документации, инсталлируем их на сервер. Сначала изменим внешний вид сайта, выбрав в качестве активной темы Pixture Reloaded (при желании цветовую гамму). Активируем необходимые модули в меню Administer — Modules (/admin/build/modules):

  • Content — ядро модуля CCK.
  • Content Permissions — по умолчанию в Drupal права на просмотр/редактирование/удаление материалов распределяются с точностью до документа. Этот модуль позволяет настраивать права доступа к каждому полю в документе.
  • Fieldgroup — позволяет объединять поля документа в группы.
  • Filefield и Imagefield — модули, позволяющие прикреплять к документу любые файлы.
  • Node Reference — позволяет создавать связи между документами, в нашем случае документы типа Сотрудник будут привязаны к документам типа Отдел.
  • Option Widgets и Text — позволяют добавить к материалам стандартные объекты типа чекбоксов, комбобоксов, текстовых полей и т. д.

Для работы с изображениями потребуются модули Image API, Image API GD2 (или Image API ImageMagick, в зависимости от конфигурации сервера), ImageCache, ImageCacheUI. В нашем примере эти модули будут использованы для масштабирования пользовательских фотографий до размеров аватара (100x100 пикселов) и пиктограмм (20x20 пикселов).

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

Чтобы получить возможность в визуальном режиме создавать страницы, имеющие сложную блочную структуру, необходимо активировать модуль Panels, а также:

  • Panel pages — интерфейс для создания страниц, разделенных на блоки. Одна из задач, которая в нашем случае будет решаться при помощи этого модуля, — сборка главной страницы. Она будет разбита на четыре блока: верхний — заголовок страницы, левый средний — список отделов, ответственных лиц и их телефонов, правый средний — список последних сообщений в форумах и блогах и нижний — список последних новостей
  • Panels Views — используется для вывода представлений, созданных модулем Views внутри регионов, созданных модулем Panels
  • Mini panels — позволяет выводить панели внутри стандартных блоков Drupal
  • Понадобятся также модули Blog, Forum, Locale, Path, Pathauto, все модули из групп LDAP Integration, FCKeditor, IMCE, Token.

Итак, отмечаем галочками все вышеперечисленные модули и сохраняем изменения.

Настройка

Создадим новые типы материалов, которые станут основой для нашего проекта. Для этого нужно перейти в меню Administer — Content types (/admin/content/types) и нажать кнопку Add content type. Указываем человекопонятное имя типа материала «Отдел», машинно-понятное (латиницей) имя department и сохраняем изменения. Затем такие же действия проделываем еще раз, но в качестве имен указываем «Сотрудник» и worker.

По умолчанию в каждом из созданных типов материалов будут присутствовать поля «Заголовок», «Тело документа» и ряд служебных, поэтому для решения поставленной задачи нужно добавить к новым типам контента дополнительные поля. У «Отдела» — это будут ссылка на начальника отдела (на материал типа «Сотрудник»), телефоны ответственных лиц и картинка. Для «Сотрудника» добавим текстовые поля, в которых будут указаны его имя, фамилия, отчество, мобильный и рабочий телефон, ссылку на «Отдел», где он работает, и фотографию сотрудника.

Чтобы добавить дополнительные поля, нужно в списке типов материалов перейти по ссылке manage fields возле нужного типа. Сначала для материала типа «Отдел» создадим поле-ссылку на поле «Начальник отдела», зададим тип поля Node Reference, человеко- и машинно-понятные имена «Начальник отдела» и boss, соответственно. Затем добавим поле-картинку — тип Image, имена — «Изображение» и department_image, а также поле-список телефонов — тип Text — Text area, названия — «Телефоны» и department_phones. Для каждого из полей можно задать ряд дополнительных настроек, — например, для картинок можно указать максимальные размеры файла и разрешения изображения, а для поля-ссылки на документ можно выбрать метод, позволяющий отображать список документов, на которые можно поставить ссылки, обычный комбобокс или текстовое поле с автозаполнением.

На странице отдела будем выводить автоматически сформированный список сотрудников этого отдела. Для этого списка понадобится уменьшенная фотография сотрудника. Автоматическая обработка изображений выполняется модулем ImageCache, в котором (в нашем примере) нужно создать два набора настроек: с помощью первого изображения будут уменьшаться до квадрата 100x100 пикселов, во втором — до квадрата со стороной 20 пикселов. Чтобы создать эти наборы настроек, необходимо перейти в меню Administer — ImageCache (/admin/build/imagecache) и нажать кнопку Add new preset. При помощи модуля ImageCache изображения можно масштабировать, поворачивать на 90°, менять цветовую схему и т. д. А если установить модуль ImageCache Actions, то дополнительно появятся возможности накладывать на изображения водяные знаки, добавлять фон, поворачивать их на любые углы и т. д. В нашем случае следует воспользоваться или операцией Crop, вырезав из указанного в настройках участка изображения прямоугольник заданных размеров, или действием Scale, пропорционально уменьшающим изображение до заданного размера. Недостаток второго варианта в том, что если исходное изображение имеет неквадратную форму, то и результирующее будет неквадратным, а в большом списке изображения, имеющие разные размеры, могут смотреться некрасиво. С помощью действия Crop можно из картинки вырезать квадратный фрагмент.

Сейчас займемся распределением прав доступа к материалам. У нас будет две группы (роли) пользователей: одна группа имеет полный доступ к карточкам всех отделов и сотрудников (редакторы), у пользователей второй группы будет разрешение на просмотр всех материалов, но редактировать они смогут лишь некоторые поля своей карточки. Кроме того, пользователи обеих групп смогут общаться на форуме и вести свой дневник. По умолчанию в Drupal созданы две роли — анонимные и авторизованные пользователи. Нам понадобится третья группа — группа редакторов. Чтобы ее добавить, необходимо в соответствующей форме в меню Administer — Roles (/admin/user/roles) указать имя создаваемой роли, например «Редактор».

После того как роли созданы в меню Administer — Permissions (/admin/user/permissions), укажем права доступа для каждой. В группе прав blog нашим двум ролям выдадим права create blog entries и edit own blog entries, позволяющие создавать и редактировать свои записи в дневниках. Аналогичные галочки нужно расставить и в группе прав forum. В группе прав comment установим галочки access comments, post comments и post comments without approval, разрешающие просматривать и размещать комментарии без предварительной проверки модератором. В группе прав content_permissions для роли «Редактор» установим все галочки, а для роли authenticated user только галочки, разрешающие просмотр полей (они начинаются со слова view), и галочку, позволяющую редактирование фотографии в материале типа «Сотрудник». Далее в группе прав node дадим редакторам полный доступ к материалам типа «Отдел» и «Сотрудник» (галочки create, edit, delete для каждого типа), а обычным пользователям разрешим только операции access content и edit own worker content.

Логика работы с карточками сотрудников будет такой: редактор будет создавать карточку для каждого сотрудника и в качестве автора указывать имя соответствующего пользователя. В настройках прав доступа мы разрешили пользователям редактировать фотографии и описания в своих карточках, но не создавать материалы типа «Сотрудник». Таким образом, для каждого сотрудника будет создана одна карточка, которую он сможет редактировать.

Осталось расставить еще несколько галочек: view all panes и access all panel-pages для просмотра документов, созданных модулем Panels, access all views — для просмотра представлений, view imagefield uploads — для просмотра загруженых картинок.

Все создаваемые материалы по умолчанию будут иметь адрес вида node/AAA, где AAA — id (номер) документа. Это нас не устраивает по двум причинам. Во-первых, такой URL не передает пользователю информацию о том, что за документ находится по этому адресу, удобнее иметь адреса вида /article/name или news/2008/10/28/title. Во вторых, такой URL сложно использовать в служебных целях. Если, например, в адресе страницы содержится информация о типе материала, можно настроить вывод на экран определенных блоков. В нашем случае блок со списком сотрудников должен выводиться только на странице отдела. Это решается настройкой модуля Pathauto, который занимается автоматическим созданием человеко-понятных ссылок на основе заданных администратором правил. Настройки модуля задаются в меню Administer — URL Aliases — Automated alias settings (/admin/build/path/pathauto). Здесь в блоке настроек Node path settings для типа контента «Отдел» укажем маску department/[nid], а для типа контента «Сотрудник» маску worker/[nid]. Теперь по адресу документа легко определить его тип. Модуль Pathauto позволяет использовать в адресах различные шаблоны, в том числе и транслитерированные названия. Для работы транслитерации в папке с модулем Pathauto необходимо найти файл i18n-ascii.example.txt и переименовать его в i18n-ascii.txt, после этого в настройках модуля установить галочку Transliterate prior to creating alias.

Теперь можно попробовать зарегистрировать тестовых пользователей, создать в блогах несколько карточек отделов и сотрудников, форумных сообщений и записей. Все эти материалы будут выводиться в виде ленты на главной странице сайта. Такой вариант нас не устраивает, поэтому сейчас, используя модуль Views, мы создадим несколько представлений (списков с данными), каждое из которых будет выводить свой тип материалов, а затем при помощи модуля Panels соберем на главной странице данные из созданных представлений.

Как говорилось, модуль Views — это графический интерфейс, с помощью которого, не имея специальных знаний, в визуальном режиме можно создать сложный запрос к базе данных и настроить способ вывода этих данных на экран. Далее будем оперировать двумя понятиями: представление (view) — выборка данных, полученная в результате работы модуля Views, и отображение данных (display) — способ, с помощью которого эти данные выводятся на экран. По умолчанию модуль Views позволяет создать три способа отображения данных: страничный, когда данные выводятся на отдельной странице, блочный, в котором данные будут выводиться в блоке на любой странице, и тип Feed, в нем данные формируются в виде RSS-ленты. Различные модули, например Panels, могут добавлять дополнительные способы отображения контента. Каждое представление может иметь несколько вариантов отображения, т. е. оно может выводиться и отдельной страницей, и в блоке. В настройках каждого представления есть вариант отображения Default, содержащий базовую информацию о представлении, и эта информация будет использоваться при создании нового варианта отображения представления. Таким образом, разные варианты отображения одного и того же представления могут содержать отличающиеся данные и формат вывода.

Чтобы создать новое представление, необходимо перейти в меню Administer — Views (/admin/build/views) и нажать кнопку Add. Страница настройки представления состоит из нескольких блоков.

  • В блоке Filters настраиваются фильтры, по которым будут выбираться такие данные, как тип материала, дата публикации, метки, присвоенные документу, и т. д. Например, для создания списка сотрудников определенного отдела нам понадобятся документы только типа Сотрудник, а для настройки архива сообщений — записи в блогах и на форуме старше определенной даты.
  • В блоке Sort criteria задаются критерии сортировки документов. Сортировать их можно по дате публикации, автору, дате последнего комментария, количеству комментариев или просмотров, в случайном порядке и еще по многим другим критериям.
  • В блоке Fields можно выбрать поля, которые будут отображены в представлении. Настройки из этого блока используются, если настроен вариант вывода данных в виде таблицы, списка или сетки (row style — fields, style — table,list или grid). Если же данные выводятся в виде ленты новостей (row style — node), настройки этого блока игнорируются.
  • В блоке Relationships задаются связи с другими модулями, например, включив связь с модулем VotingAPI, можно добавить к представлению фильтры и критерии сортировки по количеству голосов, отданных за документы или по их рейтингу.
  • В блоке Arguments указываются параметры, которые будут передаваться в адресной строке браузера и повлияют на результаты выборки. В нашем случае для списка сотрудников отдела из адресной строки будет выбираться id отдела, чтобы по нему выбрать всех сотрудников этого отдела.
  • Блок Basic settings служит для настройки способа отображения данных, количества выводимых объектов и др.

Сначала настроим представление, которое будет выводить список сотрудников выбранного отдела. Для этого в форме создания нового представления нужно организовать отображение типа Page и задать ему следующие настройки:

  • в фильтрах указать тип контента — «Сотрудник»;
  • в аргументах выбрать пункт Content: Node reference: «Сотрудник отдела» (field_department) — это будет означать, что первый переданный представлению аргумент — номер отдела, к которому должен быть приписан сотрудник;
  • в списке полей выбрать имя, телефоны и фотографию сотрудника, причем в настройках фото можно выбрать как оригинальное изображение, так и изображение, обработанное модулем ImageCache. В нашем случае удобнее выбрать изображение 100x100 пикселов;
  • в базовых настройках выбираем табличный стиль отображения (style — table), а в настройках страницы задаем адрес, по которому она будет откликаться, в нашем случае подойдет название workers.

Теперь, если перейти по адресу workers/AAA, где вместо AAA подставлен id материала типа «Отдел», мы увидим таблицу со списком всех сотрудников выбранного отдела. Но это еще не все. Список сотрудников должен отображаться не на отдельной странице, а на странице отдела. Для решения этой задачи можно настроить мини-панель, т. е. такую панель, которая будет отображаться в стандартном блоке Drupal. Делается это в меню Administer — Panels — Mini panels (/admin/panels/panel-mini). Создаем новую панель, в качестве макета (layout) выбираем одноколоночный вариант, а в настройках содержимого указываем, что наша панель будет содержать созданное ранее представление workers. Напомню, что представление workers получает из адресной строки id отдела, для которого выбираются сотрудники. Чтобы созданная панель передала параметры адресной строки в представление, нужно в настройках установить галочку Send arguments и задать маску %1, означающую, что передаваться будет первый аргумент.

Отметим, что вставить представление в шаблон страницы можно без использования дополнительных модулей одной строчкой программного кода, воспользовавшись функцией views_embed_view(). Однако одна из целей данного примера — продемонстрировать возможности CMS Drupal, доступные пользователям, не имеющим навыков программиста, поэтому в примере используется модуль Panels.

После сохранения мини-панели в списке блоков Administer — Blocks (/admin/build/block) появится новый блок с именем Mini panel: Panеl name, переместим его, например, в регион Content bottom и сохраним изменения. Теперь внизу каждой страницы будет отображаться созданная нами мини-панель, но на всех страницах, кроме страниц отделов, этот блок будет пустым, так как система будет пытаться найти сотрудников даже для тех документов, которые не являются отделами. Чтобы обойти эту неприятность, необходимо зайти в настройки блока и в настройках видимости задать специальную маску. Ранее настройками модуля Pathauto мы задали для каждого материала типа «Отдел» маску URL вида department/[nid]. Поэтому, если в настройках видимости блока задать маску department/*, блок будет отображаться только на страницах типа «Отдел» и не будет отображаться на всех остальных страницах сайта.

Теперь мы имеем полноценную страницу отдела, которая содержит его описание, телефоны, ссылку на начальника отдела и список всех его сотрудников.

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

После настройки представлений в меню Administer — Page panel (/admin/panels/panel-page) нужно создать новую панель, выбрать для нее макет Two column stacked (это макет, состоящий из трех строк, в котором средняя строка разбита на два блока) и разместить в нем три созданных выше представления. Далее в меню Administer — Site information (settings/site-information) в качестве главной страницы указываем адрес созданной панели и получаем гибко настроенную главную страницу.

Если в локальной сети работает сервис каталогов LDAP, например Windows Active Directory, можно настроить авторизацию пользователей на сайте с помощью протокола LDAP. Соответствующие настройки задаются в меню Administer — LDAP Authentication (/admin/settings/ldapauth).

На демо-сайте http://2start.ru вы можете найти сборку этого сайта, интегрированную в пакет Denwer. Инсталлировав его на свой компьютер (или виртуальную машину), вы получите полнофункциональный сайт, описанный в этом примере, и сможете поэкспериментировать с его настройками.

Ссылки на другие части этой статьи:

Содержание всех статей: http://romka.eu/blog/my-drupal-articles

17 Comments

Как для человека первый раз

Как для человека первый раз столкнувшийся с Друпалом:
Перечитал первые 3 статьи , дошел до описайний Views и тут перестал понимать что пишет автор, т к с интерфейсом описание не совпадает

Ромка аватар

Тогда попробуйте прочитать

Тогда попробуйте прочитать эту статью: http://shvabrashvabr.ru/blog/shvabrashvabr-2-opisanie и посмотреть скринкасты в ней, там наглядно все показано. А в каком месте интерфейс отличается от описанного? В статье идет речь о Views2 (того что используется в Друпале 6), а его интерфейс с момента релиза не менялся. То есть и на момент написания статьи, и сейчас выглядеть интерфейс должен одинаково (ну, может в мелочах каких-то могут быть отличия).

Сегодня как раз устанавливал

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

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

У меня то же самое. Хотя и

У меня то же самое. Хотя и модули и сам друпал стоят последних версий, обновлял на прошлой неделе. при нажатии кнопки add в меню views выходит такая штука - http://temnoty.net/scr1.jpg
пишу имя, нажимаю далее. в аргументах, ну просто нет Content: Node reference: «Сотрудник отдела» (field_department)
есть только вот что http://temnoty.net/scr2.jpg
до этого делал вроде все правильно

Все супер!

Все супер! Разобрался)
Наверное, сначала я запутался потому, что в статье не так все разжевано. Но с другой стороны, только благодаря этому я действительно разобрался во взаимосвязях и принципах работы модулей, за что Автору огромное человеческое СПАСИБО!)

Если ты разобрался так

Если ты разобрался так расскажи другим как? а то я ни фига не понимаю

Иллюстрации

Спасибо за серию статей о Drupal, но не хватает иллюстраций-скриншотов.

Это то что надо

Статья то что надо, я реально сдвинулся с места. Формат отличный. Рома спасибо. Не поленился поблагодарить тебя и по емайл, пусть все знают. Моей радости нет придела.

Panels

Не могу найти как в программе передать аргумент из мини панели в представление?
В разделе разное появляется созданное view department(когда в view включаешь блок), но как там настроить передачу аргумента не нашел.

Может быть во view что-то не так сделал?

CTools

Спасибо за статью.
При активации модулей, пришлось еще и скачать http://drupal.org/project/ctools , чтобы активировать Panels..

Блин

Блин. Смотрю на восторженные отзывы и завидую. Включил вообще все модули, но в permissions не могу найти "access all panel-pages" и view imagefield uploads". Что за жись...

views

Прошу прощение, может не по теме, но вопрос по views. Я делаю сайт на drupal, создал тип материала "новости", затем перешёл в views, в fields выбрал материал заголовок и материал содержимое, в фильтрах выбрал опубликовано = да и тип материала = новости, создал путь - news и привязал к пункту меню "новости". И теперь на странице http://sait.ru/news выводятся полные новости. Вопрос - как сделать, чтобы на странице http://sait.ru/news выводились не полные новости, а анонсы? Просто в редакторе разделить пост на анонс и полный текст результата не дал. Не подскажите, что я делаю не так?

Спасибо за ответ - сам

Спасибо за ответ - сам разобрался. Нужно просто выбрать материал=анонс. Видимо, комменты нужны, чтобы писать типа - "Круто, пупсик, круто!" или "Афтор жжёт!". На этот блог - ни нагой!

views

Прошу прощение, может не по теме, но вопрос по views. Я делаю сайт на drupal, создал тип материала "новости", затем перешёл в views, в fields выбрал материал заголовок и материал содержимое, в фильтрах выбрал опубликовано = да и тип материала = новости, создал путь - news и привязал к пункту меню "новости". И теперь на странице http://sait.ru/news выводятся полные новости. Вопрос - как сделать, чтобы на странице http://sait.ru/news выводились не полные новости, а анонсы? Просто в редакторе разделить пост на анонс и полный текст результата не дал. Не подскажите, что я делаю не так?

А как сделать ссылки

А как сделать ссылки родительских уровней вместо статического "Главная"?

например по этой ссылке
http://2start.ru/worker/15

Главная / Департамент обслуживания / Транспортный отдел / Сусликов Геннадий Петрович

Всё сумбурно,

Всё сумбурно, непоследоватльно, такое ощущение, что писали так, лишь бы написать. Опускаете самые сложные моменты, а простые слишком разжёвываете.Проблемы возникают с модулем views, во-первых ни аргументы, ни фильтры сменить не получается, там просто не из чего выбирать, на смену стиля пишет:

# warning: Parameter 3 to views_ui_build_form_state() expected to be a reference, value given in /usr/local/www/apache22/data/modules/views/includes/admin.inc on line 1606.
# warning: call_user_func_array() expects parameter 1 to be a valid callback, no array or string given in /usr/local/www/apache22/data/includes/form.inc on line 377.
# warning: Invalid argument supplied for foreach() in /usr/local/www/apache22/data/modules/views/includes/admin.inc on line 1542.
# warning: Attempt to assign property of non-object in /usr/local/www/apache22/data/modules/views/includes/admin.inc on line 1613.

Ну и геморой вобще у меня с AD, хотелось бы поподробней описание LDAP integrator`а.