Bien que cela puisse paraître compliqué de l’extérieur, créer et modifier des contenus Drupal sans l’aide de l’interface d’administration est une chose relativement simple lorsque l’on s’est déjà confronté au problème. Néanmoins il faut être prudent avec ce que vous voulez sauvegarder, puisqu’en outrepassant le système naturel de création de contenus via l’interface d’admin vous avez la possibilité de faire tout et n’importe quoi et d’empêcher les autres modules de fonctionner correctement.
Voici donc un poste très simple sur la création de nodes via la programmation.
1.1 Initialisation de l’objet node
$node = new stdClass(); // Création d’un nouvel objet
$node->type = "article"; // Spécification du type de contenu à créer
$node->title = "Le titre de votre nouveau node";
$node->language = LANGUAGE_NONE; // Définition de la langue du contenu.
$node->path = array('alias' => 'article/chuck-norris-is-a-jedi'); // Ajout de l’url du contenu
node_object_prepare($node); // Création des valeurs par défaut.
$node->uid = 14; // Ajout de l’auteur du node si vous souhaitez qu'il soit différent de l'utilisateur en cours
// Do your stuff
$node = node_submit($node); // Prépare le node avant l’enregistrement (date + auteur) si les champs sont vides.
node_save($node); // Enregistrement du node.
Notes :
- Définition de la langue : Si le module Locale n’est pas activé sur votre site, utilisez la constante LANGUAGE_NONE afin de ne pas spécifier de langue en particulier à votre contenu, sinon insérez la langue désirée.
- Node_object_prepare() : remplit par défaut certaines valeurs telles que le statut, la promotion en page d’accueil, les commentaires ou encore le sticky.
1.2 Ajout du champ body
Au passage, depuis cette dernière version le champ body n’est plus obligatoire et peut être supprimé/caché depuis l’interface de gestion des champs.
$body_text = 'Chuck Norris donne fréquemment du sang à la Croix-Rouge. Mais jamais le sien.'; $node->body[$node->language][0]['value'] = $body_text; // Votre texte $node->body[$node->language][0]['summary'] = text_summary($body_text); // Résumé de votre champ body si vous en voulez un. $node->body[$node->language][0]['format'] = 'filtered_html'; // Format d’entrée du champ.
Notez ici la réutilisation du champ $node->language défini à l’étape précédente, cette variable vous servira souvent pour récupérer les informations de vos champs.
1.3 Remplissez vos champs
Rien de compliqué puisque la manip’ est la même que pour le champ body, il suffit d’ajouter la valeur désirée dans le champ voulu.
$node->field_text_list[$node->language][0]['value'] = 'Pomme';
Par contre certain champ ont besoin de plus d’informations comme le champ texte à qui il faut renseigner le format d’entrée.
$node->field_custom_name[$node->language][0]['value'] = 'Texte dans mon champ custom'; $node->field_custom_name[$node->language][0]['format'] = 'text_format'; // Si votre champ à un format d’entrée n’oubliez pas de le renseigner.
1.4 Renseigner un champ nodereference
Si vous utilisez le module nodereference pour lier vos contenus, il vous suffit simplement d’indiquer le nid du node dans le champ pour que cela fonctionne.
$node->field_nodereference[$node->language][]['nid'] = 12;
1.5 Insérer un terme à votre node
Si votre terme existe déjà, ajoutez simplement l’Id de celui-ci à votre champ.
$node->field_tags[$node->language][]['tid'] = 8; // field_tags, correspond au nom du champ et 8 à son id
Sinon, si vous voulez en créer un nouveau procédez comme suit :
$node->field_tags[$node->language][] = array ( 'vid' => 1, // Id du vocabulaire 'tid' => 'autocreate', 'name' => 'Mon term', // Votre term 'vocabulary_machine_name' => 'tags' );
1.6 Ajouter un fichier
Le nouveau système de fichier mérite un post à lui tout seul pour bien le comprendre et s’en servir, du coup je vous livre toute faite la solution pour ajouter un fichier déjà présent sur votre site à votre contenu.
$filepath = drupal_realpath('misc/druplicon.png'); // Création du chemin du fichier
// Création de l’objet contenant les propriétés du fichier.
$file = (object) array(
'uid' => 1,
'uri' => $filepath,
'filemime' => file_get_mimetype($filepath),
'status' => 1,
);
$file = file_copy($file, 'public://'); // On déplace le fichier à la racine du système de fichiers
$node->field_image[LANGUAGE_NONE][0] = (array)$file; // On assigne le fichier au champ
2 Mise à jour du contenu
$nid = 1; $node = node_load($nid); $node->title = 'Mise à jour du titre'; node_save($node);
On charge le node avec un id, on met à jour le champ qui nous intéresse et on le sauvegarde. Si vous avez plusieurs nodes à mettre à jour, utilisez la fonction node_load_multiple() qui vous évitera de faire plusieurs requêtes sur la base de données.
Voilà, j’espère que cet article et les quelques liens ci-dessous vous permettront de vous aider. Il y a pas mal de modules qui font de la création de nodes comme ça. En trouver un et le décortiquer reste la meilleure solution pour apprendre. Si toutefois vous avez plus d’informations, je suis preneur
Voici les quelques sources qui m’ont aidées à comprendre les changements de cette nouvelle version:
Crédits Photo – kikkerperspectief






Très synthétique et indispensable pour bien débuter la manipulation des nodes sur Drupal.
Juste une question : le $node->language est indispensable à chaque fois? Et à quoi correspond le tableau [0] qui suit?
Si ton site ne gère pas de multi-lingue tu peux très bien utiliser la constante LANGUAGE_NONE à la place de $node->language, mais il te faudra obligatoirement y mettre une valeur, c’est comme cela qu’est définie la structure d’un champ créé par la field api.
Chaque field peut être un champ multiple, d’où le tableau à la fin. Par exemple, si tu as autorisé 4 champs de saisies tu pourrais aller jusqu’à la valeur [3] pour récupérer une info. Effectivement si tu ne proposes qu’un champ de saisie simple, ça peut paraitre inutile de devoir faire cela. Or s’il n’y avait pas cette possibilité, tu ne pourrais pas transformer ton champ simple en un champ multiple puisque tu n’aurais pas la même structure. En plus, ça permet de garder une homogénéité du code et donc pas besoin de se casser la tête pour récupérer une valeur.
Effectivement çà parait logique présenté comme çà. Merci pour cet éclaircissement!
Je n’ai pas testé mais je sens que ça va m’être utile à l’avenir. Donc je garde le lien dans un coin
J’avais simplement une question de version, est-ce que ça fonctionne pour Drupal 6 et Drupal 7 ? Ou est-ce limité à Drupal 7 ?
Merci.
Non il est tout à fait possible de faire la même chose avec Drupal 6. Le code est juste un peu différent.
Merci pour l’info.
Merci pour cet article très intéressant.
Je m’intéresse à l’externalisation de la saisi pour faciliter la prise en main de contributeurs non expérimentés.
Avez-vous essayez de créer du contenu sans l’administration Drupal et sans code, mais avec word par exemple ? Je pense à MetaWeblog API comme dans cet article : http://www.sysarchitects.com/node/64 ?
Hello,
En cas de création de contenus via un CRON, il y a une toute petite différence:
La ligne :
$node->uid = ’1′;
doit être placée après :
node_object_prepare($node);
sinon le node créé n’aura pas d’auteur.
Effectivement, lorsque node_object_prepare() est exécuté, la fonction ajoute l’uid de l’utilisateur en cours. Dans le cas d’une création via le Cron l’utilisateur associé est l’utilisateur anonyme, d’où l’absence d’auteur.
Du coup, pour ajouter un utilisateur différent de l’utilisateur en cours, il faut le préciser après l’appel à la fonction node_object_prepare().
Merci Alex pour avoir remonté l’info, j’ai modifié mon exemple!
Au plaisir ^^
Bonjour je souhaiterai faire quelques choses de similaire mais par contre j’ai bien lu votre explication mais à aucun moment vous expliquez dans quel fichier mettre le code.
Je viens de découvrir drupal et c’est encore assez trouble tout ça :/
Bonjour Anthonny
Ce code est générique et peut être utilisé un peu partout ou vous avez besoin de créer des nodes. Par exemple lors de l’installation d’un module ou lors d’un import de données
Bonjour,
je suis en train de travailler sur un système de création de Webform entièrement automatisée (à l’installation de Drupal).
Je pense que ça serait une bonne extension à cet article, car le webform est un node « classique » à la base, mais auquel on attache un ensemble d’éléments de formulaire.
Les informations disponibles actuellement à ce sujet (création programmatique de webform) sont assez éparses et peu précises, et donc ça serait une bonne chose de trouver ça ici…