web-dev-qa-db-fra.com

Comment créer par programmation des champs pour les types de contenu et les ajouter au formulaire de type de contenu

Disons que j'ai ce champ, "map_description". Je sais que je voudrais cette fonction pour définir le champ:

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

Et j'ai ce code dont je ne suis pas sûr de ce qu'il fait mais on me dit que j'en aurai besoin:

 $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)

Ces deux bits de code sont à la fois dans mon hook d'installation et s'exécutent lorsque j'installe le module. Mais alors que les champs sont en fait créés, je dois les affecter manuellement au type de contenu via "gérer les champs", existe-t-il un moyen de les affecter automatiquement au type de contenu?

8
rugbert

Tu y es presque.

Depuis votre code:

'bundle' => 'my_content_type',

Remplacez my_content_type par le nom du type de contenu auquel vous souhaitez le joindre.

Voici un exemple complet d'ajout d'un champ de texte Alias ​​ au contenu de l'article type. (de 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)));
  }
}
10
Merrick

Apportez de petites modifications à votre code. Dans les champs

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

);
field_create_field ($ champ);

& 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'
      )
    )
  ),
0