Drupal 7 : Création de champs (Fields) dans un module

Dans la dernière version de Drupal,
la version 7, le module Field fait parti intégrante du Core. Ce module
est le successeur de CCK. Ainsi la création d'un type de contenu ayant
des champs spécifiques est beaucoup plus simple que dans la version 6.

Définition des champs

Pour définir un champ il faut définir d'une part sa configuration et
d'autre part une de ses instances. Une même configuration peut être
utilisée pour plusieurs instances.

La définition de la configuration d'un champ se fait par un tableau associatif.

La configuration d'un champ de type text appelé champ_texte est de la forme suivante :

array(
      'active' => '1',
      'cardinality' => '1',
      'deleted' => '0',
      'entity_types' => array(
        0 => 'node',
      ),
      'field_name' => 'champ_texte',
      'foreign keys' => array(
        'format' => array(
          'columns' => array(
            'format' => 'format',
          ),
          'table' => 'filter_format',
        ),
      ),
      'indexes' => array(
        'format' => array(
          0 => 'format',
        ),
      ),
      'module' => 'text',
      'settings' => array(),
      'translatable' => '1',
      'type' => 'text_with_summary',
  );

Dans ce tableau on indique les paramètres généraux du champ. Pour ce type de champ texte, on définit la possibilité d'utiliser un format d'entrée, on précise le module utilisé. Le type d'entité pouvant accueillir ce champ doit aussi être indiqué ici.

Définition d'une instance

Une fois la configuration du champ définie, on peut créer une instance de ce champ. Une même configuration peut disposer de plusieurs instances. Nous allons voir comment en créer une.

La définition d'une instance se fait sous la forme d'un tableau associatif.

array(
      'bundle' => 'page',
      'default_value' => NULL,
      'deleted' => '0',
      'description' => '',
      'display' => array(
        'default' => array(
          'label' => 'hidden',
          'module' => 'text',
          'settings' => array(),
          'type' => 'text_default',
          'weight' => 20,
        ),
        'teaser' => array(
          'label' => 'hidden',
          'module' => 'text',
          'settings' => array(
            'trim_length' => 600,
          ),
          'type' => 'text_summary_or_trimmed',
          'weight' => 0,
        ),
      ),
      'entity_type' => 'node',
      'field_name' => 'champ_texte',
      'label' => 'Champ Texte',
      'required' => FALSE,
      'settings' => array(
        'display_summary' => TRUE,
        'text_processing' => 1,
        'user_register_form' => FALSE,
      ),
      'widget' => array(
        'module' => 'text',
        'settings' => array(
          'rows' => 20,
          'summary_rows' => 5,
        ),
        'type' => 'text_textarea_with_summary',
        'weight' => 10,
      ),
    );

Dans la définition d'une instance, on commence par donner le type de node auquel ce champ sera attaché (bundle), on définit quelques options.

La partie la plus intéressante de la configuration de l'instance réside dans la configuration du widget et du formatter.
On peut utiliser n'importe quel widget qui prend en charge le type de champ défini dans l'étape précédente.
Dans cet exemple on utilise le widget : 'text_textarea_with_summary' fournit par le module 'text', on y associe sa configuration (ici rows et summary_rows). La configuration dépend du widget utilisé.
De la même façon on défini le formatter du champ dans le sous tableau 'display'. On peut définir autant de modes d'affichage que l'on a de mode d'affichage pour l'entité associée. Ici notre champ est associé à un node, on définit un mode d'affichage 'default' et un mode d'affichage 'teaser'.
Pour chaque mode d'affichage on précise quel module fournit le formatter, quel type de formatter est utilisé ainsi que ses paramètres. Dans cet exemple on utilise deux formatter fournis par le module 'text', le text_default pour le mode default et le text_summary_or_trimmed pour le mode teaser.

Ajout du champ au type de contenu

Une fois les définitions dans champs écrites, il faut faire appel à deux fonctions l'une pour créer le champ à partir de sa configuration et l'autre pour créer l'instance. Le type de contenu (bundle) désigné dans l'instance du champ doit exister. 

La fonction permettant d'installer la configuration du champ est la suivante :

field_create_field($field);

Où $field est le tableau associatif de la configuration du champ.

La fonction permettant d'installer une instance du champ est la suivante :

field_create_instance($instance);

Où instance est le tableau associatif décrivant l'instance.

Dans cet exemple on a vu comment associer un champ à un node, mais on peut associer des champ à toutes les "entités". Ainsi on peut ajouter des champs aux utilisateurs, aux termes de taxonomie, aux commentaires...
Pour les utilisateurs il faut indiquer 'user' à la fois pour entity_type et pour bundle. Pour les termes de taxonomie il faut indiquer taxonomy_term pour entity_type et le nom du vocabulaire pour bundle.

On peut obtenir facilement les valeurs pour les différents types de champs grâce au module features.

3 commentaires

  1. Bonjour,

    je voudrais insérer un champ datepicker dans un type de contenu, mais avec une option supplémentaire pour ce champ, il faudrait que je puisse saisir une valeur pour chaque date pour ma partie admin et que dans la partie frontoffice j’ai un tableau avec mes dates dur une semaine et que sous chaque date je vois le nombre que j’ai saisi dans l’admin.
    Est-ce possible avec cette méthode?
    D’avance merci pour votre réponse.
    Cordialement

  2. Bonjour,

    est-ce que avec cette méthode on peut ajouter un champ par exemple dans le module date?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.