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
?node_save
dofield_attach_update
izEntityFieldQuery
dodb_query_range
było dość satysfakcjonujące. Od 3h aktualizacji do 40 minut.Jeśli nie chcesz zapisywać danych pól bez spowodowania wystąpienia standardowych zdarzeń i akcji, możesz użyć drupal_write_record .
Oto przykład wstawienia Hello World w polu body dla węzła typu article o id 1.
Jeśli Twoja witryna jest wielojęzyczna, zamiast „und” będziesz chciał użyć „en” lub języka treści.
Jeśli przeprowadzasz weryfikację, musisz uważać, aby wstawić odpowiedni identyfikator wersji, w przeciwnym razie możesz po prostu wstawić tę samą wartość, co identyfikator_obiektu.
Zwróć uwagę, jak te dane są wstawiane do dwóch tabel field_data_ * i field_revision_ *. Powinieneś wstawić do obu, aby upewnić się, że strona działa zgodnie z oczekiwaniami.
Po uruchomieniu musisz wyczyścić pamięć podręczną pól, aby pojawiały się w zależności od konfiguracji buforowania.
źródło
W przypadku prostej aktualizacji, takiej jak ta, w której należy zaktualizować wiele węzłów, zawsze używam instrukcji aktualizacji MySQL. Tak, należy wziąć pod uwagę buforowanie, ale możesz po prostu opróżnić pamięć podręczną po zakończeniu i wszystko jest w porządku. Musisz oczywiście zapoznać się ze strukturą danych, ale w Drupal 6 jest ona stosunkowo prosta (choć przerażająca w Drupal 7)
źródło
Sugeruję
field_attach_update
też, a nie bezpośrednie zapytanie SQL, ponieważ sql nie aktualizuje obiektu pamięci podręcznej węzła, a przy następnymnode_load
nie załadujesz zaktualizowanej wartości pola, załadujesz starą wartośćfield_attach_update
jest znacznie lepszy niż bezpośrednie zapytanie SQL.źródło
stdClass
obiektu bez ładowania. Czy wiesz, co może się stać, jeśli spróbuję zaktualizować węzeł w ten sposób bez ustawiania wszystkich pól? Czy zostaną one zastąpione wartościami zerowymi lub domyślnymi? Czy mogą być one zignorowane przez proces aktualizacji?Po wypróbowaniu wszystkich podejść wymienionych w innych odpowiedziach mam bardzo wolne czasy aktualizacji (około 7 dni dla 700 000 węzłów typu węzła z ponad 20 polami), dopóki nie znalazłem tego artykułu: http://www.drupalonwindows.com/en/ blog / only-update-modified-fields-or-properties-bytu-drupal .
Po zaimplementowaniu czegoś takiego jak poniższy kod w hook_update skróciłem czas aktualizacji do 2 godzin, co moim zdaniem jest możliwe do zarządzania.
źródło
Miałem nawet ten sam wymóg aktualizacji pola dla wszystkich węzłów określonego typu treści. Użyłem wielokrotnego_węzła_węzła i aktualizacji_pola_pola .
Przebiegłem przez drush i było dość szybko.
źródło
Czy zastanawiałeś się nad zrobieniem tych aktualizacji bezpośrednio w bazie danych przy użyciu mySQL? Jest to prawdopodobnie najprostszy i najszybszy sposób na osiągnięcie tego, co chcesz.
Oto prosty przykład. Możesz wykonać takie polecenie z zakładki „SQL” w phpMyAdmin. Wyobraź sobie, że masz typ zawartości o nazwie Profil członka. W nim masz pole o nazwie „Typ członka” (np. Firma, osoba, organizacja). Załóżmy, że chcesz zaktualizować wszystkie wystąpienia hasła „FIRMA” do „firma”. Następujące polecenie to zrobi.
AKTUALIZACJA content_type_member_profile SET
field_type_of_member_value
= „firma” WHEREfield_type_of_member_value
= „FIRMA”;Kasa Rozpocznij z MySQL
źródło