Как заставить hook install() запускать все обновления hook N()?


Как я могу заставить hook_install() запускать все обновления, которые у меня есть для моего модуля? У меня в нем есть файл mymod.install.

Я пытался

function mymod_install() {
  mymod_update_6001();
}

Но, похоже, это ничего не дает. Если бы у меня был mymod_update_6002(), я бы все равно позвонил 6001(), просто позвонил 6002() или позвонил обоим в порядке 6001(), 6002().

Я подумал, что было бы разумно запускать все обновления при установке модуля по умолчанию.

Author: Pierre.Vriens, 2011-06-15

4 answers

Вы не должны использовать свой установочный крючок для запуска обновлений. При первой установке модуля никаких обновлений не требуется.

Обновления используются, когда модуль уже установлен (база данных или переменные созданы). В этом случае вы не хотите переустановить модуль, так как он удалит все данные, вместо этого вы создадите крючки update_N. Drupal определит, какие обновления необходимы, и они будут запущены в update.php. В Drupal 6 он автоматически выберет, какие обновления сделайте, но вы можете изменить его, в то время как в Drupal 7 это невозможно.

Drupal определяет, какие обновления необходимы, сохраняя номер последнего запущенного обновления. Это могут быть изменения в базе данных, которые позволят повторно запускать обновления в Drupal 7. Повторный запуск обновлений обычно является плохой идеей и чаще всего приводит к ошибкам, а в некоторых случаях может привести к искажению ваших данных.

Всегда помните о необходимости резервного копирования базы данных перед запуском обновлений.

 19
Author: googletorp, 2011-06-15 10:24:01

Назначение крючков другое.

  • hook_install() вызывается при установке модуля; это означает, что модуль ранее не был установлен, и поэтому его не нужно обновлять.
  • Функция hook_update_N() вызывается, когда модуль уже установлен и его необходимо обновить.

Если есть некоторые задачи, которые необходимо выполнить как при установке модуля, так и при обновлении модуля, то код должен быть присутствует в обоих крючках. Нет модуля, который вызывает все крючки обновления во время установки, и это было бы особенно неправильно, когда функции обновления обновляют схему таблиц базы данных, используемых из модуля; hook_schema() всегда должен возвращать обновленную схему, и обновление схемы также с помощью функций обновления было бы неправильным.

Написанный вами код не работает, потому что вызов одной из функций обновления не приводит к автоматическому выполнению всех остальных функции обновления.
Вызов функций обновления из реализации hook_install() является неправильным, так как неправильно вызывать функцию обновления из другой; если есть некоторый код, который необходимо выполнить из двух или более функций обновления, то этот код следует поместить в функцию, которая вызывается из функций обновления, и из hook_install(), если необходимо.

 15
Author: kiamlaluno, 2011-06-16 00:11:21

Крючок установки вызывается только тогда, когда модуль только что установлен, поэтому нет необходимости в каких-либо обновлениях. Обновления выполняются только тогда, когда модуль уже установлен, поэтому он может вносить дополнительные изменения.

Чтобы принудительно запустить функции обновления при установке, вам необходимо изменить версию схемы, например:

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.

См. также: Можно ли принудительно запустить крючок обновления вашего модуля?

 5
Author: kenorb, 2018-11-08 21:01:46

Установка Hook_ не будет работать с файлом in mymod.module.

Вы должны поместить hook_install и hook_uninstall в отдельный файл mymod.install

Я предполагаю, что hook_update_N() также следует поместить в mymod.install


Ответ после обновления вопроса:

Цитируя ссылку , Пожалуйста, проверьте номер вашей версии в информационном файле.

Поскольку я разрабатываю в частном порядке, а не для вклада, мое поле "ВЕРСИЯ" в файле .info моего модуля либо пустое, либо не изменилось, когда я обновите модуль. На самом деле я использую Subversive для eclipse PDT, и поэтому номера версий моих информационных файлов никогда не обновляются. Таким образом, мой hook_update_6001 НЕ вызывался update.php .

 1
Author: Shoaib Nawaz, 2011-06-15 10:37:01