จะอัพเดตค่าฟิลด์สำหรับโหนดได้อย่างไร?


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 array และฉันจะหาได้อย่างไร

คำตอบ:


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

เอนทิตี wrapper ข้อมูลเมตาเป็นวิธีที่ดีสำหรับการตั้งค่าหรืออ่านค่าของเขตข้อมูลในโหนด!


ฉันชอบ entity_metadata_wrapper bc มันทำให้สิ่งดีและสะอาด ฉันจะรวมการตรวจสอบว่า $ node มีอยู่หลังจาก node_load () เพื่อหลีกเลี่ยงข้อผิดพลาดที่น่ารังเกียจเมื่อตั้งใจส่งผ่าน NULL ไปที่เอนทิตีเมทาดาทา_wrapper ()
texas-bronius

คุณสามารถส่ง $ nid ไปยัง EMW ได้โดยตรง
nawfal

การใช้ entity_metadata_wrapper ควรเป็นคำตอบที่ยอมรับได้
akalata

2
ในกรณีที่ผู้อื่นไม่เห็นได้ชัดเจนเอนทิตีแบบเมทาดาทา_wrapper () เป็นส่วนหนึ่งของโมดูลเอ็นติตี้ API: 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 จึงลดลง?
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

หากคุณต้องการที่จะปรับปรุงค่าของฟิลด์เท่านั้น (โดยไม่มีการปรับปรุงข้อมูลเมตาโหนดเกี่ยวกับเวลาการปรับปรุงแก้ไข) 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';

ไม่ทำงาน.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.