[Résolu]Créer un node dans mon module ...

Catégories:

Bonjour,
Je débute drupal depuis le début du mois et j’ai besoin de récupérer des données via un webservice. Pour cela, j’ai créé mon module qui fonctionne correctement mais je ne trouve pas de fonction pour créer un nouveau noeud directement dans mon module… ( et ne pas avoir à le faire à la main via create content parce que la table que je récupère risque d’être assez importante ^^ )

Avant de me lancer dans une méthode pas sexy (à base de Insert dans toutes les tables drupal concernées) j’aimerai savoir s’il n’y a pas un moyen de créer un nouveau noeud à la volée et de le compléter ensuite comme on veut.

Merci d’avance

#

Alors, pour ceux que ca intéresse, je n’ai pas trouvé de quoi créer directement un noeud alors je l’ai fait à la main, j’ai récupéré le max ID de mes nodes, j’en ai créé un nouveau dans la base avec un db_query(«INSERT INTO {node} (nid , …

Mais attention, ce n’est pas la seule base à mettre en jour, il y a la table des commentaires, des revisions et comme j’utilise les module taxonomie et CKK, je dois donc modifier les tables suivantes : node_comment_stat, node_revisions, term_node et content_type_product, ça à l’air de bien fonctionner !

En revanche, je reste toujours preneur d’une solution plus sexy si quelqu’un a !

#

La bonne méthode est de faire un objet $node et de le sauver avec l’API drupal :

<?php
global $user;
$node=(object)array(
'title'=>'takazok',
'body'=>'pouet',
'created'=>time(),
'uid'=>user->uid,
'type'=>'story',
 
'status'=>1);
node_object_prepare($node);
node_save($node);
?>

Là c’est un simple «story», mais si tu as un content complexe, genre un CCK de type «mon_type» avec un champ toto de type text, cela donnerait :

<?php
global $user;
$node=(object)array(
'title'=>'takazok',
'body'=>'pouet',
'created'=>time(),
'uid'=>user->uid,
'type'=>'mon_type',
 
'status'=>1,
 
'field_toto'=>'la tête');
node_object_prepare($node);
node_save($node);
?>

Enfin si tu rajoute un champ ‘log’ avec un message, ça te créera la révision qui va bien.

Yoran - arNuméral

#

Merci, ca marche très bien, juste quelques modifications à apporter au niveau des contenu CKK.

De plus, pour ceux que ca interesse, j’avais aussi une taxonomy a intégrer dans mon node, voila ce que ca donne :

<?php
$term
= taxonomy_get_term_by_name("monNom");
$tid = $term[0]->tid;
$vid = $term[0]->vid;
$description = $term[0]->description;
$weight = $term[0]->weight;

$taxonomy=(object)array(
           
'tid' => "$tid",
           
'vid' => "$vid",
           
'name' => "monNom",
           
'description' => "$description",
           
'weight' => "$weight"
       
);

$node=(object)array(
           
'title'=>"monTitre",
           
'body'=>"monBody",
           
'created'=>time(),
           
'uid'=>$user->uid,
           
'type'=>'monType',
           
'status'=>1,
           
'field_monChamp' =>
                array (
                   
0 => array (
                       
'value' => "maValue",
                    ),
                ),
           
'taxonomy' => 
                array (
                   
$tid => $taxonomy,
                ),
        );
node_prepare($node);
node_save($node);
?>

Et c’est quand même plus propre que des requêtes sql partout sans utiliser les fonctions drupal !!!

Encore une fois merci pour l’aide que vous m’avez apporté !

#

Ok, je note la variante CCK, ça peut servir.

En tout cas ravis que cela t’ai aidé mais cela ne te donne pas le droit de me vouvoyer ;p

Yoran - arNuméral

#

Bonjour,
j’ai voulu prendre cet exemple pour tâter du développement. Et bien sûr j’ai des questions toutes basiques.
Comment fait-on pour que ce code ne s’exécute qu’une seule fois ?
On doit le mettre dans un hook ? Lequel ?
En d’autres termes, c’est OK pour ce bout de code, mais comment l’habiller ?

Indépendante, mandats Drupal et PHP.
Migration Drupal 6 / Drupal 7

#

ça dépend beaucoup de ce que tu veux en faire. Mais d’une manière générale tu le mettras dans une fonction «callback» qui sera référencée dans un $items[ton_chemin] dans un hook_menu

Yoran - arNuméral

#

Comme le dit yoran, c’est exactement ce que j’ai fait, je l’ai mis dans mon hook menu :

<?php
function monModule_menu(){

  $items['admin/settings/callback'] = array(
   
'title' => MonTitre',
    '
description' => "maDescription",
    '
page callback' => 'le nom de la fonction qui contient le bout de code au dessus',
    '
access arguments' => array('access content'),
    '
type' => MENU_NORMAL_ITEM,
    '
file' => 'le fichier qui contient mafonction.inc,
  );
  return
$items;
}
?>

Ensuite, la fonction sera appelée à chaque clic, mais il faut faire attention à ce que retourne notre fonction, pour l’affichage, le plus simple, c’est de mettre :

<?php
function maFonction{
  
  
// Le bout de code avec en argument ce que tu veux, moi, c'est pour récupérer des infos d'une BDD

   $output = theme('node', $node);
   return
$output;
}
?>

#

Merci à vous deux. La situation est débloquée.

Indépendante, mandats Drupal et PHP.
Migration Drupal 6 / Drupal 7

Syndiquer le contenu