如何更新节点的字段值?


21

我想更改节点的字段值。我使用以下代码:


$node = node_load($nid); // $nid is the function's parameter
$node->field['field_myfield'][$node->language][0]['value'] = 1;
node_save($node);

问题是$node->language回报es,而在print_r($node)它的und。为什么$node->language$ node数组有什么不同,我如何得到它?

Answers:


41
$node = node_load($nid);
$node_wrapper = entity_metadata_wrapper('node', $node);
$node_wrapper->field_myfield->set(1);
$node_wrapper->save();

实体元数据包装器是设置或读取节点中字段值的好方法!


我更喜欢entity_metadata_wrapper bc,它确实使事情变得干净整洁。我将检查在node_load()之后是否存在$ node,以免在无意中将NULL传递给entity_metadata_wrapper()时出现讨厌的错误。
德州-布鲁尼乌斯2014年

您可以直接将$ nid传递给EMW。
nawfal

使用entity_metadata_wrapper应该是公认的答案。
akalata '16

2
如果对其他人不明显,entity_metadata_wrapper()是Entity API模块的一部分:drupal.org/project/entity
BWPanda

9

尝试field_attach_update()功能。

$node = node_load($nid); // $nid is the function's parameter
$node->field['field_myfield'][LANGUAGE_NONE][0]['value'] = 1;
field_attach_update('node', $node);

它将更新该字段的值,并且效果优于node_save


1
为什么field_attach_update被拒绝?
milkovsky '16

6
$node = node_load($nid); 
$field_language = field_language('node', $node, 'field_myfield');
$node->field['field_myfield'][$field_language][0]['value'] = 1;
node_save($node);

4

如果只想更新字段值(不更新有关更新时间,修订的节点元数据),请使用function field_attach_update()

例:

$node = node_load($nid);
$field_language = field_language('node', $node, 'field_myfield');
$node->field_fieldname[$field_language][0]['value'] = 'some value';
field_attach_update('node', $node);

有时,您可能还需要使用以下命令重置节点静态缓存resetCache(array($nid))

entity_get_controller('node')->resetCache(array($node->nid));

来源:保存节点的字段而不保存节点本身


2

我刚刚实现了这一点,发现该代码对我有用。

$node = node_load($nid); 
if (isset($node)) {
  $field_language = field_language('node', $node, 'field_myfield');
  $node->field_fieldname[$field_language][0]['value'] = 'some value';
  node_save($node);
}

请注意,我在更新field_fieldname时发现在第4行中使用它

$node->field['field_myfield'][0]['value'] = 'some value';

不工作。

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.