ฉันจะตรวจพบได้เมื่อมีการเปลี่ยนโหนดจาก 'เผยแพร่' เป็น 'ไม่เผยแพร่'


17

ในhook_node_update ()ฉันสามารถบอก 'สถานะ' ของโหนดได้อย่างง่ายดาย (ไม่ว่าจะเผยแพร่หรือไม่ก็ตาม) หลังจากอัปเดตแล้ว

อย่างไรก็ตามมีวิธีที่ง่ายในการตรวจสอบเพื่อดูว่าโหนดที่อัพเดตถูกเผยแพร่ แต่ตอนนี้ไม่ใช่หรือไม่? (หรือในทางกลับกัน)?

ฉันคิดว่ากฎอาจมีเงื่อนไขบางอย่างสำหรับ 'ค่าโหนดเปลี่ยนไป' หรือบางอย่างตามบรรทัดเหล่านั้น แต่ฉันต้องการทำสิ่งนี้โดยทางโปรแกรม

ฉันพบปัญหานี้โดย fago (ผู้พัฒนากฎ) บน drupal.org ที่ดูเหมือนจะจัดการกับสิ่งนี้ใน Drupal 7 แต่คำอธิบายที่ดีจะได้รับการชื่นชม

คำตอบ:


31

ไม่เป็นไร. หลังจากอ่านปัญหาที่ลิงก์ด้านบน (โดยเฉพาะความคิดเห็นที่ 38 ) ฉันพบว่า $ node object (เอนทิตีใด ๆ ) จริง ๆ แล้วเก็บสำเนา 'ต้นฉบับ' แคชไว้ใน $ entity-> original

ดังนั้นฉันต้องการตรวจสอบว่าโหนดเปลี่ยนจาก 'status = 1' เป็น 'status = 0' (เกิดขึ้นเมื่อไม่ได้เผยแพร่โหนด) และรหัสต่อไปนี้ทำสิ่งนี้:

<?php
function custom_node_update($node) {
  if ($node->type == 'article') {
    // Act on the unpublishing of an article.
    if ($node->original->status == 1 && $node->status == 0) {
      // Do something here.
    }
    // Act on the publishing of an article.
    if ($node->original->status == 0 && $node->status == 1) {
      // Do something here.
    }
  }
}
?>

3
ฉันต้องหยุดตอบคำถามของตัวเอง ;-)
geerlingguy

5
ทำไม? มันยังคงเป็นประโยชน์กับฉันคุ้มค่า +1 ;-)
uwe

นี่เป็นครั้งที่ 10 ที่ฉันได้รับคำตอบในผลการค้นหาของ Google ในอนาคตฉันขอบคุณที่ผ่านมาฉันตอบ :)
geerlingguy

โค้ดด้านบนจะไม่ทำงานหากคุณใช้
โมดุล

สำหรับบันทึกสิ่งนี้ไม่สามารถใช้งานได้กับสถานะ + เวิร์กโฟลว์ + การแปลฉันต้องใช้$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Teen

1

node_save() มีรหัสต่อไปนี้

  try {
    // Load the stored entity, if any.
    if (!empty($node->nid) && !isset($node->original)) {
      $node->original = entity_load_unchanged('node', $node->nid);
    }
  }

entity_load_unchanged()โหลดเอนทิตี (ในกรณีนี้คือโหนด) จากฐานข้อมูล มันส่งคืนวัตถุเอนทิตีก่อนการเปลี่ยนแปลงใด ๆ ที่ทำจากโมดูลที่กำลังทำงานอยู่

รหัสจะถูกดำเนินการก่อนที่จะบันทึกล่วงหน้าใด ๆ และการปรับปรุง hooks

module_invoke_all('node_presave', $node);
module_invoke_all('entity_presave', $node, 'node');

//... 

node_invoke($node, $op);

// Save fields.
$function = "field_attach_$op";
$function('node', $node);

module_invoke_all('node_' . $op, $node);
module_invoke_all('entity_' . $op, $node, 'node');

ใน hooks เหล่านั้นเป็นไปได้ที่จะเห็นคุณสมบัติโหนดก่อนการเปลี่ยนแปลงใด ๆ $node->original$node->original->statusตัวอย่างเช่นกับ

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