ノードが「公開」から「非公開」に変更されたことを検出するにはどうすればよいですか?


17

hook_node_update()が更新されていた後、私は簡単に(それが公表されるかどうかにかかわらず)のノードの「状況」を伝えることができます。

ただし、更新されたノード公開されたかどうかを確認する簡単な方法はありますか?(またはその逆)?

ルールには「ノード値が変更された」などの条件があるかもしれないと思いますが、プログラムでこれを実行したいと思います。

drupal.orgでfago(ルールの開発者)がこの問題を見つけましたが、これは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
私は自分の質問に答えるのをやめなければなりません
;

5
どうして?+1に値する私にとってはまだ役に立ちました;-)
uwe

へー、これは私がGoogleの結果で自分の答えを見つけたのは約10回目です。私に答えてくれてありがとう。)
geerlingguy

あなたがリビジョンをモジュールを使用している場合は、上記のコードでは、仕事に行くされていません
モハマド・アンワル

ステータス+ワークフロー+翻訳のために働いていない記録のために、これができなかった、私が使用していた$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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.