Weisen Sie Felder programmgesteuert einem benutzerdefinierten Knoten zu, der vom benutzerdefinierten Modul definiert wird


7

Es wird versucht, ein Modul von Drupal 6 nach Drupal 7 zu konvertieren, das in hook_node_info einen eigenen Knotentyp definiert.

Obwohl hook_node_info has_title und has_body als TRUE definiert, wie kann ich dafür sorgen, dass diese Felder im Knotenformular angezeigt werden? Zuvor habe ich hook_form () verwendet:

function mymodule_form(&$node, $form_state) { 
  $type = node_get_types('type', $node);

  if ($type->has_title) {
    $form['title'] = array(
        '#type' => 'textfield',
        '#title' => check_plain($type->title_label),
        '#required' => TRUE,
        '#default_value' => $node->title,
        '#weight' => -25,
    );
  }

  if ($type->has_body) {
    $form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);
    $form['body_field']['body']['#rows'] = 5;
    $form['body_field']['body']['#description'] = 'Enter a short message to present to the user.';
  }

  return $form;
}

In D6 hat das für mich gut funktioniert. In Drupal 7 hat sich hook_form geändert, und ich folge der Dokumentation nicht ganz.

Wie kann ich das Text- und Titelfeld im Kern verwenden und sie diesem Knotentyp zuweisen, wenn das Modul aktiviert ist?

Wie kann ich außerdem einen neuen Feldtyp definieren, um Body (Langtext mit Zusammenfassung) für etwas meiner Wahl nachzuahmen?

Antworten:


4

Um das Textfeld einem Inhaltstyp hinzuzufügen, verwenden Sie node_add_body_field () . Um ein Feld hinzuzufügen, das nicht das Hauptfeld ist, verwenden Sie field_create_field () , falls das Feld nicht vorhanden ist, und field_create_instance () , um einer Entität (z. B. einem Knoten oder einem Benutzerobjekt) eine Instanz des Felds zuzuweisen.

Als Beispiel für die Verwendung dieser Funktionen können Sie sich standard_install () ansehen , den Installations-Hook des Standardprofils, der den folgenden Code enthält:

  $field = array(
    'field_name' => 'field_' . $vocabulary->machine_name, 
    'type' => 'taxonomy_term_reference',
    'cardinality' => FIELD_CARDINALITY_UNLIMITED, 
    'settings' => array(
      'allowed_values' => array(
        array(
          'vocabulary' => $vocabulary->machine_name, 
          'parent' => 0,
        ),
      ),
    ),
  );
  field_create_field($field);

  $instance = array(
    'field_name' => 'field_' . $vocabulary->machine_name, 
    'entity_type' => 'node', 
    'label' => 'Tags', 
    'bundle' => 'article', 
    'description' => $vocabulary->help, 
    'widget' => array(
      'type' => 'taxonomy_autocomplete', 
      'weight' => -4,
    ), 
    'display' => array(
      'default' => array(
        'type' => 'taxonomy_term_reference_link', 
        'weight' => 10,
      ), 
      'teaser' => array(
        'type' => 'taxonomy_term_reference_link', 
        'weight' => 10,
      ),
    ),
  );
  field_create_instance($instance);

Der Code fügt dem Inhaltstyp "Artikel" ein Taxonomiebegriffsfeld hinzu.


1

Dies ist ein großartiges Dokument zum Konvertieren Ihres Moduls von Drupal 6.x nach 7.x.

In gibt es Staaten

Feldinstanzen des Knotenkörpers werden jetzt ausschließlich von der Feld-API verarbeitet

Beim Definieren eines Knotentyps oder beim Erstellen eines Knotentyps mit node_type_save () sind die Schlüssel 'has_body' und 'body_label' veraltet.

Um ein Body-Feld hinzuzufügen, können Sie stattdessen node_add_body_field ($ type) aufrufen. Dadurch wird die Feldinstanz zu diesem Knotentyp hinzugefügt. Beispiele finden Sie unter blog.install und forum.install.

Schauen Sie sich forum.install & blog.install an

Der Ort, an dem Sie dies tun möchten, befindet sich in mymodule.install und entweder in mymodule_install () oder mymodule_enable ().



Um ein Feld wie den Körper nachzuahmen, nehmen Sie den Code von node_add_body_field und fügen Sie eine private Funktion ein
iStryker

Es gibt keine einfache Feld-API, um ein Feld zu erstellen und einem Knotentyp zuzuweisen.
Kevin

Ich glaube nicht, dass es einen einfacheren Weg gibt, wie zum Beispiel in mymodule_form (). Drupal 7 verwendet Feldinstanzen. Nach meinem Verständnis müssen sie der Datenbank hinzugefügt werden, bevor Sie sie verwenden können. Deshalb verwendet das Forum- und Blog-Modul hook_install () & hook_enable (). Randnotiz: Sie können sie anschließend mit field_create_instance () & field_create_field () in einer privaten Funktion zum Typ hinzufügen, aber warum sollten Sie das tun?
iStryker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.