it-swarm.com.de

Legen Sie ein bestimmtes Änderungsdatum für einen Knoten fest

Ich erstelle programmgesteuert Knoten basierend auf dem Feed einer externen API. Ich habe es geschafft, alle Knoten zu erstellen, Feldwerte zuzuweisen und auch das Datum created festzulegen. Jetzt ist mein Problem, dass ich auch das changed -Datum jedes Knotens so einstellen muss, dass es mit dem vom Feed zurückgegebenen Wert übereinstimmt. Ich habe versucht, diesen Wert festzulegen, bevor der Knoten ohne Erfolg gespeichert wurde:

// $data contains the release information used to create and populate the node
$node = new stdClass();
$node->title = $data->Release->Title;
$node->type = 'release';
node_object_prepare($node);
$node->status = NODE_PUBLISHED;
$node->uid = 1;
$node->language = LANGUAGE_NONE;

// handle any field data - not really important
handleFields($node, $data);

// submit the node
$node = node_submit($node);

$node->created = strtotime($data->Release->PublishDate);
// here I'm trying to set the changed value for the node
$node->changed = strtotime($data->Release->LastChangeDate);

// finally save the node
node_save($node);

Wäre schön, wenn jemand eine Lösung für dieses Problem hätte. Vielleicht kann ich eine Rohabfrage für die Datenbank durchführen, um das changed -Datum des Knotens zu aktualisieren? Der Grund, warum ich diesen Wert festlegen muss, ist, dass er später zum Vergleich mit dem Änderungsdatum einer Version im Feed verwendet wird, damit ich entscheiden kann, ob der Knoten aktualisiert werden muss oder nicht. Ich weiß, dass ich zu diesem Zweck ein benutzerdefiniertes Feld verwenden kann, in dem die Änderungszeit der Releases gespeichert und dann anstelle der geänderten Spalte in der Knotentabelle mit diesem Wert verglichen wird.

2
Cyclonecode

Der von Ihnen verwendete Code funktioniert nicht wie erwartet, da Sie zuerst $node->changed Setzen und dann node_save() aufrufen, wodurch der Wert bedingungslos festgelegt wird.

Der verwendete Code ist der folgende.

// Set the timestamp fields.
if (empty($node->created)) {
  $node->created = REQUEST_TIME;
}
// The changed timestamp is always updated for bookkeeping purposes,
// for example: revisions, searching, etc.
$node->changed = REQUEST_TIME;

$node->timestamp = REQUEST_TIME;
$update_node = TRUE;

// Let modules modify the node before it is saved to the database.
module_invoke_all('node_presave', $node);
module_invoke_all('entity_presave', $node, 'node');

Wenn Sie $node->changed Setzen möchten, müssen Sie hook_node_presave() implementieren, das direkt nach node_save() sets $node->changed.
Zum Beispiel würde ich in dem Code, den Sie anzeigen, $node->release_change_date = strtotime($data->Release->LastChangeDate); hinzufügen; Ihre Implementierung von hook_node_presave() würde dann $node->release_change_date verwenden, um $node->changed ($node->changed = $node->release_change_date) festzulegen.

4
kiamlaluno

Für drupal 7:

$update_node = node_load($nid_to_change);
$update_node->changed = $timestamp_in_unix_form;
drupal_write_record('node', $update_node, 'nid');

Das ist eine sehr dumme Routine; Es umgeht viele Fehlerprüfungen in node_save (). Es wird ein vollständiger, intakter Knoten erwartet. Es liegt also an Ihnen, sicherzustellen, dass die Knotenintegrität gut ist. Andernfalls könnten Sie riskieren, Ihre Datenbank zu beschädigen.

0
Daggar