So erstellen Sie programmgesteuert Felder für Inhaltstypen und fügen sie dem Inhaltstypformular hinzu

8

Angenommen, ich habe dieses Feld "map_description". Ich weiß, ich würde diese Funktion verwenden, um das Feld zu definieren:

$field = array(
  'field_name' => 'map_description',
  'cardinality' => 1,
  'type' => 'text',
);
field_create_field($field);

Und ich habe diesen Code, bei dem ich nicht sicher bin, was er tut, aber mir wurde gesagt, dass ich ihn brauche:

 $instance = array(
    'field_name' => 'map_description',
    'label' => 'The map description.',
    'bundle' => 'my_content_type',
    'entity_type' => 'node',
    'widget' => array(
    'type' => 'text_textfield',
 );
 field_create_instance($instance)

Diese beiden Codebits befinden sich beide in meinem Installations-Hook und werden ausgeführt, wenn ich das Modul installiere. Aber während die Felder tatsächlich erstellt werden, muss ich sie dem Inhaltstyp manuell über "Felder verwalten" zuweisen. Gibt es eine Möglichkeit, die Felder automatisch dem Inhaltstyp zuzuweisen?

Rugbert
quelle

Antworten:

10

Du bist fast da.

Aus Ihrem Code:

'bundle' => 'my_content_type',

Ersetzen Sie my_content_type durch den Namen des Inhaltstyps, an den es angehängt werden soll.

Hier ist ein vollständiges Beispiel eines Hinzufügen von Alias Textfeld zu dem Artikel Inhaltstyp. (von monarchdigital.com )

/**
 * Update hook to add a field to a node.
 */
function my_module_update_7000() {
  $field_name = 'field_alias';
  // Make sure the field doesn't already exist.
  if (!field_info_field($field_name)) {
    // Create the field.
    $field = array(
      'field_name' => $field_name,
      'type' => 'text',
      'settings' => array('max_length' => 64),
    );
    field_create_field($field);

    // Create the instance.
    $instance = array( 'field_name' => $field_name,
      'entity_type' => 'node',
      'bundle' => 'article',
      'label' => 'Alias',
      'description' => 'The article alias.',
      'required' => TRUE,
    );
    field_create_instance($instance);

    watchdog('my_module', t('!field_name was added successfully.', array('!field_name' => $field_name)));
  }
  else {
    watchdog('my_module', t('!field_name already exists.', array('!field_name' => $field_name)));
  }
}
Merrick
quelle
0

Nehmen Sie kleine Änderungen an Ihrem Code vor

$t = get_t();
$field = array(
   'field_name' => 'map_description',
    'label' => $t('My Description'),
    'type' => 'text',

);
field_create_field ($ field);

& Write this in Instance

$t = get_t();
return array(
  'map_description' => array(
    'field_name' => 'map_description',
    'type' => 'text',
    'label' => $t('Map Description'),
    'bundle' => 'your_custom_content_type',
    'entity_type' => 'node',
    'widget' => array(
      'type' => 'text_textfield'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Map Description'),
        'type' => 'text'
      )
    )
  ),
Vikram Singh Shekhawat
quelle