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


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();

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


Я вважаю за краще ent_metadata_wrapper bc, але це робить речі красивими та чистими. Я б включив перевірку на те, чи існує $ node після node_load (), щоб уникнути неприємної помилки при ненавмисному переході NULL до ent_metadata_wrapper ().
texas-bronius

Ви можете безпосередньо передати $ nid EMW.
nawfal

використовуючи entit_metadata_wrapper, слід прийняти відповідь.
акалата

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.