我正在尝试创建一个节点(B类型)并使用node_save()方法将其分配给A类型节点的CCK节点参考字段.
$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);
Run Code Online (Sandbox Code Playgroud)
结果,将创建一个新的B类型节点,但不会为A类型节点分配任何引用.任何帮助,将不胜感激.
GApple是对的,格式是正确的,但有几件事你可能想要关心.
增量值
首先您需要知道附加的最新节点引用的增量值$node_type_A
,增量实际上是一个部分索引,当与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));
}
Run Code Online (Sandbox Code Playgroud)
添加新参考
我们得到了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));
Run Code Online (Sandbox Code Playgroud)
重新保存更新的节点
可选择调用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);
Run Code Online (Sandbox Code Playgroud)
刷新内容缓存
可能是最重要的部分,这几天就是杀了我.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);
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 ;)
归档时间: |
|
查看次数: |
8205 次 |
最近记录: |