Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Drupal';s node_load()?_Drupal_Drupal 6_Drupal Hooks - Fatal编程技术网

如何使用Drupal';s node_load()?

如何使用Drupal';s node_load()?,drupal,drupal-6,drupal-hooks,Drupal,Drupal 6,Drupal Hooks,我正在使用Ubercart产品和产品套件模块。这是伟大的链接,从相关的产品套件的产品,其中包括,但我也想从个人的产品链接到任何套件,它可能是一部分 我想我可以对SKU/型号进行数据库搜索(轻松完成该部分),然后使用node_load($nid)获取相关工具包 到目前为止,我有: function amh_shop_nodeapi(&$node, $op, $a3 = null, $a4 = null) { if ($node->type == 'product') {

我正在使用Ubercart产品和产品套件模块。这是伟大的链接,从相关的产品套件的产品,其中包括,但我也想从个人的产品链接到任何套件,它可能是一部分

我想我可以对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);
            }
        }
    }
}
但是,由于产品工具包也在加载产品,因此我最终进入了一个递归循环

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

  • 这篇文章的标题是:如何防止这种递归

  • 可能会回答第一个问题的稍微不同的问题:我应该在加载节点时这样做,还是在稍后的过程中(例如,在查看或更改时)这样做


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

    < P>一个解决方案,只是不调用NoDyLoad为产品ToKKIT,因此它不会调用NoDyLoad为子产品,查询需要通过DbQualQuy手动数据:

    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
    }
    

    这是怎么回事:它引入了递归变量检查

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

    嘿,有一个模块叫。他们在该模块中遇到了类似的递归问题,但他们通过设置递归限制找到了解决方法

    我不确定它是否解决了您的问题,但一定值得浏览他们的模块并在代码中搜索沉思\u max\u递归\u depth。这可能会给你一些建议


    希望有帮助。

    并没有真正回答我的任何一个问题。问题是-我想要的不仅仅是产品套件的节点ID和标题,而节点加载似乎是最好的方法,这样可以避免我在需要额外细节时不得不重写查询。。。任何事件-我将这段代码移到了视图OPA,这是一个好主意,但不会促进重用。我将只设置节点ID,并将它们设置为主题层中的链接。2HorusKol,根据我优化drupal的经验,有时调用node_load并不适合每次调用(在这个事件中有太多模块触发),最好使用db_query,如果经常发生这种情况,缓存将有帮助。