저장 후 작업에 어떤 후크를 사용할 수 있습니까?


16

이 같은 질문으로 여러 게시물을 찾았지만 답변은 항상 다른 주제로 나뉘거나 내 요구에 맞지 않습니다.

노드가 저장된 후 사용자 정의 모듈이 새 노드의 nid를 포함하는 사용자 정의 테이블 중 하나에 행을 삽입하기를 원합니다. hook_node_submit이 호출 될 때 , nid는 아직 존재하지 않습니다. hook_node_insertnid가 있지만 처음 노드를 저장할 때만 호출되지만 노드를 저장할 때마다 조치를 취해야합니다.

내 계획은 기능을 자체 메서드로 분리하고 두 후크를 모두 구현하는 것이지만 Drupal을 사용하여 올바르게 작업하는 방법을 배우려고하므로 실제로 내 요구 사항에 맞는 후크가 있는지 궁금합니다.

노드가 저장되고 저장이 완료된 후 호출 될 때마다 호출되는 후크가 있습니까?


3
hook_node_insert및 조합을 사용할 수 있습니다 hook_node_update(노드를 저장할 때마다 작동).
AjitS

예, 위의 게시물에서 설명했습니다.
Kenny Wyland

@KennyWyland 당신은 언급 hook_node_submit하지만 언급 하지 않았 hook_node_update습니까?
David Thomas

hook_node_insert에서뿐만 아니라 노드를 얻을 수 hook_node_update있습니다.
Suan Madan

2
hook_node_insert()이것 hook_node_update()에 대한 올바른 후크이며 hook_node_submit(), 노드가 저장되기 전에 양식 제출 프로세스 중에 호출됩니다. 후크를 추가 / 제거 할 때마다 캐시를 ​​지워야한다는 것을 잊지 마십시오
Clive

답변:


5

확실한 솔루션은 후크를 사용하는 것입니다 같은 질문에 대한 의견을 보면, 그것은 외모 hook_node_insert()hook_node_update().

나는 실제로 대답에 설명 된 것과 매우 비슷한 일을했습니다. 노드를 만들거나 업데이트 할 때마다 수행하려는 작업을 수행하고 각 후크에서 호출하는 함수를 작성했습니다. 잘 작동합니다.


멋지다! 에서이 작업을 수행 할 수도 있습니다 hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx이 메소드의 단점은 특정 양식을 통해 노드를 삽입 / 업데이트 할 때만 호출된다는 것입니다. 내 경우에는 노드의 모든 추가 및 수정을 잡아야했습니다.
donut

12

이를 수행하는 올바른 방법은 Drupal의 db 트랜잭션을 존중하는 것입니다. hook_node_insert에서 데이터베이스 조치를 수행하려면 노드가 실제로 저장되지 않았 음을 고려해야합니다. 즉, 실패하고 롤백하면 데이터베이스에 고아 데이터가 생깁니다. 따라서 Drupal 데이터베이스 API를 사용해야하며 직접 쿼리를 실행하지 않아야합니다.

hook_node_insert에서 노드 자체를 업데이트하려는 경우 노드가 데이터베이스에 아직 저장되지 않고 호출하면 예외가 발생하므로 node_save를 사용할 수 없으므로 사용할 수 없습니다. 한 가지 해결책은 register_shutdown_function 함수를 사용하고 nid를 전달하는 것입니다. node_load를 사용하여 실제로 저장되었는지 확인한 다음 새 노드에서 원하는 다른 조치를 수행 할 수 있습니다.

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

업데이트 : 당신은 또한 여기에 더 쉬운 대안을 찾을 수 있습니다 https : //.com/a/24035797/1726778


1
좋은 생각. 사용하는 것이 좋습니다 drupal_register_shutdown_function(). 그러나 둘 다 PHP-fpm 환경에서 문제가있는 것 같습니다. drupal.stackexchange.com/q/102603/10667
Shevchuk

노드가 유기 그룹으로 작동하는지 확인하는 데 문제가있었습니다 og_is_group. 나는 이런 이유로 거짓 부정을 받고 있다고 생각합니다.
고드름

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