Как заставить 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. Повторное запуск обновлений, как правило, является плохой идеей и чаще всего приводит к ошибкам, а в некоторых случаях может испортить ваши данные.

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

googletorp
источник
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.

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

kenorb
источник
1

hook_install не будет работать в mymod.moduleфайле.

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

Я думаю, что это hook_update_N()также должно быть помещено вmymod.install


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

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

Так как я занимаюсь разработкой в ​​частном порядке, а не для вклада, мое поле 'VERSION' в файле .info моего модуля либо остается пустым, либо остается неизменным при обновлении модуля. Я на самом деле использую Subversive для Eclipse PDT, и поэтому номера версий моих информационных файлов никогда не обновляются. Таким образом, мой hook_update_6001 НЕ вызывался update.php.

Шоаиб Наваз
источник