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);
            }
        }
    }
}

しかし、製品キットも製品をロードしているため、再帰的なループに陥ります。

私の質問は実際には2つの部分に分かれていると思います。

  1. この投稿のタイトルである質問:この再帰を防ぐにはどうすればよいですか?

  2. とにかく最初の質問におそらく答える少し異なる質問:ノードがロードされているとき、またはプロセスの後半(たとえば、表示または変更時)にこれを行う必要がありますか?

4

4 に答える 4

2

http://drupal.org/project/contemplateというモジュールがあります。そのモジュール内で同様の再帰の問題が発生しましたが、recursion_limitを設定することで回避策を見つけました。

それがあなたの問題を解決するかどうかはわかりませんが、彼らのモジュールを調べて、contemplate_max_recursion_depthのコードを検索することは間違いなく価値があります。それはあなたにいくつかの指針を与えるかもしれません。

それが役に立てば幸い..

于 2011-03-02T13:07:58.437 に答える
0

解決策の1つは、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 に答える
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 に答える
-1

このようなデータのキャッシュを検討する必要があります。常にロードしていると、実際にリソースを浪費する可能性があります。個々のプロジェクトと関連するキットの間の関係を保存できるカスタムモジュールを検討します。

于 2011-02-24T07:40:20.597 に答える