So veröffentlichen Sie unveröffentlichte Knoten programmgesteuert

16

Ich habe einige unveröffentlichte Knoten, für die ich ihre Knoten-IDs habe. Wie kann ich sie programmatisch veröffentlichen? Ist es richtig, dies in einem benutzerdefinierten Modul mit einer Abfrage wie der folgenden zu erreichen?

db_query("UPDATE {node} SET status = 1 WHERE nid = %d", $nid)
Jim Gaslingson
quelle
Obwohl es nicht das sauberste ist, ist es eines der schnelleren.
Oskar Calvo
3
Das grundlegende Problem bei dieser Methode besteht darin, dass sie nicht aktualisiert wird node_revision, sodass es zu Inkonsistenzen kommt.
Artfulrobot

Antworten:

21

Verwenden db_query()ist eine Drupal 6-Methode, die in Drupal 7 nicht verwendet wird. Um Ihre Arbeit zu erledigen, empfehle ich diesen Code (ohne manuelle Abfrage).

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

Wenn Sie über mehr Knoten-ID verfügen und alle diese Knoten veröffentlichen möchten, können Sie den folgenden Code verwenden.

$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
quelle
3
Huh? db_queryist auch eine Drupal 7 Methode. Nimmt einfach andere Argumente.
@andrewtweber, Ja jetzt ist es ein Teil von Drupal, aber schau dir die erste Version von Drupal 7 an und behaupte dann !!!
Yusef
Welchen Hook soll ich verwenden? Ich habe hook_node_submit hinzugefügt, erhalte aber einen Fehler. Irgendeine Hilfe?
Sokratis
@sokratis in hook_form_alter Füge einen benutzerdefinierten submitHandler zu deinem von da an benutzerdefinierten Submit-Handler hinzu. Du kannst so etwas verwenden.
Yusef
Vergiss die Anführungszeichen nicht. $ node-> status = "1";
Selwyn Polit
8

Wenn Sie node_load (), node_load_multiple () zum Laden von (mehreren) Noads verwenden, werden von Modulen viele Hooks aufgerufen, z. B. hook_node_load , hook_node_operations , hook_node_prepare , hook_node_accesse . Wenn Sie jedoch eine Abfrage direkt im Drupal-Schema durchführen, werden diese Hooks ignoriert und führen zu vielen Problemen.

Die Abfragen sind:

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

Verwenden Sie einfach den obigen Code, wenn node_load () oder node_load_multiple () nicht funktionieren, weil der verfügbare Speicher knapp wird.

B Ravanbakhsh
quelle