Этот документ является полным справочник к Forms API Друпала. Если вас интересует пошаговая интрукция о том, как создавать собственные формы, вам лучше начать с быстрого введения в Forms API.
Это пример иллюстрирует как ограничивать доступ к нодам на основе некоторых критериев, связанных с пользователем.
В этом примере, модуль будет устанавливать флаг 'private' для ноды. Если флаг установлен, то только пользователи с правом 'view private content' будут видеть содержание ноды, а пользователи с 'edit private content' смогут изменять (но не удалять) ноду.
Кроме того автор ноды всегда сможет просматривать, изменять и удалять её.
Определение базы:
CREATE TABLE node_access_example (
nid int(10) UNSIGNED NOT NULL DEFAULT '0' PRIMARY KEY,
private int,
KEY `node_example_nid` (nid)
)
Созданный этим модулем тип нод позволяет задавать для этих нод дополнительные поля цвет ('color') и количество ('quantity'); такие ноды можно использовать как простейшую систему учета ресурсов. Чтобы сохранять эту дополнительную информацию, нужна вспомогательная таблица базы данных.
Схема таблицы БД:
CREATE TABLE node_example (
vid int(10) UNSIGNED NOT NULL DEFAULT '0',
nid int(10) UNSIGNED NOT NULL DEFAULT '0',
color varchar(255) NOT NULL DEFAULT '',
quantity int(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (vid, nid),
KEY `node_example_nid` (nid)
)
Этот пример показывает, как модуль может быть использован для определения фильтра содержимого отправленного пользователем, который будет выполнен до отправки данных в браузер.
Чтобы показать все возможности системы фильтров, мы определим два фильтра в данном модуле. Один будет заменять строку 'foo' на строку, определённую администратором. Другой найдёт пользовательский XML-тэг <time /> и заменит его на текущее время. Читать далее »
Блок может меняться в зависимости от роли пользователя, просматривающего страницу, которой принадлежит блок. Это значение по умолчанию, которое используется, если для блока не указано иное.
Содержимое блока может зависить от того, какой пользователь просматривает страницу. Эта опция позволяет сэкономить вычислительные ресурсы на сайтах с большим количеством пользователей, но при этом она должна использоваться только если опция BLOCK_CACHE_PER_ROLE не предоставляет достаточных возможностей.
Блок не должен кэшироваться. Эта настройку следует применять для простых блоков. В основном для тех, которые не выполняют ни одного запроса к базе данных, или если запрос кэша из базы данных будет более ресурсоёмким, чем генерация контента блока. А также для блоков, которые часто меняются.
Система доступа к нодам определяет кто и что может сделать с определёнными нодами.
Для определении прав доступа для ноды используется node_access(). Эта функция сперва проверяет, имеет ли пользователь разрешение 'administer nodes'. Такие пользователи имеют неограниченный доступ ко всем нодам. Затем вызывается хук hook_access() в модуле этой ноды (по умолчанию — node_content_access()), и возвращаемое значение, TRUE или FALSE, разрешит или запретит доступ. Например, это позволяет модулю blog всегда предоставлять доступ самому автору блога, а модулю book — всегда запрещать редактирование PHP страниц.
Если «нодовый» модуль не вмешивается в процесс ограничения доступа (возвращает NULL в hook_access()), тогда для этого используется таблица 'node_access'. Все такие модули опрашиваются при помощи хукаhook_node_grants() и в результате собирается список идентификаторов разрешений пользователя (grant IDs). Этот список сравнивается с таблицей по соответствию grant ID. Если в таблице присутствует запись с идентифкатором ноды или идентификатор ноды в таблице равен 0, то доступ к ноде (или нодам) разрешается. Отметьте, что эта таблица, по существу, является списком разрешений; любой совпадающий строки достаточно, чтобы разрешить доступ к ноде. Читать далее »
Поисковый интерфейс Друпал управляет механизмом глобального поиска по сайту.
Модули можно включать в систему поиска разных типов данных. Большую часть работы в системе поиска выполняет search.module, поэтому он должен быть разрешен для всех функций в работе поиска.
Есть три способа взаимодействия с системой поиска:
Для поиска конкретно в нодах реализуется nodeapi('update index') и nodeapi('search result'). Однако, необходимо учесть, что поисковая система уже индексирует весь видимый вывод ноды — все то, что отображается с помощью hook_view() и hook_nodeapi('view'). Обычно этого достаточно. Этот механизм стоит использовать лишь если необходима индексация дополнительных скрытых данных.
Реализация hook_search(). На странице /search будет создана вкладка поиска для разрабатываемого модуля, содержащая простую форму поиска по ключевому слову. Опционально можно реализоватьhook_search_item() для настройки отображения результатов.
Реализация hook_update_index(). Это позволит использовать в модуле друпаловский механизм индексации HTML для эффективного полнотекстового поиска.
Если модуль должен предоставлять более комплексные возможности поиска, необходимо реализовать их самостоятельно без hook_search(). В этом случае нужно определить его, как локальную задачу (вкладку) на странице /search (например, /search/mymodule), чтобы пользователи легко смогли его найти. Читать далее »