hook_install ()이 모든 hook_update_N ()을 실행하는 방법은 무엇입니까?


18

모듈에 대한 모든 업데이트를 실행하기 위해 hook_install ()을 어떻게 얻을 수 있습니까? mymod.install 파일이 있습니다.

나는 시도했다

function mymod_install() {
  mymod_update_6001();
}

그러나 아무것도하지 않는 것 같습니다. mymod_update_6002 ()가 있으면 여전히 6001 ()을 호출하면 6002 ()를 호출하거나 6001 (), 6002 () 순서로 모두 호출하십시오.

기본적으로 모듈을 설치할 때 모든 업데이트를 실행하는 것이 상식이라고 생각했습니다.

답변:


19

업데이트를 실행하기 위해 설치 후크를 얻지 않아야합니다. 모듈을 처음 설치하면 업데이트가 필요하지 않습니다.

모듈이 이미 설치되어있는 경우 (데이터베이스 또는 변수가 생성 된 경우) 업데이트가 사용됩니다. 이 경우 모든 데이터를 지우므로 대신 update_N 후크를 작성하므로 모듈을 다시 설치하지 않습니다. Drupal은 어떤 업데이트가 필요한지, 어떤 업데이트가 실행될지를 감지합니다 update.php. Drupal 6에서는 수행 할 업데이트를 자동으로 선택하지만 Drupal 7에서는 불가능하지만 변경할 수 있습니다.

Drupal은 마지막 실행 업데이트 수를 저장하여 필요한 업데이트를 감지합니다. 데이터베이스 변경으로 인해 Drupal 7에서 업데이트를 다시 실행할 수 있습니다. 업데이트를 다시 실행하는 것은 일반적으로 나쁜 생각이며 대부분 오류를 발생시키고 경우에 따라 데이터를 엉망으로 만들 수 있습니다.

업데이트를 실행하기 전에 항상 데이터베이스를 백업해야합니다.


15

갈고리의 목적은 다릅니다.

  • hook_install () 은 모듈이 설치 될 때 호출됩니다. 이는 모듈이 이전에 설치되지 않았 음을 의미하므로 업데이트 할 필요가 없습니다.
  • hook_update_N () 은 모듈이 이미 설치되어 있고 호출되어야 할 때 호출됩니다.

모듈을 설치할 때와 모듈을 업데이트 할 때 수행해야 할 작업이 있으면 코드가 두 후크에 모두 있어야합니다. 설치 중에 모든 업데이트 후크를 호출하는 모듈이 없으며 업데이트 기능이 모듈에서 사용 된 데이터베이스 테이블의 스키마를 업데이트 할 때 특히 잘못됩니다. hook_schema () 는 항상 업데이트 된 스키마를 반환해야하며 업데이트 함수를 사용하여 스키마를 업데이트하는 것은 잘못된 것입니다.

업데이트 기능 중 하나를 호출해도 다른 모든 업데이트 기능이 자동으로 실행되지 않기 때문에 작성한 코드가 작동하지 않습니다. 다른 함수에서 업데이트 함수를 호출하는 것이 잘못되었으므로
구현에서 업데이트 함수 hook_install()를 호출하는 것은 잘못되었습니다. 둘 이상의 업데이트 함수에서 실행해야하는 코드가있는 경우 해당 코드는 업데이트 함수에서 호출 된 함수에 있어야하며 hook_install()필요한 경우 에서 호출 해야합니다.


5

설치 후크는 모듈을 새로 설치할 때만 호출되므로 업데이트가 필요하지 않습니다. 업데이트는 모듈이 이미 설치된 경우에만 실행되므로 추가 변경 사항을 적용 할 수 있습니다.

설치시 업데이트 기능을 강제로 실행하려면 다음과 같이 스키마 버전을 변경해야합니다.

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

또는 drush에서 실행하십시오 drush -y updb.

참조 : 그것을 실행 모듈의 업데이트 후크를 강제 할 수 있습니까?


1

hook_install은 mymod.module파일 에서 작동하지 않습니다 .

당신은 장소에 가지고 hook_installhook_uninstall별도의 파일mymod.install

나는 그것이 hook_update_N()또한 배치되어야한다고 생각한다 .mymod.install


질문이 업데이트 된 후 답변 :

링크 에서 인용하면 정보 파일에서 버전 번호를 확인하십시오.

개인적으로 개발하지 않고 기여하지 않기 때문에 모듈의 .info 파일에서 'VERSION'필드가 비어 있거나 모듈을 업데이트 할 때 변경되지 않습니다. 실제로 Eclipse PDT에 Subversive를 사용하고 있으므로 내 정보 파일 버전 번호가 업데이트되지 않습니다. 따라서 내 hook_update_6001은 update.php에 의해 호출되지 않았습니다.

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