Создание простого модуля с использованием Field API в Drupal 7
Если Вас заинтересует текущая тема в полном изложениии, то Вы всегда можете её увидеть на этой странице официального сайта Drupal.
Здесь Вашему вниманию пример реализации модуля с использованием Field API в Drupal 7.
Самый простой модуль, который может показать нам возможности Field API должен состоять из 3 файлов:

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

Когда мы выберем Display fields, то здесь нам будут предлагать указать формат нашего поля. Формат поля может бать как один, так и несколько.

Приступим к самому модулю.
Файл textf.info(в нашем примере все файлы будут называться textf ) должен содержать такие строки:
<?php
//имя нашего модуля
name = Text field
//Объяснение нашего модуля
description = A Simple Text Field for Drupal 7
//В каком разделе будет находиться наш модуль.
package = public-action fields
//версия Drupal с которой работает наш модуль
core = 7.x
//название файла, с которым работает модуль
files[] = textf.module
// еще один файл, который нам необходим
files[] = textf.install
?>Обратите внимание на строки
<?php
files[] = textf.module
files[] = textf.install
?>
В Drupal 7 при создания любого модуля, всегда желательно в каждом .info файле указывать те файлы, с которыми работает модуль.
Дальше приступим к файлу textf.install. Он отвечает у нас за создания места в БД для нашего поля.
<?php
// hook_field_schema
function textf_field_schema($field) {
//возращаем массив которые содержит
return array(
//колонку
'columns' => array(
// в колонке находиться поле под названием textf
'textf' => array(
// и поле имеет тип text
'type' => 'text',
),
),
);
}
?>Только что мы создали место в БД, именно в textf будет помещаться текст из нашего поля. Но для настроим это поле.
Приступим к файлу textf.module.
<?php
// хук для отображения типа поля
// hook_field_info
function textf_field_info() {
// возвращаем массив
return array(
// который называется textf
'textf' => array(
// имя нашего типа будет 'Te(x/s)t field'
'label' => t('Te(x/s)t field'),
// объяснение к нашему типу
'description' => t('sample text field'),
// стандартный виджет, который будет отображаться сразу
// после того, как мы выберем тип поля
'default_widget' => 'textf_widget',
// стандартный формат, который будет
// отображаться сразу после того, как мы выберем тип поля
'default_formatter' => 'textf_formatter',
),
);
}
//хук для отображеня и настройки виджета
// hook_field_widget_info
function textf_field_widget_info() {
//возращаем масив
return array(
//с именем textf
'textf' => array(
// называться наш виджет будет textf label
'label' => t('textf label'),
// работать наш виджет будет с полем в БД под названием textf
'field types' => array('textf'),
),
);
}
// хук для отображения формата для нашего поля
// hook_field_formatter_info
function textf_field_formatter_info() {
// возвращаем массив
return array(
//название нашего формата для кода
'textf_formatter' => array(
// отображаемое название формата
'label' => t('Simple text field formatter'),
// поле в БД, с которым будет работать наш формат
'field types' => array('textf'),
),
);
}
?>Дальше приступим к присваиванию параметров виджета. Проще говоря – мы создаем поле для ввода нашего поля.
<?php
// hook_field_widget_form
function textf_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
// задаем в параметры switch, что будем работать с
// типами виджетов которые находиться в модуле.
switch ($instance['widget']['type']) {
// если параметр case есть 'textf'
case 'textf':
// тогда присваиваем элементу textf массив
// с следующими значениями
$element['textf'] = array(
// тип элемента 'textfield',
'#type' => 'textfield',
// заголовок заданный в настройках элемента
'#title' => $element['#title'],
// объяснение виджета даны в настройках элемента
'#description' => $element['#description'],
// в нашем виджете будет стандартное значение textfield
'#default_value' => t('textfield'),
// обязательный ли элемент будет задаваться в настройках самого элемента
'#required' => $element['#required'],
// место нахождение элемента –
// если оно задано тогда
// использовать значение, если же нет, тогда значение равно 0
'#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
// строка, которая нам пригодится для вывода
'#delta' => $delta,
);
break;
}
return $element; // возвращаем $element;
}
?>Дальше задаем параметры отображение нашего поля, так званый формат нашего поля.
<?php
// hook_field_formatter_view
function textf_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
// создаем массив в $element, (так надо делать всегда)
$element = array();
// задаем в параметры switch, что будем работать с
// типами форматирования которые находиться в модуле.
switch ($display['type']) {
// если тип форматирование 'textf_formatter', тогда
case 'textf_formatter':
// выводим $items как $delta => $item
foreach ($items as $delta => $item) {
// если у нас есть $item в массиве которой есть значение 'textf', тогда
if ($item['textf']) {
// помещаем эту переменную в $formattedText
$formattedText = $item['textf'];
// и выводим ее, в тегах <h1><b>,
// думаю Вы уже поняли какой текст будет выводится.
$element[$delta]['#markup'] = '<h1><b>' . $formattedText .'</b></h1>';
// в дaнном случае вывод переменной всегда должен лежать в $element[$delta],
// и дальше проще говоря мы используем тип вывода, это ['#markup']
}
}
break;
}
// возвращаем $element
return $element;
}
?>И последний шаг: надо показать Field API что ему делать, если же текста нет. Делается это так:
<?php
// hook_field_is_empty
function textf_field_is_empty($item, $field) {
// если у нас в $item['textf'] ничего нет,
if (empty($item['textf'])) {
// тогда возвращаем 1, то есть говорим Drupal что все хорошо..)
return true;
// и если же в поле ничего нет, ничего не выведется.
}
}
?>Только что мы разобрали пример комплементарного модуля Field API в Drupal 7.
Вообщем Field API является новшеством в Drupal 7. Для простых проектов вполне может хватить уже готовых модулей, например поле для Email или еще что-то подобное. Но если нужны поля, которых еще не существует в проекте - вспоминаем о Field API.


