Программное изменение значения поля без вызова entity_save()

Пример программного изменения значения поля field_category у материала типа article:

Способ 1

$node = node_load(123);
$node->original = $node;
$node->field_category['und'][0]['tid'] = 345;
foreach (field_info_instances('node', 'article') as $field_name => $field_info) {
  if ($field_name != 'field_category') {
    unset($node->{$field_name});
  }
}
field_attach_presave('node', $node);
field_attach_update('node', $node);

Замечание: обнуляет значения полей типа File или Image. Обойти баг можно не удаляя из $node эти поля.

По материалам Saving node's fields without saving the node itself.

Способ 2

$node = node_load(123);
$info = field_info_field('field_category');
$fields = array($info['id']);
field_sql_storage_field_storage_write('node', $node, 'update', $fields);
cache_clear_all("field:{$node->type}:{$node->nid}", 'cache_field');

Замечание: при таком способе не вызывается никаких хуков из Field API, т.е. обновлённое поле не будет проиндексировано и т.п.

Написанное актуально для
Drupal 7
Теги:
оптимизация, работа с нодами, работа с полями, работа с сущностями
Добавлено: 30 Июля 2018 08:13:08 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...