Jak programowo publikować niepublikowane węzły

15

Mam kilka niepublikowanych węzłów, dla których mam ich identyfikatory. Jak mogę je programowo opublikować? Czy poprawne jest osiągnięcie tego w niestandardowym module za pomocą zapytania takiego jak poniżej?

db_query("UPDATE {node} SET status = 1 WHERE nid = %d", $nid)
Jim Gaslingson
źródło
Chociaż nie jest najczystszy, jest jednym z szybszych.
Oskar Calvo
3
Podstawowym problemem związanym z tą metodą jest to, że nie aktualizuje się node_revision, więc spowoduje niespójność.
artfulrobot

Odpowiedzi:

20

Używanie db_query()to metoda Drupal 6, która nie jest używana w Drupal 7. Aby osiągnąć cel, sugeruję ten kod (bez ręcznego zapytania).

// load the node object
$node = node_load($nid);
// set status property to 1
$node->status = 1;
// re-save the node
node_save($node);

Jeśli masz więcej identyfikatorów węzłów i chcesz opublikować wszystkie te węzły, możesz użyć następującego kodu.

$nids = array();
// Load all nodes in one go for better performance.
$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
  // set status property to 1
  $node->status = 1;
  // re-save the node
  node_save($node);
}
Yusef
źródło
3
Co? db_queryjest również metodą Drupal 7. Po prostu bierze różne argumenty.
@ andrewtweber, tak, teraz jest to część drupal, ale spójrz na pierwszą wersję drupal 7, a następnie zgłoś roszczenie !!!
Yusef
Którego haka powinienem użyć? Dodałem wewnątrz hook_node_submit, ale otrzymuję błąd. Jakaś pomoc?
sokratis
@sokratis w hook_form_alter dodaj niestandardowy moduł submitobsługi do swojego, a następnie w niestandardowym module obsługi przesyłania możesz użyć czegoś takiego.
Yusef
Nie zapomnij o cytatach. $ node-> status = "1";
Selwyn Polit
7

gdy używasz node_load (), node_load_multiple () do ładowania (wielu) ładunków, wiele modułów zostanie wywołanych przez moduły, takie jak hook_node_load , hook_node_operations , hook_node_prepare , hook_node_accesse . Ale wykonując zapytanie bezpośrednio na schemacie drupal, te zaczepy zostaną zignorowane i doprowadzą do wielu problemów.

Zapytania to:

db_query("UPDATE {node} SET `status` = '1' WHERE `nid` =:nid ;"
    ,array(':nid'=>$node->nid));

db_query("UPDATE {node_revision} SET `status` = '1' WHERE `nid` =:nid AND  `vid` =:vid;"
    ,array(':nid'=>$node->nid,'vid'=> $node->vid));

Wystarczy użyć powyższego kodu, jeśli node_load () lub node_load_multiple () nie działa z powodu braku dostępnej pamięci.

B Ravanbakhsh
źródło