Как я могу предотвратить бесконечную рекурсию с помощью Drupal's node_load ()? - PullRequest
0 голосов
/ 24 февраля 2011

Я использую модули Ubercart product и 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 ]

2 голосов
/ 02 марта 2011

Привет, есть модуль с именем http://drupal.org/project/contemplate. У них была похожая проблема рекурсии в этом модуле, но они нашли обходной путь для этого, установив recursion_limit.

Я не уверен, решит ли это вашу проблему, но определенно стоит пройтись по их модулю и найти код для contemplate_max_recursion_depth .Это может дать вам несколько советов.

Надеюсь, это поможет ..

0 голосов
/ 28 февраля 2011

Одно из решений, просто не вызывайте node_load для product_kit, поэтому оно не будет вызывать 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
}
0 голосов
/ 28 февраля 2011

Как насчет этого: Введена проверка переменной рекурсии.

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);
                }
            }
        }
    }
}
0 голосов
/ 24 февраля 2011

вы должны рассмотреть кеширование данных следующим образом.Если вы загружаете его все время, это может истощить ресурсы.Я хотел бы рассмотреть пользовательский модуль, который может хранить отношения между отдельными проектами и связанными наборами.

...