为什么entity_metadata_wrapper-> save()无法更新节点的修订版?


8

我正在开发一个模块来更新节点(启用修订版)。看起来像这样。

 $nodes = node_load_multiple(array(), array('type' => $bundleType));
 foreach ($ndoes as $node){
    $w = entity_metadata_wrapper('node',$node);
    $w->MyFields->set($someValue);
    $w->save();
 }

它正确设置了字段,但是节点的版本号在之后没有改变$w->save()

如何更新修订版本ID?


是否在create new revision节点上为内容类型设置了标志?$w->revision->set(1);保存之前是否尝试过?....
tenken 2014年

是的,“创建新修订”已打开。我不太了解$w->revision->set(1),这是让drupal知道节点已更新的手动方法吗?我会试试。
竹春2014年

嗯,$w->revision->set()工作。看来我误会了$w->save()。我认为它应该在保存时自动增加版本号。无论如何,有没有获得下一个修订版本编号?谢谢
zhuchun 2014年

否,revision->set(1)告诉节点在节点的当前/当前编辑中记录新修订。我不确定为什么元数据包装程序没有看到创建新修订版本的全局设置.....,但是正如您现在看到的那样,设置修订版本标志是一个非常简单的解决方法。如果您愿意投票支持我的评论,以供以后其他用户找到正确的答案,请在下面提供我的评论。
Tenken 16:09

Answers:


6

是否在节点上为内容类型设置了创建新的修订标记?您是否尝试过像$ w-> revision-> set(1); 保存之前?....

编辑:

作者说设置$w->revision->set(1)可以解决他的问题。


这是一个简单的解决方法!只是不明白为什么需要它。谢谢!
zhuchun 2014年

10

通过UI编辑节点时,是通过完成的node_form()。这在的顶部附近有一个调用node_object_prepare(),它为该节点设置默认值。这包括设置默认值$node->revision,用于node_save()确定是否需要新修订。

实体API可以识别修订,但是node_object_prepare()是特定于节点的。这意味着您需要自己管理值,包括设置版本属性以模仿节点编辑表单将执行的操作。


7

这些答案实际上都不正确,这样->set(1)做听起来像是您实际上在更改修订版本号,因此应该增加它。

这实际上只是一个布尔标志,所以正确的答案是 $node->revision->set(true);

正如zhuchun所说:他不明白为什么需要它,当解释为布尔值标志时,它比数字更有意义。


曾经有一段时间创建新的drupal内容涉及到最容易调用的事情drupal_submit_form。如果检查节点提交表单的POST值,则会revision = 1在POST字段中看到类似的内容,因为create new revision选中了“表单项” 框。由于1 == TRUE代码无论哪种方式都可以工作。但是,您的观点是正确的。
Tenken

这应该被接受的答案
Alex Skrypnyk '17


0

如果默认情况下节点类型未启用修订,则请求新修订的最简洁方法是:

$w->revision = TRUE;

与使用完全相同:

$w->revision->set(TRUE);

但所需的打字次数更少。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.