Как обновить значение поля для узла?


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 и как его получить?

Ответы:


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

Обертка метаданных сущности - отличный способ установить или прочитать значения полей в узле!


Я предпочитаю entity_metadata_wrapper, потому что он делает вещи красивыми и чистыми. Я бы включил проверку того, существует ли $ node после node_load (), чтобы избежать неприятной ошибки при непреднамеренной передаче NULL в entity_metadata_wrapper ().
техас-брониус

Вы можете напрямую передать $ nid в EMW.
Nawfal

использование entity_metadata_wrapper должно быть принятым ответом.
akalata

2
В случае, если это не очевидно для других, entity_metadata_wrapper () является частью модуля API Entity: 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 недооценено?
Милковский

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

Если вы хотите обновить только значение поля (без обновления метаданных узла об обновленном времени, ревизиях), используйте функцию 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';

не работал.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.