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


17

In hook_node_update () güncellenmesi geçirildikten sonra (Yayınlandıktan dışı olup olmadığı), kolayca bir düğümün 'durumunu' söyleyebilir.

Ancak, güncelleştirilmiş düğüm olmadığını kontrol etmek kolay bir yolu yoktur edildi şimdi değil yayınlanmış ancak? (Ya da tam tersi)?

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

Bu sorunu Drupal 7'de drupal.org'da fago (Kuralların geliştiricisi) ile buldum , Drupal 7'de bununla ilgileniyor gibi görünüyor, ancak güzel bir açıklama takdir edilecektir.

Yanıtlar:


31

Boşver. Yukarıda bağlantılı sorunu okuduktan sonra (özellikle yorum no. 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.
    }
  }
}
?>

3
Kendi sorularıma cevap vermem gerek ;-)
geerlingguy

5
neden? Bu değer, bana hala yararlı oldu 1 ;-) bir
uwe

Heh, bu, Google sonuçlarında kendi cevabımı aldığım 10. kez. Future me cevap için bana geçmiş teşekkürler :)
geerlingguy

Revizyon modülü kullanıyorsanız yukarıdaki kod işe yaramayacaktır
Mohammad Anwar

Kayıt için, bu durum + iş akışı + çeviri için çalışamadı, kullanmak zorundaydım$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Teenage

1

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üllerden 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örneğin herhangi bir değişiklikten önce düğüm özelliklerini görmek mümkündür $node->original->status.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.