我正在将Drupal 7与Commerce结合使用,尽管我认为这并不重要。
当实体(我的购物车)更新时,会调用一个钩子(函数)hook_entity_update()
。
我想在这个钩子中重新计算我的运费,问题是一旦重新计算运费再次保存实体,所以它再次调用钩子,让我陷入无限循环。
解决这类问题的最佳方法是什么?
我正在考虑使用一个简单的$ _SESSION变量,比如$ _SESSION ['updating']并在钩子开始时将其设置为TRUE,然后在钩子的末尾再次将其设置为FALSE并阻止该函数如果变量设置为true,则从一开始就返回运行?我不确定这是不是一个好的解决方案?
使用会话变量,因为它是一个表单,并且在提交时似乎多次调用该函数。 不确定常规变量是否有效?
我遇到的一个问题是变量在函数结束时不会被重置,因此函数永远不会被再次调用...
答案 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;
仍然怀疑是否有更好的解决方案?