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

时间:2010-04-27 17:42:48

标签: php drupal drupal-6 cck

我正在尝试创建一个节点(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类型节点分配任何引用。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:6)

GApple是对的,格式是正确的,但有几件事你可能想要关心。

Delta Value
首先,您需要知道附加到$node_type_A的最新节点引用的 delta 值, delta 实际上是部分索引,当与{{1}结合使用时在vid的字段中,它们成为数据库中节点引用表的索引。换句话说,它是$node_type_A中引用的$node_type_B的计数,好吗?

GApple再次正确,您必须确切地说明添加新引用的位置。当您获得 delta 值时,您可以准确地说明在哪里附加(delta + 1)新引用。这是:

$node_type_A

添加新参考
我们得到了 delta !所以我们可以将新的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()进行保存。毕竟,您需要调用content_insert()以使节点完全保存在其CCK字段之外:

node_save()

刷新内容缓存
可能是最重要的部分,这几天就是杀了我。 CCK在数据库中有一个名为// Resaving the updated node. $node_type_A = node_submit($node_type_A); node_save($node_type_A); content_insert($node_type_A); 的缓存表(看一下它的结构),在重新保存更新后的节点后,你会注意到cache_content中没有任何变化主题输出即使表更新。我们必须从该内容缓存表中删除一条记录,这将迫使Drupal显示数据的最新快照。您可以将以下内容定义为函数:

$node_type_A

希望它有所帮助;)

答案 1 :(得分:4)

我刚检查了一个我自己的模块,它们对对象格式做了类似的事情,$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])。如果可能,尝试显式指定数组键。

答案 2 :(得分:3)

很棒的帖子,但有一个更正:不要通过手动查询数据库来刷新缓存条目。如果有人使用内存缓存或任何其他外部缓存,它将会失败。

cache_clear_all()是您清理的朋友。

建议代码,直接来自CCK模块:

cache_clear_all('content:'. $node_type_A->nid .':'. $node_type_A->vid, content_cache_tablename());

答案 3 :(得分:0)

我将CCK存储节点引用显示为$node->field_node_reference[0]['items'][0]['nid'],而不是$node->field_node_reference[0]['nid']。你尝试过模仿吗?

答案 4 :(得分:0)

“刷新内容缓存”这对我有用,特别是如果从node_load()获取数据