it-swarm-eu.dev

Jaký háček mohu použít pro akce po uložení?

Našel jsem několik příspěvků se stejnou otázkou, ale odpovědi se vždy liší od nějakého jiného tématu nebo nefungují pro mé potřeby.

Po uložení uzlu chci, aby můj vlastní modul vložil řádek do jedné z mých vlastních tabulek, která obsahuje uzel nového uzlu. Když hook_node_submit se volá, nid zatím neexistuje. hook_node_insert má nid, ale nazývá se pouze při prvním uložení uzlu, ale při každém uložení uzlu potřebuji provést akci.

Mým plánem je oddělit moji funkčnost do své vlastní metody a implementovat oba háčky, ale snažím se naučit dělat věci správně pomocí Drupal) a tak jsem zvědavý, jestli existuje háček, který ve skutečnosti odpovídá mým požadavkům.

Existuje háček, který se volá pokaždé, když je uzel uložen a nazývá se PO uložení je dokončeno?

15
Kenny Wyland

Když se podíváme na komentáře k otázce, vypadá to, že zřejmým řešením je použití háčků hook_node_insert() a hook_node_update() .

Vlastně jsem právě udělal něco velmi podobného, ​​jak je popsáno v odpovědi: Napsal jsem funkci, která dělá to, co chci, aby se dělo pokaždé, když je uzel vytvořen/aktualizován, a pak to zavolám z každého z těchto háčků. Funguje to dobře.

5
donut

Správným způsobem, jak toho dosáhnout, je respektovat transakci Drupalu s db. Pokud chcete provést nějakou akci databáze v hook_node_insert, musíte vzít v úvahu, že uzel ještě není uložen. což znamená, že pokud selže a bude vrácena zpět, skončíte s osamocenými daty v databázi. Proto by mělo být použito rozhraní API Drupal database API, nikoli přímé provádění dotazů).

Pokud chcete aktualizovat samotný uzel v hook_node_insert, nemůžete, protože není možné použít node_save, protože uzel ještě není uložen v databázi a jeho vyvolání způsobuje výjimku. Jedním z řešení je použití funkce register_shutdown_function a předávání nid, můžete použít node_load, abyste se ujistili, že je skutečně uložen, a poté proveďte další akci, kterou budete chtít v novém uzlu.

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

AKTUALIZACE: Zde také najdete jednodušší alternativu https://stackoverflow.com/a/24035797/1726778

12
Sina Salek

K dispozici je nový modul drupal, Hook Post Action ), který přidává háky pro uložení příspěvků. Zkuste to a uvidíme, jestli to funguje.

5
Druvision