Как я могу определить, когда узел меняется с «Опубликован» на «Неопубликован»?


17

В hook_node_update () я могу легко определить «состояние» узла (опубликован он или нет) после его обновления.

Однако, есть простой способ проверить, если обновленный узел был опубликован, но теперь нет? (Или наоборот)?

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

Я нашел эту проблему fago (разработчик правил) на drupal.org, которая, кажется, имеет дело с этим в Drupal 7, но было бы полезно получить хорошее объяснение.

Ответы:


31

Ничего. Прочитав вышеупомянутую проблему (особенно комментарий № 38 ), я обнаружил, что объект $ node (фактически, любая сущность) хранит «оригинальную» кэшированную копию в $ entity-> original.

Итак, я хотел определить, изменился ли узел с «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 ;-)
Уве

Хех, это уже в 10 раз, когда я получил свой собственный ответ в результатах Google. Будущее мне спасибо мимо меня за ответы :)
geerlingguy

Выше код не будет работать, если вы используете модуль пересмотра
Мохаммад Анвар

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

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.