모듈의 업데이트 후크를 강제로 실행할 수 있습니까?


18

나는 날짜 iCal 모듈의 저자이며, 내가 작업하고있는 새로운 주요 버전 (3.x)에는 2.x가 설치된 사용자를 위해 두 부분으로 된 스키마 업데이트가 필요합니다. 이러한 변경을 수행하는 업데이트 후크를 작성했지만 내 사용자 중 한 명이 데이터베이스 업데이트 스크립트를 실행하지 못하면 iCal 피드 가져 오기와 관련된 오류 메시지가 표시됩니다.

올바른 해결 방법은 업데이트 스크립트를 실행하는 것입니다. 그러나 메시지를 제거하기 위해 가져 오기 프로그램을 가져 와서 수동으로 변경하면 가져 오기 기능이 영구적으로 유지됩니다 (스키마 업데이트의 두 번째 부분이 중단되지 않기 때문에). 실행되었습니다).

업데이트를 실행하지 않은 사용자에게 메시지를 표시하는 방법이 있습니까? 아니면 3.x가 2.x 위에 설치 될 때 페이지로드가 처음 발생할 때 어떻게 든 업데이트 후크를 강제로 실행합니까?


2
난 당신이 할 수있는 상상 variable_set()이 성공적으로 당신이 내 볼 수 실행할 때 변수를 설정하여 업데이트 기능에 _preprocess_page()하지만 당신은 그렇게하지 않도록 친절이 것이 얼마나 성능 그것을마다 찾고있을 것입니다.
Jimajamma 2011

답변:


4

Jimajamma의 의견 확장 :

variable_set()()가 성공적으로 당신이 _preprocess_page 내부에서 볼 수 실행할 때 변수를 설정하여 업데이트 기능에

그리고 모든 페이지로드에서 이것을 확인하는 대신 관리자 영역을 탐색하고 설치된 버전이 3.0 (3.1, 3.2 인 경우 업그레이드 경로로 이전 버전 지원을 중지하면 해당 확인을 종료하십시오) 만 수행하십시오.

또한 상태 보고서 페이지에 대한 피드백을 제공하기 위해 hook_requirements 를 사용 하십시오.

설치 요구 사항을 확인하고 상태보고를 수행하십시오.
(...)
'런타임'단계는 순수한 설치 요구 사항으로 제한되지 않고 유지 관리 작업 및 보안 문제와 같은보다 일반적인 상태 정보에도 사용될 수 있습니다.


15

모듈 업데이트를 강제하는 몇 가지 방법이 있습니다.

  1. 업데이트 기능을 직접 호출합니다.

    $sandbox = [];
    module_load_include('install', 'FOO');
    FOO_update_7001($sandbox);
  2. 스키마 버전을 관심 지점으로 재설정하고 평소와 같이 업데이트를 다시 실행하십시오.

    drupal_set_installed_schema_version('module_name', '7000');

    또는 최신 업데이트 스키마 만 다시 실행하도록 재설정하십시오.

    drupal_set_installed_schema_version('foo', drupal_get_installed_schema_version('foo') - 1);

    노트:

    • 이것은에 배치 될 수 hook_install있도록 모든 필연의 업데이트 후크가 실행됩니다 업데이트 과정에서.
    • 설치 파일 외부에서이 기능을 사용하려면 Drupal install.incfirst와 모듈의 설치 파일 을 포함시켜야 합니다.

      require_once DRUPAL_ROOT . '/includes/install.inc';
      module_load_include('install', 'foo');
    • ini_set('max_execution_time', 0);PHP 시간 초과를 방지하기 위해 더 긴 설치 업데이트를 추가하십시오 .
  3. 사용 drush. 아래 몇 가지 예를 찾으십시오.

    • drush eval 'module_load_include('install', 'foo'); $s = []; foo_update_7001($s);'
    • drush sqlq "UPDATE system SET schema_version = 7000 WHERE name = 'foo'" && drush -y updb

1
오, 잘 모르겠어요 drupal_set_installed_schema_version(). 업데이트 훅 디버깅에 매우 유용합니다!
coredumperror

1
따라서이를 배치 할 때의 주요 문제점 hook_install()은 긴 배치 (샌드 박스) 업데이트를 실행하는 것입니다. 이상적인 상황에서 update.php시간 초과를 방지하기 위해 PHP 스레드를 다시 시작 하는 것과 같은 방식으로 업데이트를 트리거하는 방법이 있어야합니다 . 개미 아이디어는 어떻게해야합니까?
Alex Skrypnyk

@ Alex.Designworks ini_set('max_execution_time', 0);업데이트를 트리거하기 전에 추가 할 수 있습니다 .
kenorb

1

(답변으로 답함)

"SELECT schema_version FROM system"은 업데이트가 수행되었는지 여부를 감지 할 수 있습니다. 그렇지 않은 경우 오류 메시지와 함께 실행을 거부하십시오.


답을 바꾸고 사용 예를 제시하십시오.
Елин Й.

이 주석은 무시하십시오.
coredumperror

문제의 기능이 다른 모듈의 플러그인이므로 해당 모듈이 사용자가 수입업자를 엉망으로 만드는 것을 막을 수 없기 때문에 작동하지 않을까 걱정됩니다.
coredumperror

업데이트를 모니터링하려는 모듈의 스키마 버전을 확인할 수 없습니까?
user18099

0

위의 제안에 동의합니다. 내 유일한 추가 사항은 "트리거 및 작업"도 조사하는 것입니다. 트리거 (사용자 확인 관리자 페이지 등)를 가져올 때 발생하는 작업 (사용자에게 알리거나 업데이트 실행)이 필요한 것 같습니다. . 사용 예제는 예제 모듈을 참조하십시오. 조치 및 트리거 예제 코드가 있습니다. :)


0

function MYMODULE_install() { $functions = get_defined_functions(); foreach ($functions['user'] as $function) { if (strpos($function, 'MYMODULE_update_') === 0) { call_user_func($function); } } }

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