web-gelistirme-sc.com

Bir düğümün 'Yayınlandı' ayarından 'Yayınlanmadı' olarak nasıl değiştiğini nasıl tespit edebilirim?

hook_node_update () içinde, güncellendikten sonra bir düğümün 'durumunu' (yayınlanıp yayınlanmadığını) kolayca söyleyebilirim.

Ancak, güncellenmiş düğümün yayınlanıp yayınlanmadığını kontrol etmenin kolay bir yolu var mı? (Ya da tam tersi)?

Kurallar 'düğüm değeri değişti' için bazı koşullar veya bu satırlar boyunca bir şey olabilir düşünüyorum, ama bunu programlı olarak yapmak istiyorum.

Ben drupal.org üzerinde Drupal 7) ile başa çıkmak gibi görünüyor fago tarafından bu kon (Kuralların geliştiricisi) buldum, ama güzel bir açıklama mutluluk duyacağız.

16
geerlingguy

Boşver. Yukarıda bağlantılı sorunu okuduktan sonra (özellikle comment # 38 ), $ node nesnesinin (aslında herhangi bir varlık) 'original' önbelleğe alınmış kopyayı $ entity-> original içinde sakladığını gördüm.

Bu nedenle, bir düğümün 'status = 1' değerinden 'status = 0' değerine değişip değişmediğini belirlemek istedim (bu, düğüm yayımlanmadığında gerçekleşir) ve aşağıdaki kod bunu yapar:

<?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() aşağıdaki kodu içerir.

  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() varlığı (bu örnekte düğüm) veritabanından yükler; çalışan modüller üzerinde yapılan herhangi bir değişiklikten önce varlık nesnesini döndürür.

Kod, herhangi bir ön kayıt ve güncelleme kancasından önce yürütülür.

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

Bu kancalarda, $node->original 'Da herhangi bir değişiklikten önce, örneğin $node->original->status İle düğüm özelliklerini görmek mümkündür.

1
kiamlaluno