Данное API позволит работать с полями. Оно позволяет создавать новые типы полей. В большинстве случаев встроенных типов полей вполне хватает для пользовательских нужд, но при необходимости можно легко добавить свои.
Работу с Field API будем осуществлять в новом модуле. Назовём его test_fields. Используем ещё одну возможность модулей – зависимость одного модуля от другого. Например, для работы одного модуля необходим другой модуль. Сделаем наш второй модуль зависимым от первого. Для этого добавим в info файл строку с dependencies.
name = Модуль для работы с полями.
description = В этом модуле я буду использовать Field API.
package = test_modules
core=7.x
version = "7.x-1.x-dev"
project = "test_fields"
datestamp = "1332419400"
dependencies[] = test_module
Проверяем модуль в списке модулей.
Как видите – модуль для работы с полями зависит от тестового модуля. Оба модуля находятся в одном пакете и сгруппированы.
Давайте создадим поле, которое позволит выбрать пол автора ноды. То есть при создании ноды будет переключатель М/Ж.
Создавать модуль вы уже умеете. Добавим к модулю ещё один файл – install. Этот файл запустится только при первой установке модуля. Его имя также должно совпадать с именем модуля и иметь расширение install. Добавим в него следующую функцию.
Имя файла test_fields.install
function test_fields_field_schema($field) {
'type' => 'int',
),
),
);
}
Данный код вызовет hook_field_schema, который зарезервирует место в БД для поля с именем textf. К этому имени мы будем обращаться в следующих функциях. Это поле будет типа integer.
Новое поле должно отображаться в конфигурировании полей ноды.
В добавлении нового поля должно появиться наше новое поле. Вначале определим тип поля. Поместим в файл test_fuields.module следующую функцию.
function test_fields_field_info() {
'label' => t('Выбор пола'),
'description' => t('Описание поля'),
'default_widget' => 'textf_widget',
'default_formatter' => 'textf_formatter',
),
);
}
Теперь можно будет добавить к материалу поле типа «Выбор пола». Значение элемента default_widget , равное textf_widget говорит о том, что тип виджета будет называться textf. С ним мы будем работать чуть позже. Этот виджет будет отвечать за то, какого типа будет поле в форме добавления ноды.
Теперь нужно дать описание полю, чтобы пользователь понимал поле какого типа он добавляет к материалу – поле ввода, текстовую область, выпадающий список и т.д. Можно вписать сюда всё что угодно.
function test_fields_field_widget_info() {
'label' => t('Переключатель'),
),
);
}
Назовём наше поле переключателем и в поле field types укажем наше имя - textf, с которого мы начинали написание модуля.
Теперь доступно новое поле для ноды.
Также для поля нужен формат вывода.
Для этого используем hook_field_formatter_info. Пусть Drupal будет выводить М/Ж или Мужчина/Женщина. Напишем следующую функцию.
function test_fields_field_formatter_info() {
'label' => t('Кратко'),
),
'label' => t('Полно'),
),
);
}
textf_formatter – это наш дефолтный формат ввода, который мы указали в функции test_fields_field_info.
Теперь в настройках отображения полей мы можем выбрать, как будет выводиться значение поля.
Далее определимся – как будет выглядеть элемент формы на странице добавления ноды. Пусть это будет два радиобутона. Для этого используем hook_field_widget_form и вспомним о создании форм в Drupal. Напишем следующую функцию.
function test_fields_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
switch ($instance['widget']['type']) {
case 'textf':
'#type' => 'radios',
'#title' => $element['#title'],
'#description' => $element['#description'],
'#required' => $element['#required'],
'#delta' => $delta,
);
break;
}
return $element;
}
Далее создадим два формата вывода – полный и краткий, о которых мы говорили ранее. Используем hook_field_formatter_view.
function test_fields_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
switch ($display['type']) {
case 'textf_formatter':
foreach ($items as $delta => $item) {
if ($item['textf']) {
$val = $item['textf'];
if($val==1){
$element[$delta]['#markup'] = 'М';
}elseif($val==2){
$element[$delta]['#markup'] = 'Ж';
}
}
}
break;
case 'textf_formatter_2':
foreach ($items as $delta => $item) {
if ($item['textf']) {
$val = $item['textf'];
if($val==1){
$element[$delta]['#markup'] = 'Мужчина';
}elseif($val==2){
$element[$delta]['#markup'] = 'Женщина';
}
}
}
break;
}
return $element;
}
Теперь можно проверить, как это всё работает, открыв ноду.
И завершающий шаг – это вариант, когда поле не заполнено. Для этого нужно использовать hook_field_is_empty, который вернёт true.
function test_fields_field_is_empty($item, $field) {
return true;
}
}
Этого вполне достаточно для создания собственных полей. Вы можете поэкспериментировать, создавая более сложные поля. Чтение документации позволит вам легко расширить/модифицировать данный код.
 
        


