it-swarm.dev

노드가 'Published'에서 'Unpublished'로 변경된 시점을 어떻게 알 수 있습니까?

hook_node_update () 에서는 업데이트 후 노드의 '상태'(게시 여부에 상관없이)를 쉽게 알 수 있습니다.

그러나 업데이트 된 노드 게시되었는지 확인하는 쉬운 방법이 있습니까? (혹은 그 반대로도)?

규칙에 '노드 값이 변경되었습니다'라는 조건이 있거나 그 줄을 따라갈 수있는 조건이 있다고 생각하지만 프로그래밍 방식 으로이 작업을 수행하고 싶습니다.

Drupal.org에서 이 문제는 fago (룰 개발자) Drupal 7, 7에서 다루는 것 같았습니다.) .

16
geerlingguy

신경 쓰지 마. 위에 링크 된 문제 (특히 comment # 38 )를 읽은 후 $ node 객체 (실제로 엔티티)가 'original'캐시 사본을 $ 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.
    }
  }
}
?>
31
geerlingguy

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를 변경하기 전에 노드 속성을 볼 수 있습니다.

1
kiamlaluno