Як змусити_установити () запустити всі гачки_надійного ()?


18

Як я можу змусити привести_установку (), щоб запустити всі оновлення для мого модуля? У мене є файл 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. Оновлення оновлень, як правило, є поганою ідеєю і найчастіше спричиняє помилки, а в деяких випадках може зіпсувати ваші дані.

Завжди пам’ятайте, що слід робити резервну копію вашої бази даних перед запуском оновлень.


15

Призначення гачків різне.

  • ho_install () викликається при встановленні модуля; це означає, що модуль раніше не був встановлений, і тому його не потрібно оновлювати.
  • ho_update_N () викликається, коли модуль вже встановлений, і його потрібно оновити.

Якщо є деякі завдання, які потрібно виконати як при встановленні модуля, так і при оновленні модуля, код повинен бути присутнім в обох гачках. Немає модуля, який викликає всі гачки оновлення під час встановлення, і це було б особливо неправильно, коли функції оновлення оновлюють схему таблиць баз даних, що використовуються в модулі; ho_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.

Дивіться також: Чи можна змусити запустити гак оновлення модуля?


1

ho_install не працюватиме з mymod.moduleфайлом.

Ви повинні розмістити hook_installі hook_uninstallв окремому файліmymod.install

Я думаю, що hook_update_N()це також слід розміститиmymod.install


Відповідь після оновлення питання:

Цитуючи посилання , перевірте номер своєї версії в інфо-файлі.

Оскільки я розробляюсь приватно і не хочу внести внесок, моє поле "VERSION" у файлі .info мого модуля є порожнім або незмінним, коли я оновлюю модуль. Я фактично використовую Subversive для затемнення PDT, і тому номери моїх версій інформаційних файлів ніколи не оновлюються. Таким чином, мій_ruke_update_6001 НЕ викликав update.php.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.