Astuce [D7] Remplir des champs de contenu programmatiquement

Lorsqu'on crée programmatiquement un contenu, voici comment remplir différents types de champ (les lignes ci-dessous sont à ajouter à la place de [...(1)] et/ou [...(2)] dans l'article lié).

Champs multivalués

Dans Drupal, tous les champs sont potentiellement multivalués. Pour ajouter plusieurs valeurs à un même champ, il suffit d'ajouter une nouvelle ligne en incrémentant le [0] dans les lignes ci-dessous.

Par exemple pour un champ texte basique ayant 3 valeurs :

$node->field_text[LANGUAGE_NONE][0]['value'] = 'ma première valeur';
$node->field_text[LANGUAGE_NONE][1]['value'] = 'ma deuxième valeur';
$node->field_text[LANGUAGE_NONE][2]['value'] = 'ma troisième valeur';

Champs multilingues

Dans Drupal, tous les champs sont potentiellement multilingues. Pour ajouter une valeur dans une autre langue, il suffit d'ajouter une ligne en remplaçant LANGUAGE_NONE par une langue.

Exemple avec un champ texte basique et deux langues :

$node->field_text['fr'][0]['value'] = 'ma valeur';
$node->field_text['en'][1]['value'] = 'my value';

Champs texte

Pour remplir un champ texte basique, cette ligne suffit :

$node->field_text[LANGUAGE_NONE][0]['value'] = 'ma valeur';

Si ce champ utilise un format de texte particulier, il faut le préciser. Exemple avec simple_text :

$node->field_text[LANGUAGE_NONE][0]['value'] = 'ma valeur';
$node->field_text[LANGUAGE_NONE][0]['format'] = 'simple_text';

Champs entier/décimal

Même principe pour les champs de type nombre :

$node->field_number[LANGUAGE_NONE][0]['value'] = 42;

Champs booléen

Encore la même chose pour les booléens, $my_boolean étant en fait un entier égal à 0 ou 1 :

$my_boolean = 0;
$node->field_number[LANGUAGE_NONE][0]['value'] = $my_boolean;

Champs image

Pour importer une image programmatiquement vous pouvez utiliser cette fonction :

  /**
   * Copy the image in argument in the drupal upload dir, and return it.
   *
   * @param string $image_path Image path from the root directory
   * @return array an array representing the copied image
   */
  private function copy_image($image_path) {
 
    $root_dir_path = getcwd();
    $upload_sample_files_uri = file_default_scheme() . '://sample_data'; 
 
    $file_path = $root_dir_path . $image_path;
    $file = (object) array(
                'uid' => 1,
                'uri' => $file_path,
                'filemime' => file_get_mimetype($file_path),
                'status' => 1,
    );
    $file = file_copy($file, $upload_sample_files_uri);
    return (array) $file;
  }

Pour une image dans un répertoire temp/ à la racine de Drupal ça donne ça :

$node->field_image[LANGUAGE_NONE][0] = copy_image('/temp/mon_image.jpg');

Champs lien

Un champ lien avec une URL, un libellé et d'éventuels attributs HTML :

$node->field_link[LANGUAGE_NONE][0] = array(
  'url' => 'http://www.google.fr',
  'title' => 'Libellé du lien',
  'attributes' => array('title' => 'Contenu de l'attribut HTML title'),  
);

Champs référence entre entités (entityref)

Le champ entityref stocke des id (et donc des nid pour des nœuds) :

$node->field_related_content[LANGUAGE_NONE][0]['target_id'] = $other_node->nid;

Champs adresse

Le champ adresse découpe les adresses en 5 parties :

$node->field_adresse[LANGUAGE_NONE][0] = array(
  'country' => 'FR',
  'locality' => 'Paris',
  'postal_code' => '75000',
  'thoroughfare' => '1, Avenue des Champs Élysées',
  'premise' => '2ème étage',
);

Champs coordonnées - Bounds

Le champ coordonnées permet entre autres de stocker des limites géographiques : des bounds.

$node->field_coordonnees[LANGUAGE_NONE][0]['input_format'] = GEOFIELD_INPUT_BOUNDS;
$node->field_coordonnees[LANGUAGE_NONE][0]['geom']['left'] = '2.320915';
$node->field_coordonnees[LANGUAGE_NONE][0]['geom']['top'] = '48.869911';
$node->field_coordonnees[LANGUAGE_NONE][0]['geom']['right'] = '2.350928';
$node->field_coordonnees[LANGUAGE_NONE][0]['geom']['bottom'] = '48.854086';

Champs métadonnées

Le champ métadonnées ajoutera des balises méta dans le <head> de la page :

$node->metatags[LANGUAGE_NONE] = array(
    'title' => array('value' => 'Contenu de la balise title de la page'),
    'description' => array('value' => 'Contenu de la balise méta description'),
    'abstract' => array('value' => 'Contenu de la balise méta abstract'),
    'keywords' => array('value' => 'Contenu de la balise méta keywords'),
);

D'autres clés peuvent être ajoutées au tableau.