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


16

この同じ質問の投稿をいくつか見つけましたが、答えは常に他のトピックに分かれているか、私のニーズに合っていません。

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

私の計画は、機能を独自のメソッドに分離し、両方のフックを実装することですが、Drupalで適切に処理することを学ぼうとしているので、実際に要件に合ったフックがあるかどうか疑問に思っています。

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


3
hook_node_insertand の組み合わせを使用できますhook_node_update(ノードが保存されるたびに動作します)。
-AjitS

はい、上記の投稿で説明しました。
ケニーワイランド

@KennyWylandあなたは言及しましたhook_node_submitが、そうではありませんhook_node_updateか?
デビッドトーマス

あなたにはノードのNIDを取得するhook_node_insertだけでなく、にhook_node_update
スミットマダン

2
hook_node_insert()そしてhook_node_update()、このための正しいフックは、されているhook_node_submit()ノードが保存される前に、フォームの送信処理中に呼ばれています。あなたは明確なキャッシュにあなたがフックを追加/削除する任意の時間を必要とすることを忘れないでください
クライヴ

回答:


5

質問に対するコメントを見ると、明らかな解決策はフックhook_node_insert()とを使用することhook_node_update()です。

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


カッコいい!あなたもこれを行うことができhook_form_alter()ます。drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannxこのメソッドの欠点は、特定のフォームを介してノードが挿入/更新されたときにのみ呼び出されることです。私の場合、ノードのすべての追加と変更をキャッチする必要がありました。
ドーナツ

12

これを行う正しい方法は、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);
  }
} 

更新:/programming//a/24035797/1726778で簡単な代替手段を見つけることもできます


1
良いアイデア。を使用する方が良いですがdrupal_register_shutdown_function()。ただし、両方ともphp- fpm
Shevchuk

ノードがオーガニックグループとして機能しているかどうかを確認できませんでしたog_is_group。この理由で偽陰性になったと思います。
つらら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.