GApple是对的,格式是正确的,但是您可能需要关心一些事情。
Delta值
首先要知道最新的节点引用的delta$node_type_A
值,这个delta实际上是一个部分索引,当与 的vid
字段结合时$node_type_A
,它们成为数据库中节点引用表的索引。换句话说,它是$node_type_B
在 中引用的计数$node_type_A
,好吗?
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);
希望能帮助到你 ;)