Jak uzyskać hook_install (), aby uruchomić wszystkie hook_update_N ()?

18

Jak mogę uzyskać hook_install (), aby uruchomić wszystkie aktualizacje, które mam dla mojego modułu? Mam w nim plik mymod.install.

próbowałem

function mymod_install() {
  mymod_update_6001();
}

ale wydaje się, że nic nie robi. Jeśli mam mymod_update_6002 (), nadal dzwoniłbym do 6001 (), wystarczy wywołać 6002 () lub wywołać oba w kolejności 6001 (), 6002 ().

Pomyślałem, że rozsądnie byłoby uruchomić wszystkie aktualizacje po domyślnym zainstalowaniu modułu.

Lucy
źródło

Odpowiedzi:

19

Nie powinieneś dostać haka instalacyjnego do uruchamiania aktualizacji. Gdy moduł jest instalowany po raz pierwszy, aktualizacje nie powinny być konieczne.

Aktualizacje są używane, gdy moduł jest już zainstalowany (baza danych lub zmienne zostały utworzone). W takim przypadku nie chcesz ponownie instalować modułu, ponieważ wyczyści on wszystkie dane, zamiast tego utworzysz hooki update_N. Drupal wykryje, które aktualizacje są potrzebne i zostaną uruchomione update.php. W Drupal 6 automatycznie wybierze aktualizacje do wykonania, ale możesz to zmienić, podczas gdy nie jest to możliwe w Drupal 7.

Drupal wykrywa, które aktualizacje są potrzebne, zapisując numer ostatniej aktualizacji. Mogą to być zmiany w bazie danych, które pozwolą ponownie uruchomić aktualizacje w Drupal 7. Ponowne uruchamianie aktualizacji jest zwykle złym pomysłem i najczęściej powoduje błędy, a w niektórych przypadkach może zepsuć dane.

Zawsze pamiętaj o utworzeniu kopii zapasowej bazy danych przed uruchomieniem aktualizacji.

googletorp
źródło
15

Cel haków jest inny.

  • hook_install () jest wywoływany po zainstalowaniu modułu; oznacza to, że moduł nie był wcześniej zainstalowany i dlatego nie musi być aktualizowany.
  • Funkcja hook_update_N () jest wywoływana, gdy moduł jest już zainstalowany i należy go zaktualizować.

Jeśli istnieją pewne zadania, które należy wykonać zarówno podczas instalacji modułu, jak i podczas aktualizacji modułu, kod powinien znajdować się w obu zaczepach. Nie ma modułu, który wywoływałby wszystkie przechwytywania aktualizacji podczas instalacji, a byłoby to szczególnie błędne, gdy funkcje aktualizacji aktualizują schemat tabel bazy danych używanych z modułu; hook_schema () zawsze powinien zwracać zaktualizowany schemat, a aktualizacja schematu również za pomocą funkcji aktualizacji byłaby błędna.

Napisany kod nie działa, ponieważ wywołanie jednej z funkcji aktualizacji nie powoduje automatycznego wykonania wszystkich pozostałych funkcji aktualizacji.
Wywoływanie funkcji aktualizacji z implementacji hook_install()jest niepoprawne, ponieważ błędne jest wywoływanie funkcji aktualizacji z innej; jeśli istnieje kod, który należy wykonać z dwóch lub więcej funkcji aktualizacji, kod ten należy umieścić w funkcji wywoływanej z funkcji aktualizacji i hook_install(), jeśli to konieczne.

kiamlaluno
źródło
5

Zaczep instalacyjny jest wywoływany tylko wtedy, gdy moduł jest świeżo zainstalowany, więc nie ma potrzeby żadnych aktualizacji. Aktualizacje są wykonywane tylko wtedy, gdy moduł jest już zainstalowany, dzięki czemu można zastosować dodatkowe zmiany.

Aby wymusić uruchomienie funkcji aktualizacji podczas instalacji, musisz zmienić wersję schematu, na przykład:

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();
}

Lub uruchom go z drush: drush -y updb.

Zobacz także: Czy można wymusić uruchomienie haka aktualizacji modułu?

kenorb
źródło
1

hook_install nie działałby w mymod.modulepliku.

Trzeba miejscu hook_installi hook_uninstallw oddzielnym plikumymod.install

Myślę, że hook_update_N()należy to również umieścićmymod.install


Odpowiedź po zaktualizowaniu pytania:

Cytując z linku , sprawdź numer wersji w pliku informacyjnym.

Ponieważ rozwijam się prywatnie, a nie dla wkładu, moje pole „WERSJA” w pliku .info mojego modułu jest puste lub niezmienione podczas aktualizacji modułu. Właściwie używam Subversive do Eclipse PDT, dlatego numery wersji moich plików informacyjnych nigdy się nie aktualizują. Zatem mój hook_update_6001 NIE został wywołany przez update.php.

Shoaib Nawaz
źródło