Я являюсь автором модуля Date iCal, и новая основная версия, над которой я работаю (3.x), требует обновления схемы из двух частей для пользователей, у которых установлен 2.x. Я написал хук обновления, который вносит эти изменения, но если один из моих пользователей не сможет запустить скрипт обновления базы данных, он получит сообщение об ошибке, касающееся их импортеров каналов iCal.
Правильное решение для них - запустить скрипт обновления ... но если они просто войдут и вручную изменят своих импортеров, чтобы избавиться от сообщения, их импортеры останутся поврежденными (потому что вторая часть обновления схемы не будет были выполнены).
Так есть ли способ показать сообщение пользователям, которые не запустили обновление? Или каким-то образом принудительно выполнить хук обновления в первый раз, когда загрузка страницы происходит, когда 3.x устанавливается поверх 2.x?
variable_set()
в своей функции обновления функцию, которая устанавливает переменную, когда она была успешно запущена, и которую вы могли бы просматривать внутри,_preprocess_page()
но вы бы смотрели на нее каждый раз, поэтому не уверены, насколько это будет благоприятно для производительности.Ответы:
Продолжая комментарий от Jimajamma:
и вместо того, чтобы проверять это при каждой загрузке страницы, делайте это только при просмотре административной области и если установлена версия 3.0 (3.1, 3.2, убейте эту проверку, если вы перестанете поддерживать старую версию как путь обновления).
Дополнительно используйте hook_requirements, чтобы оставить отзыв на странице отчета о состоянии:
источник
Есть несколько способов принудительного обновления модуля.
Вызов функции обновления напрямую.
Сброс версии схемы до точки интереса и снова запустите обновления как обычно.
Или сбросьте для повторного запуска только самой последней схемы обновления:
Примечания:
hook_install
, поэтому во время процесса обновления будут выполняться все последовательные хуки обновления.Чтобы использовать эту функцию вне установочного файла, вы должны
install.inc
сначала включить Drupal и установочный файл модуля, напримерini_set('max_execution_time', 0);
более длинных обновлений для установки, чтобы предотвратить тайм-ауты PHP.Использование
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
источник
drupal_set_installed_schema_version()
. Это было бы очень удобно для отладки обновлений!hook_install()
- запуск длинных пакетных (изолированных) обновлений. В идеальной ситуации должен быть способ запуска обновлений таким же образом, какupdate.php
и при перезапуске потока PHP для предотвращения тайм-аутов. Муравьиные идеи, как это сделать?ini_set('max_execution_time', 0);
прежде чем запускать обновления.(Перефразировано в ответ)
Вы можете «ВЫБЕРИТЬ схему_версии FROM system», чтобы определить, было ли выполнено обновление. Если нет, то отказаться от запуска (с сообщением об ошибке).
источник
Я согласен с вышеизложенными предложениями - мое единственное добавление было бы также для изучения «Триггеров и действий» - кажется, что вам нужно действие (уведомить пользователя или запустить обновление), которое должно происходить при нажатии триггера (пользователь проверяет страницу администратора и т. Д.) , Примеры использования см. В разделе «Примеры», здесь есть примеры кода действий и триггера. :)
источник
function MYMODULE_install() { $functions = get_defined_functions(); foreach ($functions['user'] as $function) { if (strpos($function, 'MYMODULE_update_') === 0) { call_user_func($function); } } }
источник