0

我正在使用 Ubercart 产品和 product_kit 模块。这非常适合从相关产品套件链接到包含的产品,但我也想从单个产品链接到它可能属于的任何套件。

我想我可以对 SKU/型号进行数据库搜索(轻松完成该部分),然后使用 node_load($nid) 获取相关套件。

到目前为止我有这个:

function amh_shop_nodeapi(&$node, $op, $a3 = null, $a4 = null)
{
    if ($node->type == 'product') {
        if ($op == 'load') {
            error_log("product::load");

            $bundles = array();
            $results = db_query('SELECT DISTINCT n.nid FROM {node} n RIGHT JOIN {uc_products} up ON up.nid = n.nid WHERE up.model LIKE "%s /%" OR up.model LIKE "%/ %s /%" OR up.model LIKE "%/ %s"', $node->model, $node->model, $node->model);

            while ($bundle = db_fetch_object($results)) {
                error_log("bundle::load");
                $bundles[] = node_load($bundle->nid);
            }
        }
    }
}

但是,因为产品套件也在加载产品,所以我最终陷入了递归循环。

我想我的问题实际上分为两部分:

  1. 这篇文章标题的问题是:如何防止这种递归?

  2. 稍微不同的问题可能会回答第一个问题:我应该在加载节点时执行此操作,还是在此过程的后期(例如,查看或更改)?

4

4 回答 4

2

嘿,有一个名为http://drupal.org/project/contemplate的模块。他们在该模块中遇到了类似的递归问题,但他们通过设置 recursion_limit 找到了解决方法。

我不确定它是否能解决您的问题,但绝对值得通过他们的模块并搜索contemplate_max_recursion_depth的代码。这可能会给你一些指示。

希望能帮助到你..

于 2011-03-02T13:07:58.437 回答
0

怎么样:它引入了递归变量检查。

function amh_shop_nodeapi(&$node, $op, $a3 = null, $a4 = null)
{
  static $recursion_nid = NULL;
    if ($node->type == 'product') {
        if ($op == 'load') {
            error_log("product::load");

            $bundles = array();
            $results = db_query('SELECT DISTINCT n.nid FROM {node} n RIGHT JOIN {uc_products} up ON up.nid = n.nid WHERE up.model LIKE "%s /%" OR up.model LIKE "%/ %s /%" OR up.model LIKE "%/ %s"', $node->model, $node->model, $node->model);

            while ($bundle = db_fetch_object($results)) {
                error_log("bundle::load");
                if (isset($recursion_nid) && $recursion_nid == $nid) {
                   // recursion detected
                }
                else {
                  $recursion_nid = $node->nid;
                  $bundles[] = node_load($bundle->nid);
                  unset($recursion_nid);
                }
            }
        }
    }
}
于 2011-02-28T11:56:33.460 回答
0

解决方案之一,product_kit不调用node_load,子产品不调用node_load,通过db_query手动查询需要的数据:

function amh_shop_nodeapi(&$node, $op, $a3 = null, $a4 = null)
{
    if ($node->type == 'product') {
        if ($op == 'load') {
            $bundles = array();
            $results = db_query('SELECT n.nid, n.title FROM {node} n INNER JOIN {uc_product_kits} k ON n.nid=k.nid WHERE n.product_id=%d ORDER BY n.title', $node->nid);
            while ($bundle = db_fetch_object($results)) {
                $bundles[] = l($bundle->title, 'node/'.$bundle->nid);
            }
        }
    }
    $node->amh_bundles = $bundles; // Here's array of links to product_kits
}
于 2011-02-28T08:06:13.017 回答
-1

您应该考虑像这样缓存数据。如果你一直在加载它,它真的会消耗资源。我会考虑一个自定义模块,它可以存储单个项目和相关套件之间的关系。

于 2011-02-24T07:40:20.597 回答