Bagaimana cara memperbarui nilai bidang untuk sebuah simpul?


21

Saya ingin mengubah nilai bidang untuk sebuah simpul. Saya menggunakan kode berikut:


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

Masalahnya adalah $node->languagekembali essaat berada di print_r($node)dalamnya und. Mengapa $node->languageberbeda dari apa yang ada di array $ node dan bagaimana saya bisa mendapatkannya?

Jawaban:


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

Pembungkus metadata entitas adalah cara terbaik untuk menetapkan atau membaca nilai bidang di simpul!


Saya lebih suka entity_metadata_wrapper bc itu membuat hal-hal bagus dan bersih. Saya akan menyertakan pemeriksaan untuk apakah $ node ada setelah node_load () untuk menghindari kesalahan buruk ketika secara tidak sengaja mengirimkan NULL ke dalam entity_metadata_wrapper ().
texas-bronius

Anda dapat langsung mengirimkan $ nid ke EMW.
nawfal

menggunakan entitas_metadata_wrapper harus menjadi jawaban yang diterima.
akalata

2
Jika tidak jelas bagi orang lain, entity_metadata_wrapper () adalah bagian dari modul Entity API: drupal.org/project/entity
BWPanda

9

Coba field_attach_update()fungsinya.

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

Ini akan memperbarui nilai bidang dan berkinerja lebih baik daripada node_save.


1
mengapa field_attach_update downvoted?
milkovsky

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

Jika Anda ingin memperbarui hanya nilai bidang (tanpa memperbarui metadata simpul tentang waktu yang diperbarui, revisi) gunakan fungsi field_attach_update().

Contoh:

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

Kadang-kadang tambahan Anda mungkin perlu mengatur ulang cache statis node dengan resetCache(array($nid)):

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

Sumber: Menyimpan bidang simpul tanpa menyimpan simpul itu sendiri


2

Saya baru saja mengimplementasikan ini dan menemukan bahwa kode ini bekerja untuk saya.

$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);
}

Perhatikan bahwa saya ketika memperbarui field_fieldname saya menemukan bahwa menggunakan ini di baris 4

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

tidak bekerja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.