ryg

Программирование полей в модулях field_create_field

В свое время я достаточно долго мучался с созданием и привязке полей к сущностям на Drupal 7.

В принципе задача не представляет большой сложности. Для этого используются две простые функции :

field_create_field($field);
field_create_instance($instance);

Сначала создаётся поле, а затем оно должно быть привязано к необходимой вам сущности. В качестве параметров задаются массивы, определяющие данное поле ($field) и его привязку ($instance). В API Drupal правильное содержимое массива описано недостаточно подробно. Достаточно большую сложность у меня вызвали поля с привязкой на термины таксономии в node.

Рассмотрим правильное заполнение этих массивов. Пример кода:


$field = array(
  'field_name' => 'имя поля',                      // имя поля таксономии
  'type' => 'taxonomy_term_reference', // тип поля - ссылка на словарь таксономии
  'active' => '1',
  'locked' => '0',
  'cardinality' => '1',

  'translatable' => '0',
  'settings' => array( 
     'allowed_values' => array( 0 => 
        array( 'vocabulary' => 'имя словаря таксономии', // без него не будет правильной привязки
        'parent' => '0', ), ),), ); 

field_create_field($field); // создаем поле 

$instance = array( // массив привязк поля к сущности 
  'description' => 'описание поля',
  'field_name' =>  'имя поля',              
  'entity_type' => 'node',                // тип сущности
  'bundle' => 'node_type',                // например article или page  
  'default_value' => NULL,

  'label' => 'Заголовок',                 // заголовок поля
  'required' => FALSE, 
  'widget' => array(                      // используемый виджет
     'type' => 'options_select', 
     'settings' => array(), 
     'weight' => 11, ), 
   'settings' => array( 
       'field_injection' => 1, 
       'referenceable_types' => array(
           'tid' => 'имя словаря таксономии',), // еще одна привязка. Для других полей ссылок, кроме таксономии достаточно данной привязки. 
   'user_register_form' => FALSE, ), 
   'display' => array( // настройка отображения поля в node
     'default' => array(
        'label' => 'above', 
        'type' => 'taxonomy_term_reference_link', 
        'settings' => array(), 'weight' => 3,),
   'teaser' => array( 
       'type' => 'hidden', 
       'label' => 'above', 
       'settings' => array(), 
       'weight' => 0,),),); 

field_create_instance($instance);
Это все поля, которые необходимо заполнить для создания поля, указывающего на термин таксономии в ноде с помощью модуля.
Но самое главное, что заполнить данное поле оказалось очень просто. Для этого существует модуль Field Inspector

Устанавливаете данный модуль на своем сайте и создаете необходимое вам поле с помощью пользовательского интерфейса. Настраиваете его видимость и ссылки. После этого переходите по адресу:

/admin/config/development/field-inspector

И с помощью данного модуля получаете необходимый Вам массив! Никакой возни с подбором параметров не возникает.