Создание простого модуля с использованием Field API в Drupal 7

Версия Друпала:
7.x

Если Вас заинтересует текущая тема в полном изложениии, то Вы всегда можете её увидеть на этой странице официального сайта 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.