防止自我更新的更新功能无限循环?

时间:2017-09-12 08:21:53

标签: php drupal-7 infinite-loop

我正在将Drupal 7与Commerce结合使用,尽管我认为这并不重要。

当实体(我的购物车)更新时,会调用一个钩子(函数)hook_entity_update()

我想在这个钩子中重新计算我的运费,问题是一旦重新计算运费再次保存实体,所以它再次调用钩子,让我陷入无限循环。

解决这类问题的最佳方法是什么?

我正在考虑使用一个简单的$ _SESSION变量,比如$ _SESSION ['updating']并在钩子开始时将其设置为TRUE,然后在钩子的末尾再次将其设置为FALSE并阻止该函数如果变量设置为true,则从一开始就返回运行?我不确定这是不是一个好的解决方案?

使用会话变量,因为它是一个表单,并且在提交时似乎多次调用该函数。 不确定常规变量是否有效?

我遇到的一个问题是变量在函数结束时不会被重置,因此函数永远不会被再次调用...

1 个答案:

答案 0 :(得分: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;

仍然怀疑是否有更好的解决方案?