Dodaj pole w hook_node_info ();

9

Czy można dodać pola do typu węzła zadeklarowanego za pomocą hook_node_info? Czy muszę dodawać pola osobno? Jeśli tak, jakiego haka użyłbym do tego?

Gaelan
źródło

Odpowiedzi:

8

Musisz dołączyć pola osobno, nie można ich dodać hook_node_info(). Zwykle robiłbyś to w hook_install()funkcji pliku instalacyjnego modułu.

Ładny prosty przykład z rdzenia Drupala znajduje się w pliku instalacyjnym modułu blogu:

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

Funkcja po prostu odbudowuje typy węzłów (więc nowo dodany typ jest dostępny), a następnie dodaje do niego pole treści za pomocą node_add_body_field()funkcji. Ta funkcja sama w sobie stanowi doskonały przykład tworzenia pola, instancji tego pola, a następnie dołączenia go do typu zawartości za pomocą funkcji field_create_field()i field_create_instance().

Kod nie jest tak długi, więc dołączę go tutaj jako przykład:

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;
}
Clive
źródło
Dzięki. Czy muszę coś zrobić w mojej hook_uninstall?
Gaelan
To naprawdę zależy od ciebie ... jeśli chcesz usunąć wszelkie treści / typy treści / pola, które utworzyłeś, to tak, jeśli nie, to nie :)
Clive
Czy mój typ zawartości nie zniknie po wyłączeniu modułu?
Gaelan
2
Twój niestandardowy typ zawartości nie zniknie, gdy moduł zostanie wyłączony (w Drupal 7), nawet jeśli odinstalujesz wyłączony moduł. Jeśli napiszesz kod, aby usunąć typy zawartości utworzone podczas instalacji podczas hook_uninstall () modułu, to tak, typ zawartości zniknie po odinstalowaniu modułu (ale nadal nie po wyłączeniu go).
Wujek Code Monkey