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


17

에서 hook_node_update () 가 업데이트되어있어 후 (이 게시하거나하지 여부), 난 쉽게 노드의 '상태'를 알 수 있습니다.

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

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

내가 발견 fago이 문제 드루팔 7이 처리하는 것 같다 drupal.org에 (규칙의 개발자),하지만 좋은 설명을 감상 할 수있다.

답변:


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

Heh, 이것은 Google 검색 결과에 10 번쯤 올랐습니다. 대답 해 주셔서 감사합니다. :)
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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.