- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试创建一个节点(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_A
的vid
字段,它们成为数据库中节点引用表的索引。换句话说,它是 $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/
我有一个自定义的 Drupal FAPI 表单,它支持相当复杂的工作流程,我想向其中添加一个 Nodereference 字段。尽管我发现有人在自定义表单上包含 Nodereference 字段,但我
我有一个疑问: var results = new CypherFluentQuery(_client) .Start("n", (NodeReference)0) .M
使用 cck 节点引用的自动完成字段始终将节点 ID 显示为隐蔽的括号扩展: Page Title [nid:23] 我知道这可以确保在节点具有相同标题的情况下选择是唯一的,但显然这对用户来说是一件令
这是我的问题。我在我的 Neo4j 人员列表中插入(具有唯一标识符)并在他们之间创建关系。 知道这个人是否已经存在于 Neo4j 中然后创建/更新它的最有效方法是什么?由于 Neo4jclient 不
我正在尝试创建一个节点(B 类型)并使用 node_save() 方法将其分配给 A 类型节点的 CCK nodereference 字段。 $node_type_A = node_load($som
我是一名优秀的程序员,十分优秀!