it-swarm-id.com

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

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

Namun, apakah ada cara mudah untuk memeriksa untuk melihat apakah simpul yang diperbarui telah diterbitkan, tetapi sekarang tidak? (Atau sebaliknya)?

Saya pikir Aturan mungkin memiliki beberapa kondisi untuk 'nilai simpul telah berubah' atau sesuatu di sepanjang garis itu, tetapi 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 dihargai.

16
geerlingguy

Sudahlah. Setelah membaca masalah yang terhubung 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.
    }
  }
}
?>
31
geerlingguy

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 node) dari database; mengembalikan objek entitas sebelum perubahan yang dibuat dari modul yang berjalan.

Kode dijalankan 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 dalam $node->original, Misalnya dengan $node->original->status.

1
kiamlaluno