2008-09-17 7 views
6

Dans un module personnalisé pour drupal 4.7, j'ai piraté ensemble un objet nœud et je l'ai passé à node_save ($ node) pour créer des nœuds. Ce hack semble ne plus fonctionner dans Drupal 6. Alors que je suis sûr que ce hack pourrait être corrigé, je suis curieux de savoir s'il existe une solution standard pour créer des nœuds sans formulaire. Dans ce cas, les données sont extraites d'un flux personnalisé sur un autre site Web.Comment créer un noeud à partir d'un travail cron dans drupal?

Répondre

6

Je ne connais pas d'API standard pour créer un nœud de manière pragmatique. Mais c'est ce que j'ai tiré de la construction d'un module qui fait ce que vous essayez de faire.

  1. Assurez-vous que les champs importants sont définis: uid, le nom, le type, la langue, le titre, le corps, le filtre (voir node_add() et node_form())
  2. passer le nœud par node_object_prepare() pour que d'autres modules peuvent ajouter au noeud $ objet.
11

La méthode des meilleures pratiques pour ce faire consiste à utiliser drupal_execute. drupal_execute exécutera la validation standard et les opérations de base sur les nœuds afin que les choses se comportent comme prévu. drupal_execute a ses bizarreries et est légèrement moins intuitif qu'un simple node_save, mais, dans Drupal 6, vous pouvez utiliser drupal_execute de la façon suivante.

 

$form_id = 'xxxx_node_form'; // where xxxx is the node type 
$form_state = array(); 
$form_state['values']['type'] = 'xxxx'; // same as above 
$form_state['values']['title'] = 'My Node Title'; 
// ... repeat for all fields that you need to save 
// this is required to get node form submits to work correctly 
$form_state['submit_handlers'] = array('node_form_submit'); 

$node = new stdClass(); 
// I don't believe anything is required here, though 
// fields did seem to be required in D5 

drupal_execute($form_id, $form_state, $node); 
 
+0

Je considère que drupal_execute est un risque, car il mélange les API de formulaire et de noeud, et l'une des conséquences est qu'il ne fonctionne pas bien dans une boucle, ce qui est souvent requis lors de la création de nœuds par programme. Avec certains modules contrib, cela peut être nécessaire, mais c'est au mieux une solution de contournement. – FGM

0

Une réponse plus j'ai découvert était d'utiliser the example du module blogapi dans le noyau Drupal. Le fait qu'il soit dans le noyau me donne un peu plus confiance qu'il continuera à fonctionner dans les futures versions.

0

Il existe quelques bonnes réponses ci-dessus, mais dans l'exemple spécifique de transformation d'un élément de flux ingéré en noeud, vous pouvez également utiliser le module simplefeed (http://wwww.drupal.org/project/simplefeed). Ce module utilise le moteur simplepie pour intégrer des flux et transformer des éléments individuels de chaque flux en nœuds. Je me rends compte que cela ne concerne pas spécifiquement la création de nœuds à partir de cron, mais cela pourrait être une solution plus facile à votre problème global. Node_save() fonctionne toujours correctement dans Drupal 6;

+0

Le problème est qu'il n'y a rien de simple à propos de simplefeed et il est plein de cruauté et de ballonnement. – deadprogrammer

+0

Cela ressemble au même problème avec beaucoup de modules contrib ... – Rimian

9

vous aurez besoin de quelques données spécifiques pour le faire fonctionner.

$node = new stdClass(); 
$node->type = 'story'; 
$node->title = 'This is a title'; 
$node->body = 'This is the body.'; 
$node->teaser = 'This is the teaser.'; 
$node->uid = 1; 
$node->status = 1; 
$node->promote = 1; 

node_save($node); 

« Etat » et « Promouvoir » sont faciles à oublier - si vous ne définissez pas ceux-ci, le nœud restera inédit et non activé, et vous ne verrez que si vous allez à l'écran d'administration de contenu .

+0

Je pense que vous devriez également définir $ node-> revision. Si vous le définissez sur une valeur initiale et que vous l'enregistrez, il doit être défini comme ID de noeud. Je me souviens d'avoir eu des problèmes avec ça quelque part dans le fond de mon esprit ... – Rimian

Questions connexes