Feld in hook_node_info () hinzufügen;

9

Ist es möglich, einem mit hook_node_info deklarierten Knotentyp Felder hinzuzufügen? Muss ich die Felder separat hinzufügen? Wenn ja, welchen Haken würde ich dafür verwenden?

Gaelan
quelle

Antworten:

8

Sie müssen die Felder separat anhängen, sie können nicht hinzugefügt werden hook_node_info(). Normalerweise tun Sie dies in einer hook_install()Funktion in der Installationsdatei Ihres Moduls.

Ein schönes einfaches Beispiel aus dem Drupal-Kern finden Sie in der Installationsdatei des Blog-Moduls:

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

Die Funktion erstellt einfach die Knotentypen neu (damit der neu hinzugefügte Typ verfügbar ist) und fügt ihr dann mithilfe der node_add_body_field()Funktion ein Textfeld hinzu . Diese Funktion an sich bietet ein hervorragendes Beispiel dafür, wie Sie ein Feld, eine Instanz dieses Felds, erstellen und dann mit den Funktionen field_create_field()und an einen Inhaltstyp anhängen field_create_instance().

Der Code ist nicht so lang, deshalb werde ich ihn hier als Beispiel einfügen:

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
quelle
Vielen Dank. Muss ich irgendetwas in meiner hook_uninstall tun?
Gaelan
Es liegt wirklich an Ihnen ... wenn Sie Inhalte / Inhaltstypen / Felder entfernen möchten, die Sie erstellt haben, dann ja, wenn nicht, dann nein :)
Clive
Mein Inhaltstyp verschwindet also nicht, wenn mein Modul ausgeschaltet wird?
Gaelan
2
Ihr benutzerdefinierter Inhaltstyp verschwindet nicht, wenn Ihr Modul deaktiviert wird (in Drupal 7), auch wenn Sie das deaktivierte Modul deinstallieren. Wenn Sie Code schreiben, um die Inhaltstypen zu löschen, die Sie während der Installation während hook_uninstall () Ihres Moduls erstellt haben, verschwindet der Inhaltstyp, wenn Sie Ihr Modul deinstallieren (aber immer noch nicht, wenn Sie es lediglich deaktivieren).
Onkel Code Monkey