Добавить поле в hook_node_info ();

9

Можно ли добавить поля к типу узла, объявленному с помощью hook_node_info? Нужно ли добавлять поля отдельно? Если так, какой крюк я бы использовал для этого?

Gaelan
источник

Ответы:

8

Вы должны прикрепить поля отдельно, они не могут быть добавлены через hook_node_info(). Обычно вы делаете это в hook_install()функции из файла .install вашего модуля.

Хороший простой пример из ядра Drupal находится в установочном файле модуля блога:

function blog_install() {
  // Ensure the blog node type is available.
  node_types_rebuild();
  $types = node_type_get_types();
  node_add_body_field($types['blog']);
}

Функция просто перестраивает типы узлов (чтобы был доступен вновь добавленный тип), а затем добавляет в нее поле тела, используя node_add_body_field()функцию. Эта функция сам по себе дает отличный пример того , как создать поле, экземпляр этого поля, а затем присоединить его к типу контента , используя field_create_field()и field_create_instance()функцию.

Код не такой длинный, поэтому я приведу его здесь в качестве примера:

function node_add_body_field($type, $label = 'Body') {
  // Add or remove the body field, as needed.
  $field = field_info_field('body');
  $instance = field_info_instance('node', 'body', $type->type);
  if (empty($field)) {
    $field = array(
      'field_name' => 'body', 
      'type' => 'text_with_summary', 
      'entity_types' => array('node'),
    );
    $field = field_create_field($field);
  }
  if (empty($instance)) {
    $instance = array(
      'field_name' => 'body', 
      'entity_type' => 'node', 
      'bundle' => $type->type, 
      'label' => $label, 
      'widget' => array('type' => 'text_textarea_with_summary'), 
      'settings' => array('display_summary' => TRUE), 
      'display' => array(
        'default' => array(
          'label' => 'hidden', 
          'type' => 'text_default',
        ), 
        'teaser' => array(
          'label' => 'hidden', 
          'type' => 'text_summary_or_trimmed',
        ),
      ),
    );
    $instance = field_create_instance($instance);
  }
  return $instance;
}
Клайв
источник
Спасибо. Нужно ли что-то делать в моем hook_uninstall?
Галан
Это зависит от вас ... если вы хотите удалить любой контент / типы контента / поля, которые вы создали, тогда да, если нет, то нет :)
Clive
Таким образом, мой тип контента не исчезнет, ​​когда мой модуль будет выключен?
Gaelan
2
Ваш пользовательский тип контента не исчезнет, ​​когда ваш модуль будет отключен (в Drupal 7), даже если вы удалите отключенный модуль. Если вы напишите код для удаления типов контента, созданных вами во время установки во время hook_uninstall () вашего модуля, то да, тип контента исчезнет при удалении вашего модуля (но не при простом его отключении).
Дядя Код Обезьяна