2017-09-12 6 views
0

Drupal 7をCommerceで使用していますが、それは本当に問題ではありません。自身を更新する更新機能の無限ループを防止しますか?

実物(私のショッピングカート)が更新されたときに呼び出されるフック(機能)hook_entity_update()があります。

私はこのフックで船積みを再計算したいのですが、船積みが再計算されるとエンティティを再度保存し、フックを再度呼び出して無限ループに陥るという問題があります。

このような問題を解決するにはどうすればよいでしょうか?

$ _SESSION ['updating']のような単純な$ _SESSION変数を使用して、フックの開始時にTRUEに設定し、フックの最後にもう一度FALSEに設定して、変数がtrueに設定されている場合、関数は最初に戻り値で実行されますか?これが良い解決策であるかどうかは分かりません。

セッション変数を使用するのはフォームなので、関数は送信時に複数回呼び出されたようです。 通常の変数が機能するかどうか不明ですか?私はすでにに実行しているよ

1つの問題は、変数が何らかの形で機能の終了時にリセットされていないので、関数が再び呼び出されることはありませんということです...

+0

'hook_entity_presave()'が適切でしょうか? –

+0

私は同じ問題が起こるだろうか? –

+0

ドキュメント(https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_entity_presave/7.x)を見れば、あなたの求めるもの。 –

答えて

0

セッション変数を使用して動作するようです。機能の開始時に 一つのボタンをクリックしたときに愚かな機能が何とか7回のように呼ばれて...

追加は、この:関数の最後に

 // Check if entity is a commerce_order 
     if ($type != 'commerce_order') { 
     return; 
     } 

     // Only apply if order is still in cart 
     if ($entity->status != 'cart') { 
     return; 
     } 

     if (isset($_SESSION['bab_checkout']['updating']) && 
     $_SESSION['bab_checkout']['updating'] === true) { 
     return; 
     } 
     $_SESSION['bab_checkout']['updating'] = true; 

そして、この:

// We're done updating 
    $_SESSION['bab_checkout']['updating'] = false; 

もっと良い解決策がないのだろうか?

関連する問題