gpt4 book ai didi

php - Drupal - 如何以编程方式更新 CCK NodeReference 字段?

转载 作者:可可西里 更新时间:2023-11-01 12:48:48 26 4
gpt4 key购买 nike

我正在尝试创建一个节点(B 类型)并使用 node_save() 方法将其分配给 A 类型节点的 CCK nodereference 字段。

$node_type_A = node_load($some_nid);
$node_type_A->field_type_B_node_ref[]['nid'] = $node_type_B_nid;

$node_type_A = node_submit($node_type_A);
node_save($node_type_A);

因此,将创建一个新的 B 类型节点,但不会为 A 类型节点分配任何引用。任何帮助将不胜感激。

最佳答案

GApple是的,格式是正确的,但是您可能需要关心几件事。

增量值
首先你需要知道附加到$node_type_A的最新节点引用的delta值,delta实际上是一个部分索引,当与$node_type_Avid字段,它们成为数据库中节点引用表的索引。换句话说,它是 $node_type_A 中引用的 $node_type_B 的计数,好吗?

GApple又是对的,你必须准确地说出在哪里添加新的引用。当您获得 delta 值时,您可以准确地说出在何处附加 (delta+1) 新引用。在这里:

function get_current_delta($node_vid){
return db_result(db_query("SELECT delta FROM {content_field_type_A_node_ref}
WHERE vid = '%d'
ORDER BY delta DESC
LIMIT 1", $node_vid));
}

添加新引用
我们得到了 delta!所以我们可以将新的 $node_type_B 节点附加到我们的 $node_type_A 节点:

// Loading type_A node.
$node_type_A = node_load($some_nid);

// Getting current delta value.
$current_delta = get_current_delta($node_type_A->vid);

// "Appending" a node reference based on delta.
$node_type_A->field_type_B_node_ref += array($current_delta + 1 => array('nid' => $node_type_B_nid));

重新保存更新的节点
可选择调用 node_submit() 来填充节点对象中的一些基本字段,并使用 node_save() 保存它。毕竟,您需要调用 content_insert()使节点及其 CCK 字段完全保存在一旁:

// Resaving the updated node.
$node_type_A = node_submit($node_type_A);
node_save($node_type_A);
content_insert($node_type_A);

刷新内容缓存
可能是最重要的部分,这让我丧命了几天。 CCK在数据库中有一张缓存表cache_content (看一下它的结构),重新保存更新后的节点后,你会发现中没有任何变化>$node_type_A 主题输出,即使表已更新。我们必须从该内容缓存表中删除一条记录,这将强制 Drupal 显示数据的最新快照。您可以将以下内容定义为函数:

db_query("DELETE FROM {cache_content} WHERE cid = '%s'", 'content:' . $node_type_A->nid . ':' . $node_type_A->vid);

希望对您有所帮助;)

关于php - Drupal - 如何以编程方式更新 CCK NodeReference 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com