Корпоративный портал на Drupal

Автор: Роман Архаров
Описание: В статье рассматриваются основные положения создания корпоративного портала на Drupal.
Источник: Статья на сайте журнала PC Magazine

Корпоративный портал на Drupal

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

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

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

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

Настройка. Создадим новые типы материалов, которые станут основой для нашего проекта. Для этого нужно перейти в меню 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. Страница настройки представления состоит из нескольких блоков.Сначала настроим представление, которое будет выводить список сотрудников выбранного отдела. Для этого в форме создания нового представления нужно организовать отображение типа Page и задать ему следующие настройки:Теперь, если перейти по адресу 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).