Как заставить hook install() запускать все обновления hook N()?
Как я могу заставить hook_install() запускать все обновления, которые у меня есть для моего модуля? У меня в нем есть файл mymod.install.
Я пытался
function mymod_install() {
mymod_update_6001();
}
Но, похоже, это ничего не дает. Если бы у меня был mymod_update_6002(), я бы все равно позвонил 6001(), просто позвонил 6002() или позвонил обоим в порядке 6001(), 6002().
Я подумал, что было бы разумно запускать все обновления при установке модуля по умолчанию.
4 answers
Вы не должны использовать свой установочный крючок для запуска обновлений. При первой установке модуля никаких обновлений не требуется.
Обновления используются, когда модуль уже установлен (база данных или переменные созданы). В этом случае вы не хотите переустановить модуль, так как он удалит все данные, вместо этого вы создадите крючки update_N. Drupal определит, какие обновления необходимы, и они будут запущены в update.php
. В Drupal 6 он автоматически выберет, какие обновления сделайте, но вы можете изменить его, в то время как в Drupal 7 это невозможно.
Drupal определяет, какие обновления необходимы, сохраняя номер последнего запущенного обновления. Это могут быть изменения в базе данных, которые позволят повторно запускать обновления в Drupal 7. Повторный запуск обновлений обычно является плохой идеей и чаще всего приводит к ошибкам, а в некоторых случаях может привести к искажению ваших данных.
Всегда помните о необходимости резервного копирования базы данных перед запуском обновлений.
Назначение крючков другое.
- hook_install() вызывается при установке модуля; это означает, что модуль ранее не был установлен, и поэтому его не нужно обновлять.
- Функция hook_update_N() вызывается, когда модуль уже установлен и его необходимо обновить.
Если есть некоторые задачи, которые необходимо выполнить как при установке модуля, так и при обновлении модуля, то код должен быть присутствует в обоих крючках. Нет модуля, который вызывает все крючки обновления во время установки, и это было бы особенно неправильно, когда функции обновления обновляют схему таблиц базы данных, используемых из модуля; hook_schema() всегда должен возвращать обновленную схему, и обновление схемы также с помощью функций обновления было бы неправильным.
Написанный вами код не работает, потому что вызов одной из функций обновления не приводит к автоматическому выполнению всех остальных функции обновления.
Вызов функций обновления из реализации hook_install()
является неправильным, так как неправильно вызывать функцию обновления из другой; если есть некоторый код, который необходимо выполнить из двух или более функций обновления, то этот код следует поместить в функцию, которая вызывается из функций обновления, и из hook_install()
, если необходимо.
Крючок установки вызывается только тогда, когда модуль только что установлен, поэтому нет необходимости в каких-либо обновлениях. Обновления выполняются только тогда, когда модуль уже установлен, поэтому он может вносить дополнительные изменения.
Чтобы принудительно запустить функции обновления при установке, вам необходимо изменить версию схемы, например:
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
.
См. также: Можно ли принудительно запустить крючок обновления вашего модуля?
Установка Hook_ не будет работать с файлом in mymod.module
.
Вы должны поместить hook_install
и hook_uninstall
в отдельный файл mymod.install
Я предполагаю, что hook_update_N()
также следует поместить в mymod.install
Ответ после обновления вопроса:
Цитируя ссылку , Пожалуйста, проверьте номер вашей версии в информационном файле.
Поскольку я разрабатываю в частном порядке, а не для вклада, мое поле "ВЕРСИЯ" в файле .info моего модуля либо пустое, либо не изменилось, когда я обновите модуль. На самом деле я использую Subversive для eclipse PDT, и поэтому номера версий моих информационных файлов никогда не обновляются. Таким образом, мой hook_update_6001 НЕ вызывался update.php .