Bagaimana saya bisa mendeteksi ketika sebuah node diubah dari 'Diterbitkan' ke 'Tidak Diterbitkan'?

17

Di hook_node_update () , saya dapat dengan mudah memberi tahu 'status' sebuah simpul (apakah itu diterbitkan atau tidak) setelah diperbarui.

Namun, ada cara mudah untuk memeriksa untuk melihat apakah node diperbarui itu diterbitkan, tapi sekarang tidak? (Atau sebaliknya)?

Saya pikir Aturan mungkin memiliki beberapa kondisi untuk 'nilai simpul telah berubah' atau sesuatu di sepanjang garis itu, tapi saya ingin melakukan ini secara terprogram.

Saya menemukan masalah ini oleh fago (pengembang Aturan) di drupal.org yang tampaknya berurusan dengan ini di Drupal 7, tetapi penjelasan yang bagus akan sangat dihargai.

geerlingguy
sumber

Jawaban:

31

Lupakan. Setelah membaca masalah yang terkait di atas (terutama komentar # 38 ), saya menemukan bahwa objek $ node (entitas apa pun, sebenarnya) menyimpan salinan cache 'asli' dalam $ entity-> asli.

Jadi, saya ingin mendeteksi apakah suatu node berubah dari 'status = 1' ke 'status = 0' (ini terjadi ketika node tidak dipublikasikan), dan kode berikut melakukan ini:

<?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.
    }
  }
}
?>
geerlingguy
sumber
3
Saya harus berhenti menjawab pertanyaan saya sendiri ;-)
geerlingguy
5
Mengapa? Itu masih membantu saya, bernilai +1 ;-)
uwe
Heh, ini tentang ke 10 kalinya saya mendapatkan jawaban saya sendiri di hasil Google. Masa depan saya terima kasih melewati saya untuk menjawab :)
geerlingguy
Kode di atas tidak akan berfungsi jika Anda menggunakan modul revisi
Mohammad Anwar
Sebagai catatan, ini tidak bisa tidak berfungsi untuk status + alur kerja + terjemahan, saya harus menggunakan$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Remaja
1

node_save() berisi kode berikut.

  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()memuat entitas (dalam hal ini simpul) dari database; mengembalikan objek entitas sebelum perubahan yang dibuat dari modul yang berjalan.

Kode ini dieksekusi sebelum pra-simpan, dan perbarui kait.

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

Di kait itu, dimungkinkan untuk melihat properti simpul sebelum ada perubahan $node->original, misalnya dengan $node->original->status.

kiamlaluno
sumber