2008-09-17 5 views
6

In einem benutzerdefinierten Modul für Drupal 4.7 habe ich ein Knotenobjekt gehackt und es an Knoten_Save ($ Knoten) übergeben, um Knoten zu erstellen. Dieser Hack scheint in Drupal 6 nicht mehr zu funktionieren. Obwohl ich sicher bin, dass dieser Hack behoben werden könnte, bin ich neugierig, ob es eine Standardlösung gibt, um Knoten ohne ein Formular zu erstellen. In diesem Fall werden die Daten aus einem benutzerdefinierten Feed auf einer anderen Website abgerufen.Wie erstelle ich einen Knoten aus einem Cron-Job in Drupal?

Antwort

6

Ich kenne keine Standard-API zum pragmatischen Erstellen eines Knotens. Aber das habe ich aus dem Aufbau eines Moduls gelernt, das genau das tut, was Sie tun wollen.

  1. Sicherstellen, dass die wichtigen Felder festgelegt sind: uid, Name, Typ, Sprache, Titel, Körper, Filter (siehe node_add() und node_form())
  2. Führen Sie den Knoten durch node_object_prepare() so andere Module können an den $ Knoten hinzufügen Objekt.
11

Die Best Practices-Methode, um dies zu erreichen, ist die Verwendung von drupal_execute. drupal_execute führt die Standardvalidierung und grundlegende Knotenoperationen aus, so dass sich die Dinge so verhalten, wie das System es erwartet. drupal_execute hat seine Macken und ist etwas weniger intuitiv als einfach ein node_save, aber in Drupal 6 können Sie drupal_execute wie folgt verwenden.

 

$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

Ich halte drupal_execute tatsächlich für ein Risiko, da es die Formular- und Knoten-APIs mischt, und eine der Konsequenzen ist, dass es in einer Schleife nicht gut funktioniert, was oft beim programmgesteuerten Erstellen von Knoten erforderlich ist. Mit einigen contrib-Modulen kann es erforderlich sein, aber es ist im besten Fall eine Problemumgehung. – FGM

0

Noch eine Antwort, die ich entdeckte, war the example vom blogapi Modul in Drupal Kern zu verwenden. Die Tatsache, dass es im Kern ist, gibt mir ein bisschen mehr Vertrauen, dass es in zukünftigen Versionen weiter funktionieren wird.

0

Es gibt einige gute Antworten oben, aber in dem spezifischen Beispiel des Drehens eines aufgenommenen Feed-Elements in einen Knoten, könnten Sie auch den Ansatz der Verwendung des Simplefeed-Moduls (http://wwww.drupal.org/project/simplefeed) nehmen. Dieses Modul verwendet die Simplepie-Engine, um Feeds aufzunehmen und einzelne Artikel aus jedem Feed in Knoten umzuwandeln. Ich weiß, dass dies nicht speziell das Problem der Erstellung von Knoten aus Cron angeht, aber es könnte insgesamt eine einfachere Lösung für Ihr Problem sein.

+0

Das Problem ist, es gibt nichts Einfaches über Simplefeed und es ist voll von Craft und Bloat. – deadprogrammer

+0

Das klingt nach dem gleichen Problem mit vielen contrib-Modulen ... – Rimian

9

node_save() funktioniert immer noch gut in Drupal 6; Sie benötigen ein paar spezifische Daten, damit es funktioniert.

$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); 

‚Status‘ und ‚Förderung‘ ist leicht zu übersehen - wenn Sie diese nicht gesetzt ist, wird der Knoten bleibt nicht veröffentlicht und nicht aktiviert, und Sie werden nur sehen, wenn Sie auf die Inhaltsverwaltung Bildschirm gehen .

+0

Ich denke, Sie sollten auch $ node-> revision einstellen. Wenn Sie es auf einen Anfangswert setzen und speichern, sollte es als Knoten-ID festgelegt werden. Ich kann mich daran erinnern, dass ich irgendwo in meinem Hinterkopf etwas Ärger damit hatte ... – Rimian

Verwandte Themen