web-dev-qa-db-ja.com

保存後のアクションにはどのフックを使用できますか?

私はこれと同じ質問のある投稿をいくつか見つけましたが、回答は常に他のトピックに分岐するか、私のニーズに合わない場合があります。

ノードが保存された後、カスタムモジュールで、新しいノードのnidを含むカスタムテーブルの1つに行を挿入します。いつ hook_node_submitが呼び出されましたが、nidはまだ存在していません。 hook_node_insertにはnidがありますが、ノードが初めて保存されるときにのみ呼び出されますが、ノードが保存されるたびにアクションを実行する必要がある可能性があります。

私の計画は、機能を独自のメソッドに分離し、両方のフックを実装することですが、Drupal実際に私の要件に適合します。

ノードが保存されるたびに呼び出され、保存が完了した後に呼び出されるフックはありますか?

17
Kenny Wyland

質問のコメントを見ると、フック hook_node_insert()hook_node_update() を使用するのが明白な解決策のようです。

私は実際に答えで説明されているように非常に似たようなことをしました:ノードが作成/更新されるたびに実行したいことを実行する関数を記述し、それらの各フックから呼び出します。それはうまくいきます。

6
donut

これを行う正しい方法は、Drupalのdbトランザクションを尊重することです。 hook_node_insertでデータベースアクションを実行する場合は、ノードがまだ実際に保存されていないことを考慮する必要があります。つまり、失敗してロールバックすると、データベースに孤立したデータが残ることになります。したがって、DrupalデータベースAPIを使用する必要があり、クエリの直接実行ではありません。

ノード自体をhook_node_insertで更新する場合、ノードはまだデータベースに保存されておらず、それを呼び出すと例外が発生するため、node_saveを使用できないため、更新できません。 1つの解決策は、register_shutdown_function関数を使用してnidを渡すことです。node_loadを使用してそれが実際に保存されていることを確認し、新しいノードで必要なその他のアクションを実行できます。

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

UPDATE:より簡単な代替案もここで見つけることができます https://stackoverflow.com/a/24035797/1726778

12
Sina Salek

新しいdrupalモジュール、 フックポストアクション があり、ポストセーブフックを追加します。動作するかどうか確認してみましょう。

5
Druvision