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

Drupal - How to update a CCK NodeReference field programmatically?

我正在尝试创建一个节点(B型)


GApple是正确的,格式正确,但是您可能需要注意几件事。

增量值
首先,您需要知道附加到$node_type_A的最新节点引用的增量值,该增量实际上是部分索引,当与$node_type_Avid字段组合时,它们将成为节点引用表中的索引。数据库。换句话说,它是$node_type_A中引用的$node_type_B的计数,好吗?

GApple再次正确,您必须确切地说出在哪里添加新参考。当您获得该增量值时,您可以确切地说出将新引用附加到何处(增量1)。在这里是:

1
2
3
4
5
6
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节点:

1
2
3
4
5
6
7
8
// 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字段完全保存在一边:

1
2
3
4
// 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显示数据的最新快照。您可以将以下内容定义为函数:

1
db_query("DELETE FROM {cache_content} WHERE cid = '%s'", 'content:' . $node_type_A->nid . ':' . $node_type_A->vid);

希望有帮助;)


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


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

cache_clear_all()是您清除的朋友。

建议的代码,直接从CCK模块获取:

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

"刷新内容缓存"这对我有用,尤其是当您从node_load()获取数据时。


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