Drupal 7 свои кастомные поля (custom fields) c использованием Field API

Submitted by admin on Mon, 05/08/2023 - 10:17

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

Цель создания - иметь друпал поля с возможность записывать несколько отдельных данных в одном поле (compound fields).

1. Расскажем Друпалу о нашем поле

  1. hook_field_info()

    Объявляет новый тип поля, указывает какой виджет (форма для редактирования филда) и форматер (функция отображения поля) будут использованы.
    Указываемые строки виджета и форматера по-умолчанию - не являются функциями; это идентификаторы определенных прописанных форматеров и виджетов, которые будут объявлены позднее. Можно объявить более одного типа филдов.

  2. hook_field_validate()

    Обязательный хук! Фунция валидации данных, введенных в форму редактирования создаваемого поля.
    Без него запись данных в таблицу БД не будет производится, хотя внешне все будет работать - форматеры, виджеты и т.п. Если предполагается ввод данных сторонними пользователями - надо хорошенько валидировать данные перед записью в БД.

  3. hook_field_is_empty()

    Помогает друпалу определиться является ли поле пустым
    Даже если там есть какие-то дефолтные данные).

  4. hook_field_schema()

    Возвращает часть схемы для базы данных
    Стандартные колонки для филдов добавляются друпалом, поэтому нужно только указать нужные филду колонки для хранения информации. Функция размещается в install файле! Можно объявляеть схемы для разных типов филдов, в зависимости от имени филда, переданного в функцию в первом аргументе ($field).

2. Создание виджета (формы редактирования) своего поля

  1. hook_field_widget_info()

    Говорит Друпалу о наличии определенного виджета Этого будет достаточно, чтобы увидеть выбор виджета в интерфейсе редактора поле друпала.

  2. hook_field_widget_form()

    Создает формы для редактирования вашего кастомного поля. Используется Drupal Form API
    Если объявляется сразу несколько типов филдов в одном модуле, надо проверять запрашиваемый сейчас тип в переменной $instance['widget']['type'].

3. Форматер поля (вывод данных при просмотре ноды)

  1. hook_field_formatter_info()

    Говорит Друпалу о наличии определенного форматера

  2. hook_field_formatter_view()

    Код отрисовки данных для посетителя. Возвращает рендерный-массив, а не html код.

4. Дополнительные хуки

Они не являются обязательными, но окажутся довольно полезными.

  1. hook_field_presave()

    Используется чтобы проставить поля по умолчанию, если пользователь их не проставил.Что позволит избежать ошибок с БД запросами при попытке сохранения, если 'not null' установлен в какой-то колонке.

  2. hook_form_field_ui_field_edit_form_alter()

    This is hook_form_FORM_ID_alter(). This is a really useful hook for manipulating existing field forms, and adding default values that have to be calculated.