Обзор модулей Друпала

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

Буду оперировать понятиями «материал», «пользователь», «синоним», и прочими, считая, что читатель с ними уже знаком. Если же нет, то извините. :) Обращайтесь, поясню. (Хотя, пока что текст не предполагает полной публикации)

Ядро Drupal

Никаким образом не отключаемыми являются пять модулей. Это часть ядра как такового, но тем не менее, оформлены как модули.

Дополнение: Странно, я считал, что их три. Но присмотревшись к списку, увидел, что block и filter тоже входят в ядро. Перенес их описания сюда.

block
Все что есть на сайте, помимо основного содержания, обычно выводится в блоках. Суть такая: тема предоставляет регионы (участки на странице сайта), модули представляют блоки, а мы в админке указываем, какой блок в каком регионе выводить. Так же можно указать, кому (по ролям) и где (на каких страницах или при каком условии). Сам этот модуль, помимо управления блоками, предоставляет возможность добавлять простые блоки с текстом (или php-кодом). Все остальные блоки от других модулей. В качестве примеров: меню, опросы, вход (логин) — все обычно блоки.
filter
Все содержимое хранится в базе в простом текстовом виде. Но вывести его можно по всякому. Для этого оно перед выводом проходит через фильтры, выбранные для данного материала. Точнее, при создании материала выбирается формат ввода, а он является определенным набором фильтров. Примеры фильтров: ограничение html-тегов (вырезание всех кроме доступных), автоматические ссылки из адресов в тексте, «обсфукация» email'ов, выполнение php-кода (см.ниже модуль php), перевод из BBCode или Wiki разметок в html, вставка картинок смайликов. Да мало ли чего. Ну а этот модуль обеспечивает работу фильтров в целом.
node
Основа всей системы Drupal — node, что на русский переведено как «материал». Все страницы, записи, и вообще почти все содержимое сайта является материалами. Они могут быть разных типов, имея разные свойства.
system
Я так понимаю, основная часть админки — заслуга этого модуля.
user
Вторая ключевая часть это пользователи, роли, права, и так далее.

Встроенные модули

К этой группе я отношу модули, поставляемые вместе с Друпалом, и вероятно, написанные его основной командой разработчиков, но свободно включаемые и выключаемые.
В ней я разделю на три подгруппы: обязательные (без которых трудно представить нормальный сайт), испытанные (которые я где-либо использовал), и неиспытанные (о которых я знаю не более чем их описание в общем списке модулей)

Обязательные встроенные модули

contact
Простая контактная форма сайта тем и хороша, что она простая. В админке добавляются одна или несколько категорий, каждая со своими email'ами получателей. И потом либо посетитель выбирает категорию и пишет сообщение, либо категория сразу по умолчанию выбрана. Модуль не обязателен, но включается почти всегда.
locale
Если бы нашим родным языком был английский, и сайт мы делали бы только для англоговорящих, этот модуль не потребовался бы. Но увы, обычно нужны сайты на русском, и потому без перевода интерфейса никак.
menu
Трудно представить себе нынче сайт без меню. Так или иначе, навигация по сайту всегда нужна, если только он не состоит из пары страничек. В этом и есть основная функция данного модуля — создание меню. Любое созданное меню затем оказывается в списке блоков, где его можно поставить куда надо.
path
Если нужны красивые URL'ы, без синонимов не обойтись. Друпал устроен так, что в нем внутри всегда работают базовые пути (например, node/1), но в ссылках и в URL можно увидеть синоним (указав, например, что node/1 имеет синоним about). По умолчанию, синонимы создаются лишь вручную (в админке или в редактировании материалов), но обычно ставится модуль pathauto, и этот процесс автоматизируется.

Испытанные встроенные модули

blog
Добавляет тип материала «Запись в блоге». и по странице на каждого пользователя со списком его записей. Простая, но вполне пригодная система блогов одной легкой установкой галочки.
blogapi
Дополнение к предыдущему. С ним появляется api для добавления записей в блоги из всяких клиентских программ, не заходя на сайт.
book
Представьте, что каждый материал это страница книги. Что от этого получается? Во-первых, иерархическая и порядковая организация страниц (разделы, главы, страницы, и у всего порядок). Во-вторых, оглавление. В-третьих, навигация «вперед-назад» (а так же, «вверх-вниз» по иерархии). И все это благодаря одному этому модулю.
comment
Какой же блог или форум без комментариев? Этот модуль позволяет разрешить комментировать определенные типы материалов и предоставляет основной модераторский функционал. Хотя, можно и на уровне конкретного материала разрешить или запретить комментарии.
dblog
Сохраняет ошибки и всякие иные события в базу, и дает возможность просмотреть их. Обычно включен всегда, но если сайт работает хорошо и устойчиво, и не нужны лишние нагрузки на базу, то можно выключить.
help
Встроенная краткая справка к страницам админки. Не помню, чтоб специально включал или выключал его, а по умолчанию включен. Не особо важен, но и не мешает.
openid
Позволяет привязать учетную запись на сайте к openid-аккаунту, и в дальнейшем входить на сайт по openid. Увы, не отменяет необходимость регистрации.
php
Фильтр для вставки куда-либо php-кода, обычно в материал или блок.
poll
Простенькие опросы, с выводом блока последнего опроса. Вопрос, варианты ответов, подсчет голосов — ничего сложного. Но для РусАппа пришлось его пропатчить, дабы разрешить голосовать посетителям с одинаковыми ip-адресами. Такое решение открывает больше возможностей к накрутке голосов, но в данном случае это вроде бы не столь страшно.
profile
Позволяет составить анкету для пользователя, добавив нужные поля для ввода при регистрации (или после нее). Поля не ограничены лишь текстовыми, набор весьма широк, и его вполне хватит на любой нужный профиль пользователя.
search
Индексация содержимого сайта и поиск по нему. Увы, без морфологии языков, чисто по совпадению слов. Для нормальной индексации нужно настроить крон. Не позволяет ограничить индексируемое по типам материалов, для этого пришлось поставить search_config. В целом модуль хороший, но для полноценного поиска лучше прикрутить гугль или еще что в этом роде.
taxonomy
Таксономия — чуть ли не самое сложное понятие в Друпале. Особенно, когда с ним сталкиваешься в первый раз. Попробую описать по простому, на своем примере. Наиболее общее применение таксономии — категоризация материалов. Создается словарь, в него добавляются несколько терминов (категорий), а затем в материалах выбирается один (или несколько) из них. И потом по термину можно получить все материалы, где он встречается. Частное применение — поле с выбором из нескольких вариантов, но причем варианты могут расширяться. Вот например пол вряд ли имеет смысл делать словарем таксономии, тут всегда два варианта: мужской и женский. А вот страны или города имеет смысл, так как их число не определено.
И еще один пример, наиболее понятный для современного интернета — теги. Да, это тоже отдельный словарь таксономии, пополняемый прямо из редактирования материалов, стоит лишь ввести новый тег.
И все же, что стоит, а что не стоит делать таксономией, это отдельная и большая тема. Это очень удобное средство, но и куда попало его совать не следует. Вот сам это ощутил, когда потребовались не только термины, но и дополнительные данные к ним. Проблему частично решил модуль term_fields, только там все равно нет такого простора, как с полями для материалов. Если термин перестает быть самодостаточным, и требует кучу полей для своего описания, стоит задуматься, не сделать ли его материалом. А в подчиненных материалах добавить ссылку на этот.
translation
Средство для многоязычных сайтов, позволяющее переводить содержимое. Материалы получают связи между собой, типа такого, что Материал2 является русским переводом Материала1, и наоборот, Материал1 это английский перевод Материала2. Что позволяет при запросе к любому из них выбрать нужный по текущему языку. К сожалению, модуль не обеспечивает перевод пунктов меню и некоторых других вещей, потому приходилось ставить еще i18n. (В Друпале 7 обещают этот недочет восполнить)
update
Проверка наличия новых версий ядра и модулей, с уведомлением об этом администратора. Полезно для тех, кому на первом месте безопасность сайта (так как наиболее часто новые версии выходят при нахождении и исправлении уязвимостей), но на большинстве хостингов весьма замедляет работу админки. Проблема в том, что хостинг часто запрещает обращения со своего сервера куда-то во внешний интернет, и в результате при запросе к обновлениям этот модуль висит, пока не наступит таймаут запроса.
upload
Позволяет прикреплять к материалам файлы. Обычно его успешно замещает filefield, как более настраиваемый, но для простоты и этот бывает полезен. Ближайший аналог — аттачи к постам на форумах, так что и тут его стоит включать в сходных ситуациях.

Неиспытанные встроенные модули

Из этого я сам ничем не пользовался еще, потому просто дам краткие описания.

aggregator
Из названия вполне ясно, с ним можно вывести на сайте данные из чужих RSS, Atom, и подобных новостных лент.
color
Если я верно понял, можно в рамках одной темы задать несколько вариантов цветов, и дать пользователям возможность их менять.
forum
Обычный форум, с использованием модулей таксономии (для разделов) и комментариев. Я видел лишь на других сайтах, внешне не особо понравился. Но полагаю, что все вполне темизуемо.
ping
Просто цитирую стандартное описание: «Оповещает другие сайты при обновлении вашего сайта.» Как именно он это делает, не знаю.
statistics
«Журнал статистики доступа к вашему сайту.»
syslog
«Регистрирует и записывает события в системный журнал.»
throttle
Вот это по идее интересная штука. Автоматически отключает некоторые модули при большой нагрузке на сайт.
tracker
Полагаю, это сродни подписке на тему/запись. Уведомляет пользователей об изменениях.
trigger
Не приходилось использовать, но тоже интересная штука. С ним можно вешать некоторые действия на некоторые события. Какие именно? Ну например, опубликовать материал в такое-то время. Отправить почту при регистрации пользователя. И иные подобные вещи.

Сторонние модули

Почти все эти модули спокойно находятся на drupal.org, и переводы к ним на drupaler.ru. Сторонними они являются лишь потому, что не входят в стандартную комплектацию.

Обязательные сторонние модули

Без этих модулей для меня уже почти немыслим ни один друпаловский сайт. Хотя данный сайт пока обходится без cck и views, на нем просто нет разнообразия контента, а для блога и страниц достаточно стандартных модулей.
И я не один так думаю. Не знаю, как про views, но cck и pathauto точно станут встроенными в седьмой версии Друпала.

cck
Полное название — Content Construction Kit. Да, это «Набор конструирования содержания». Модуль node хоть и позволяет создавать различные типы материалов, реально они отличаются разве что названием да парой флажков. А cck привносит в тип материала любые поля, каких угодно типов, редактируемые какими угодно виджетами. Построен он тоже по принципу модульности, сам содержит базовую часть для всего этого и некоторые основные типы данных и виджеты. А другие модули могут добавлять сюда и типы данных и виджеты. Ниже в списке есть такие модули.
В результате, в рамках модели данных сайта, тип материала превращается в класс (с набором свойств), а сами материалы в объекты-экземпляры этого класса. Попутно получаем так же форму редактирования материала, со всеми соответствующими полям виджетами.
И не удивительно, что он будет встроен в составе седьмой версии.
pathauto
Несмотря на то, что стандартный модуль path позволяет давать материалам (и не только) красивые пути (URL, так же оно называется синонимами, но здесь буду называть «пути»), это надо делать вручную. Что хорошо для уникальных материалов, как например эта страница, но плохо для типичных и многочисленных, например записи в блоге. Не стоит заставлять пользователя придумывать и вводить пути на сотни материалов, но красивыми их сделать нужно. А поскольку обычно все такие пути имеют некоторую общую структуру, то легко написать шаблон для них, и по нему автоматически генерировать. Что, собственно, и делает pathauto. В его настройках пишутся шаблоны по типам материалов, словарям, и для профилей пользователей, а далее все пути создаются автоматически. Данные для шаблонов берутся через модуль token, о нем смотрите ниже.
Приведу пример: записи в блог на моем сайте имеют шаблон «blogs/[user-name]/[nid]». В него вставляются имя автора и уникальный id материала (ведь пути должны соблюдать требование уникальности).
token
Требуется для pathauto и некоторых других модулей. Сам по себе это скорее посредник, и довольно интересный. Токен — это вот та самая строка в квадратных скобках, что была в примере шаблона. Модуль token обрабатывает шаблоны (и ему неважно, кто их дает), собрав от других модулей все, что они могут предоставить. Во встроенных нет его поддержки, и потому токены [user-name] и [nid] он сам же и предоставляет. А вот например cck дает токены для содержимого всех созданных в нем полей, чем мы и можем пользоваться в шаблонах.
transliteration
К сожалению, русский язык не родной для компьютеров. Правильнее сказать, они создавались без учета русского языка. Равно как и без учета всех остальных, кроме английского. В итоге мы наблюдаем случаи, когда файловые системы серверов не очень любят русские имена файлов, браузеры не очень любят русские символы в урлах, и так далее. Да и лично мне привычнее и спокойнее, когда все адреса не содержат лишних символов. Данный модуль автоматически переводит в транслит все имена закачиваемых файлов, а так же данные, вставляемые в шаблонах pathauto.
views
Этот модуль, в сумме с cck, составляет половину силы Друпала. На мой взгляд, конечно. Официально Views переведено как «Представления», но я про себя продолжаю называть »вид», как впервые встретил (да и короче так).
Итак, если cck — конструктор типов данных, то views — конструктор запросов к данным. Надо получить и вывести все новости? Надо выбрать самых активных пользователей? Все что можно получить из имеющихся данных, по любым фильтрам, с любой сортировкой, с указанием связей с другими данными, и вывести все таблицей, списком, без какой-либо структуры, или по своему указанному шаблону — все это можно с помощью Views. Так же пользователю можно предоставить управление постраничной навигацией, фильтрами, сортировкой. Кажется все это весьма сумбурным, но по интерфейсу все весьма просто.
Кроме того, возможность вывести полученное как блок (вставляемый затем куда угодно) или как страницу, и возможность работать полностью на ajax (обновление данных без перезагрузки всей страницы).

Рекомендуемые сторонние модули

auto_nodetitle
Название материала — одно из самых неотъемлемых его свойств. Даже содержание (тело) можно отключить, а название нет. Но с этим модулем можно генерировать их, на основе шаблонов от token. Можно полностью скрыть поле названия от пользователя, а можно и генерировать, только если пользователь оставил его пустым. Как видно, совсем без названия никак не обойтись, можно лишь поручить его заполнение автоматике.
blocks404
Не знаю, почему так устроено (не вникал), но по умолчания страница ошибки 404 выводится без каких-либо блоков вообще. Данный модуль очень мелкий, вроде бы менее одного килобайта, но исправляет этот момент, и 404 перестает выделяться из общего вида сайта.
captcha
Очень распространенное нынче явление, капча при отправке форм. Хоть она и не спасает полностью, но все же увеличивает порог для роботов-спамеров. Модуль предоставляет общий механизм капчи: привязка к определенным формам, проверка. Конкретные виды капчи предоставляют уже модули второго уровня. Стандартно прилагаются три вида: math, text, image. У себя я поставил только math на комментарии.
contemplate
Изначально я ставил этот модуль, чтобы писать шаблоны для типов материалов. В первую очередь он нужен для cck, ведь это его поля может понадобиться как-то хитро вывести, как не задашь в настройках поля. Но на РусАппе я решил попробовать стандартные файлы node-имятипа.tpl.php в папке темы, и мне этого хватило, все поля cck там так же доступны.. Потому включать модуль не было необходимости. Отличия же contemplate в том, что шаблоны могут меняться прямо в админке, без необходимости лезть к файлам темы.
ctm
По умолчанию, материал можно привязать (прямо при его редактировании) к любому пункту любого меню. С данным модулем на каждый тип материала можно указать, к каким меню его можно привязать. Если не пометить ни одного, то из редактирования вообще пропадет выбор меню. Удобно, если надо, чтобы не сунули случайно новость в меню или чтобы статьи могли сунуть только в правое меню. Примеры условны, конечно.
date
Довольно большой модуль, целиком направленный на работу с датами и временем. Состоит из нескольких частей, которые можно включать по отдельности.
1. API по работе с датами: периоды, сложение, форматирование с учетом локали, и прочее.
2. Эмуляция функций php5 для случая работы на php4.
3. Тип данных Date для cck (с виджетом ручного ввода).
4. Виджет popup-календаря (всплывающего) для cck.
5. Управление форматами дат.
devel
Модуль чисто для разработчиков сайта. Довольно много чего умеет, я со всем и не разбирался. Основное, что я оценил, это режим, в котором по клику на любом месте сайта можно узнать, в каких файлах и какими функциями оно срендерено, и какими функциями может быть изменено. Но это лишь малая часть модуля.
filefield
Тип данных File для cck, и этим все сказано. Можно настроить допустимые расширения закачиваемого файла, размеры, и папку, где они будут храниться.
imageapi
Есть два основных способа обработки картинок и работы с ними: GD2 и ImageMagick. Не буду заострять внимание на их особенностях, но этот модуль позволяет выбрать, с помощью чего будет работать друпал. (подменяя внутренние функции работы с графикой на свои)
imagecache
Если нужно автоматически провести над картинками некоторые операции перед их выводом, да еще чтобы эти операции проводились лишь один раз, то этот модуль вам пригодится. В нем можно настроить несколько пресетов, каждый пресет это набор операций над картинками - масштабирование, обрезание, разворот, и прочее. И далее, если вывод картинки привязан к определенному пресету, то она будет обработана и сохранена в кеше. В случае изменения исходной картинки, она будет обработана заново.
Обчно применяется для получения превью картинок, но операции вовсе не ограничены уменьшением.
imagefield
Виджет к filefield, добавляющий еще ограничения на ширину-высоту картинок и показывающий их превью.
imagefield_crop
Еще один виджет, расширяющий возиожности imagefield. Выглядит офигительно. :) А по сути, это ручное кадрирование. Закачиваешь большую картинку, и таскаешь по ней прямоугольник, выбирая участок под нужный кадр. По мере таскания сбоку обновляется превью. Оригинал картинки тоже сохраняется, и можно изменить кадр, не закачивая ее заново. Очень полезно для фотогалерей, где критична область картинки для превью.
imce
Файловый менеджер, заточенный под картинки. Хотя оперировать можно любыми файлами. Обычно вызывается по кнопке вставки картинки из текстовых редакторов.
imce_wysiwyg
Модуль-интегратор, добавляющий в wysiwyg кнопку вызова imce.
jquery_update
JQuery встроен в друпал, но обновляется чаще. А так как обычно мы следуем принципу "ничего не трогать в ядре", то на помощь приходит этот модуль. Он всегда содержит последнюю версию JQuery, и заставляет друпал брать ее вместо встроенной версии.
menu_block
Стандартные блоки меню включают только всё меню целиком. А часто бывает нужно только первый уровень, или только второй (зависящий от активного пункта в первом уровне), или еще какой кусок меню. Данный модуль позволяет создать такие блоки.
На примере РусАппа: есть два меню, левое и правое, и 4 блока. 1-й уровень левого (выводится в левой колонке), 1-й уровень правого (в правой колонке), и 2-е уровни обоих меню (в центре). Так как не может обычно активным пункт сразу и там и там, то в центре видим лишь один из двух блоков.
site_map
Создает страницу карты сайта на основе меню, подшивок book, таксономии, словом, всего того, что обычно определяет структуру сайта. В большинстве случаев вполне достаточно этого.
wysiwyg
Модуль для прикручивания разных редакторов, неважно, визуальных или нет. Раньше для каждого редактора был свой модуль интеграции, а теперь вот собрали все вместе в этакое Wysiwyg API. Поддерживается большое число редакторов, а сам я имел дело только с TinyMCE (на всех рабочих сайтах) и BUEditor (на своем сайте).

Специфичные сторонние модули

ad
conditional_styles
content_access
content_taxonomy
login_security
node_breadcrumb
r4032login
search_config
term_fields
typograf
webform
webformblock