Почему обновление крючка N не запущено?
Я переношу модуль на Drupal 7. Модуль имеет функции hook_update_N()
, вызываемые из hook_install()
. Есть несколько запросов на вставку, выполненных внутри одной из функций hook_update_N()
. Но моя функция hook_update_N
не запущена. Есть ли какой-либо способ явного вызова функций hook_update_N
?
Я знаю, что мой вопрос почти такой же, как этот Как заставить hook_install() запускать все hook_update_N()?. Но я не понимаю, как называется hook_update_N()
. Я запустил обновления на своем сайте Drupal, который, как я думаю, также запускайте обновления пользовательских модулей, но, похоже, hook_update_N()
не запускается. Потому что я добавил функцию error_log()
внутри hook_update_N()
, но файл журнала пуст.
5 answers
Drupal хранит, какие крючки обновления были запущены, так как он запускает крючки обновления только один раз. Если конкретный крюк обновления не запускается, наиболее вероятными причинами являются
- Он уже запущен
- Крючок обновления, который необходимо запустить до сбоя.
В системной таблице вы можете увидеть все включенные модули, а schema_version
показывает, какое обновление было запущено последним.
Еще одна причина, по которой не запускается хук обновления, - несоответствие между именем хука обновления и основным номером выпуска модуля (см. Файл .info).
Например: крючок обновления mymodule_update_7001 не запускается, если версия модуля 7.x.1.0. В таком случае вы должны переименовать крючок в mymodule_update_7101.
Смотрите документацию по API hook_update
У меня возникла проблема, когда я установил новый модуль, но установка не удалась. Значение schema_version осталось на уровне -1, что предотвратило дальнейшие обновления для этого модуля. Установка версии на 0 исправила это.
Для любопытных я перенес схему существующей таблицы в новый модуль. Сбой произошел, когда он не смог создать существующую таблицу, чего я и ожидал. Модуль был включен, как и ожидалось, но я не понял, что schema_version не обновлялся.
Одна из причин, по которой функция hook_update_N() ничего не сделает, заключается в том, что обновление с тем же или большим номером (чем номер, который вы использовали в своей функции hook_update_N()) уже запущено.
Вы можете увидеть номер последнего обновления, запущенного для вашего модуля, запросив таблицу "система" в Drupal 7. "schema_version" - это столбец в таблице "система", в котором хранится номер версии последнего обновления, примененного к вашему модулю. Чтобы ваша новая функция hook_update_N() работала, число (N), которое вы использование на нем должно быть больше, чем число, которое в настоящее время хранится в столбце "schema_version" для этого модуля.
Я использовал следующий запрос в командной строке MySQL (после первого ввода команды "использовать" для указания имени моей базы данных Drupal 7).
Mysql> выберите имя, тип, статус, schema_version из системы, где тип = "модуль" и имя = "имя_модуля";
Столбец "schema_version" будет содержать номер. Число, которое вы используете в своей новой функции обновления, должно быть больше, чем тот.
У меня только что была эта проблема, и я подумал, что добавлю ее в кучу, так как не вижу упоминания об этом в других ответах.
Моя проблема была с Drupal 8.7, и проблема заключалась в том, что в имени модуля были прописные символы, из-за чего он не выполнял никаких проверок на наличие обновлений. Например: myModule
.
Причина в том, что drupal_get_schema_versions()
имеет статический массив $updates
, который представляет собой ассоциативный массив доступных версий схемы обновления, помеченных именами модулей. Но все названия модулей написаны в нижнем регистре. Например $updates['mymodule']
. Этот приводит к сбою логики и ничего не возвращает, заставляя Drupal думать, что обновлений нет.