Zdecydowanie wybrałbym field_attach_update
.
Pomysł jest prosty. Po prostu załaduj węzeł i zapisz go, używając field_attach_update.
Dawny:
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Nie zmieni to żadnego znacznika czasu ani żadnego innego haka, który zwykle wywołuje save_save. Ładowanie węzła spowoduje również wywołanie niektórych haków, więc prawdopodobnie nie jest to tak wydajne.
Jeśli masz identyfikator nid i struktura węzła jest bardzo prosta, możesz to zrobić w następujący sposób:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
W każdym razie, jeśli próbujesz zaktualizować cokolwiek innego niż pola, to nie zadziała (status komentarza, status publikacji itp.). Również jeśli używasz node_save, pamięć podręczna dla konkretnego węzła zostanie automatycznie wyczyszczona dla różnych metod, które musimy wyczyścić za pomocą „entity_get_controller”.
Aktualizacja:
Wydaje się, że powinieneś także zadzwonić, field_attach_presave()
aby umożliwić innym modułom prawidłowe przetwarzanie danych wejściowych w polu. Na przykład moduł pliku używa go do ustawiania statusu pliku na stały za pomocą tego zaczepu. Zaktualizowałem moje 2 przykłady powyżej.
field_attach_update
?