อัพเดตค่าของฟิลด์โดยทางโปรแกรม


14

ฉันต้องการอัปเดตค่าของเขตข้อมูลโหนดเมื่อมีการอัปเดตโหนด

พยายามใช้รหัสที่กล่าวถึงที่นี่โดยทางโปรแกรมอัพเดตโหนด Drupal 8

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

แต่มันไม่ทำงาน ฉันได้รับข้อผิดพลาด 500 หลังจากบันทึกโหนด ฉันยังลองใช้คำสั่ง if และระบุ node id$node = Node::load(1);

ฉันยังลองใช้อัปเดตโหนด / Entity โดยทางโปรแกรมใน Drupal 8

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

แต่ก็ไม่มีโชคเช่นกัน

นอกจากนี้ฉันพยายามใช้ hooks เอนทิตี้ที่แตกต่างกัน, เอนทิตี, อัปโหลด, ต่อม แต่ไม่ได้สร้างความแตกต่างใด ๆ

คำตอบ:


25

คุณสามารถลองรหัสนี้:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}

ขอบคุณการทำงานนี้หากใครต้องการเพิ่มรูปแบบอื่น ๆ ที่เป็นไปได้อย่าลังเลที่จะเพิ่มคำตอบอื่น
ไม่ Sssweat

1
@ NoSssweat: ฉันถูกสมมติว่าบรรทัดที่มี "เนื้อหา" ในรหัสที่แสดงในคำตอบนี้ไม่จำเป็นจริงๆที่จะตอบคำถามของคุณ? และบรรทัดนี้ค่อนข้างแสดงให้เห็นว่าคุณสามารถทำสิ่งที่คล้ายกันกับร่างกาย (เช่น) ได้อย่างไร นอกจากนี้เนื่องจากคำถามของคุณเกี่ยวกับ "ฟิลด์" คุณสามารถใช้บรรทัดที่คล้ายกันเป็นบรรทัดที่มี "เนื้อหา" สำหรับฟิลด์ที่กำหนดเองด้วยชื่อเครื่อง (พูด) field_my_extra_field ได้ไหม? ขออภัยสำหรับสิ่งที่ดูเหมือนว่าการแย่งชิงคำตอบเพื่อถามคำถามใหม่ แต่เพียงแค่ "แสดงรหัส" ในคำตอบ (โดยไม่มีคำอธิบายเลย) ก็ไม่ถือว่าเป็นการปฏิบัติที่ดีรอบ ๆ ที่นี่ใช่ไหม?
Pierre.Vriens

1
@ Pierre.Vriens ฉันใช้ชื่อใน Q ของฉันเพื่อความเรียบง่าย ฉันคิดว่าถ้าฉันรู้วิธีเปลี่ยนชื่อมันจะเหมือนกันกับทุกฟิลด์เพียงแค่เปลี่ยนชื่อเครื่อง ปรากฎว่าคำตอบนี้ใช้วิธีการเฉพาะเพื่อเปลี่ยนชื่อเรื่องซึ่งจะไม่ทำงานสำหรับเขตข้อมูลอื่น ๆ ดังนั้นจึงเป็นสิ่งสำคัญจริง ๆ ที่เขาแสดงวิธีการสำหรับร่างกาย
ไม่มี Sssweat

ฉันไม่สามารถเอาเบ็ดนี้ไปยิงได้ ฉันแก้ไขประเภทเนื้อหาคลิกส่ง แต่ไม่มีอะไร
นาย Pablo

7

นี่คือรูปแบบอื่นโดยใช้ตะขอที่คุณพยายามใช้

ฉันคิดว่าปัญหาเกี่ยวกับรหัสของคุณคือคุณพยายามโหลดอินสแตนซ์ใหม่ของโหนด แต่คุณควรใช้โหนดที่ให้ไว้เป็นพารามิเตอร์$entity:

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

แก้ไข:

เพิ่มคำสั่งการใช้งานให้กับโค้ด


1
เพิ่งลองใช้รหัสของคุณ แต่มันกำลังทำลายไซต์รับความคลาสสิคThe website encountered an unexpected error. Please try again later.
ไม่มี Sssweat

1
รหัสนี้เป็นเพียงการสาธิตวิธีการใช้เบ็ด คุณต้องการใบแจ้งยอดการใช้งานที่ถูกต้อง คุณสามารถค้นหาสิ่งนี้ได้ถ้าคุณดูใน watchdog (/ admin / reports / dblog)
4k4

1
การเพิ่มuse Drupal\node\NodeInterface;โค้ดจะไม่ทำให้ไซต์หยุดโดยอัตโนมัติอีกต่อไป แต่หลังจากบันทึกโหนดฉันได้รับข้อผิดพลาด 500 อย่างที่ฉันได้รับในคำถามและบันทึกไม่ได้บันทึกอะไรเกี่ยวกับมัน
ไม่มี Sssweat

1
ฉันแค่ต้องการชี้ปัญหา: อย่าโหลดอินสแตนซ์ใหม่ของโหนด แต่ใช้อันที่ให้มาเป็นพารามิเตอร์ฟังก์ชั่น ข้อผิดพลาดอะไรที่อยู่เบื้องหลัง 500 โปรดตรวจสอบไฟล์บันทึกของคุณหรือเปิดการบันทึกข้อผิดพลาด
4k4

1
ฉันล้างบันทึกดังนั้นฉันจึงไม่สับสนกับข้อผิดพลาดก่อนหน้าอื่น ๆ ทั้งหมด แต่หลังจากบันทึกและรับข้อผิดพลาดหลายครั้งไฟล์บันทึกว่างเปล่า
ไม่ Sssweat

3

ชื่อใน Drupal 8 ไม่ได้ถูกตั้งค่าเหมือนฟิลด์มาตรฐาน พวกเขามีฟังก์ชั่นของตัวเอง ใช้$node->setTitle('New Title');สำหรับโหนดหรือ$entity->setLabel('New Title');สำหรับเอนทิตีทั่วไป ดูNode :: setTitleสำหรับข้อมูลเพิ่มเติม

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