Ajouter un champ dans hook_node_info ();

9

Est-il possible d'ajouter des champs à un type de nœud déclaré à l'aide de hook_node_info? Dois-je ajouter les champs séparément? Si oui, quel crochet utiliserais-je pour cela?

Gaelan
la source

Réponses:

8

Vous devez joindre les champs séparément, ils ne peuvent pas être ajoutés via hook_node_info(). Vous le feriez généralement dans une hook_install()fonction du fichier .install de votre module.

Un bel exemple simple du noyau Drupal se trouve dans le fichier d'installation du module de blog:

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

La fonction reconstruit simplement les types de nœuds (pour que le nouveau type ajouté soit disponible), puis lui ajoute un champ de corps à l'aide de la node_add_body_field()fonction. Cette fonction en elle-même donne un excellent exemple de la façon de créer un champ, une instance de ce champ, puis de l'attacher à un type de contenu à l'aide des fonctions field_create_field()et field_create_instance().

Le code n'est pas si long donc je vais l'inclure ici comme exemple:

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
la source
Merci. Dois-je faire quelque chose dans mon hook_uninstall?
Gaelan
C'est à vous de décider vraiment ... si vous souhaitez supprimer tout contenu / type de contenu / champ que vous avez créé alors oui, si vous ne le faites pas, alors non :)
Clive
Mon type de contenu ne disparaîtra donc pas lorsque mon module sera éteint?
Gaelan
2
Votre type de contenu personnalisé ne disparaîtra pas lorsque votre module sera désactivé (dans Drupal 7), même si vous désinstallez le module désactivé. Si vous écrivez du code pour supprimer les types de contenu que vous avez créés lors de l'installation pendant le hook_uninstall () de votre module, alors oui, le type de contenu disparaîtra lorsque vous désinstallerez votre module (mais toujours pas lorsque vous le désactiverez simplement).
Uncle Code Monkey