Як я можу виявити, коли вузол змінюється з "Опубліковано" на "Неопубліковано"?


17

У mook_node_update () я можу легко сказати "стан" вузла (опублікований він чи ні) після його оновлення.

Однак чи існує простий спосіб перевірити, чи було опубліковано оновлений вузол , але зараз це не так? (Або навпаки)?

Я думаю, що правила можуть мати певну умову, коли «значення вузла змінилося» або щось подібне, але я б хотів це зробити програмно.

Я знайшов цю проблему від fago (розробника Правил) на drupal.org, який, схоже, має справу з цим у Drupal 7, але приємне пояснення було б вдячно.

Відповіді:


31

Не зважай. Прочитавши проблему, зв'язану вище (особливо коментар № 38 ), я виявив, що об’єкт $ node (будь-яка сутність, власне) зберігає "оригінальну" кешовану копію в $ object-> оригіналі.

Отже, я хотів визначити, чи змінився вузол з '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

Наведений вище код не працює, якщо ви використовуєте модуль ревізії
Mohammad Anwar

Для запису, це не могло не працювати для статусу + робочий процес + переклад, мені довелося скористатися$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Підліток

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()завантажує сутність (у цьому випадку вузол) з бази даних; він повертає об'єкт сутності перед будь-якими змінами, внесеними із запущених модулів.

Код виконується перед будь-якими гачками попереднього збереження та оновлення.

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

У цих гачках можна побачити властивості вузла перед будь-якими змінами $node->original, наприклад, з $node->original->status.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.