我正在尝试创建一个节点(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);因此,将创建一个新的B类型节点,但不会将任何引用分配给A类型节点。任何帮助都将不胜感激。
发布于 2010-05-05 22:52:15
GApple是对的,格式是正确的,但是有几件事你可能想要关心。
增量值
首先你需要知道附加到$node_type_A的最新节点引用的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));
}添加新的引用
我们找到德尔塔了!因此,我们可以将新的$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字段的asidelong:
// Resaving the updated node.
$node_type_A = node_submit($node_type_A);
node_save($node_type_A);
content_insert($node_type_A);刷新内容缓存
可能是最重要的部分,这让我痛苦了好几天。$node_type_A在数据库中有一个名为CCK的缓存表(看看它的结构),在重新保存更新后的节点后,您将注意到,即使表已经更新,CCK主题输出中也没有任何变化。我们必须从该内容缓存表中删除一条记录,这将强制Drupal显示数据的最新快照。您可以将以下内容定义为函数:
db_query("DELETE FROM {cache_content} WHERE cid = '%s'", 'content:' . $node_type_A->nid . ':' . $node_type_A->vid);希望它能有所帮助;)
发布于 2010-04-28 03:46:53
我刚刚检查了我自己的一个模块,它为对象格式做了一些类似的事情,$node_type_A->field_type_B_node_ref[]['nid']应该是正确的。
需要检查的一件事是,当您加载节点时,CCK可能会使用空值预先填充节点引用数组。如果您已将该字段配置为只允许一个值,则通过使用数组追加运算符(field_type_B_node_ref[]),它将创建另一个将被忽略的条目(field_type_B_node_ref[1]),而不是覆盖现有值(field_type_B_node_ref[0])。如果可能,请尝试显式指定数组键。
发布于 2012-03-31 12:54:35
很好的帖子,但有一个更正:不要通过手动查询数据库来刷新缓存项。如果有人正在使用memcache或任何其他外部缓存,它将失败。
cache_clear_all()是你的清理朋友。
建议的代码,直接来自CCK模块:
cache_clear_all('content:'. $node_type_A->nid .':'. $node_type_A->vid, content_cache_tablename());https://stackoverflow.com/questions/2723574
复制相似问题