Я б точно пішов field_attach_update
.
Ідея проста. Просто завантажте вузол і збережіть його за допомогою field_attach_update.
Наприклад:
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Це не змінить жодної часової позначки чи будь-якого іншого гака, до якого зазвичай запускається node_save. Завантаження вузла також викликає деякі гачки, так що, ймовірно, це не так ефективно.
Якщо у вас nid, і якщо структура вузла мертва проста, ви можете це зробити так само:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
У будь-якому разі, якщо ви намагаєтесь оновити що-небудь, крім поля, це не допоможе (статус коментаря, опублікований стан тощо). Крім того, якщо ви використовуєте node_save, кеш для конкретного вузла буде автоматично очищений для різних методів, нам потрібно очистити його за допомогою "entit_get_controller".
Оновлення:
Очевидно, що вам слід також зателефонувати, field_attach_presave()
щоб інші модулі могли належним чином обробити введення поля. Наприклад, файловий модуль використовує його для встановлення постійного стану файлу за допомогою цього гака. Я оновив свої 2 приклади вище.
field_attach_update
?