如何使用Drupal';s node_load()?
我正在使用Ubercart产品和产品套件模块。这是伟大的链接,从相关的产品套件的产品,其中包括,但我也想从个人的产品链接到任何套件,它可能是一部分 我想我可以对SKU/型号进行数据库搜索(轻松完成该部分),然后使用node_load($nid)获取相关工具包 到目前为止,我有:如何使用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') {
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,如果经常发生这种情况,缓存将有帮助。