it-swarm-eu.dev

Jak získat hook_install () pro spuštění všech hook_update_N ()?

Jak mohu získat hook_install () pro spuštění všech aktualizací, které mám pro svůj modul? Mám v něm soubor mymod.install.

Zkusil jsem

function mymod_install() {
  mymod_update_6001();
}

ale zdá se, že nic nedělá. Pokud budu mít mymod_update_6002 (), zavolám stále 6001 (), zavolám jen 6002 () nebo zavolám oba v pořadí 6001 (), 6002 ().

Myslel jsem, že by bylo rozumné spustit všechny aktualizace, když jste nainstalovali modul ve výchozím nastavení.

18
Lucy

Neměli byste si nechat instalační háček spouštět aktualizace. Při prvním nainstalování modulu by neměly být nutné žádné aktualizace.

Aktualizace se používají, když je modul již nainstalován (databáze nebo proměnné byly vytvořeny). V takovém případě nechcete modul přeinstalovat, protože smaže všechna data, místo toho vytvoříte háky update_N. Drupal zjistí, které aktualizace jsou potřeba a ty budou spuštěny na update.php. V Drupal 6) automaticky vybere, které aktualizace se mají provést, ale můžete ji změnit, zatímco to není možné v Drupal 7).

Drupal zjistí, které aktualizace jsou potřeba, uložením čísla poslední aktualizace spuštění. Mohou to být změny v databázi, které umožní opětovné spuštění aktualizací v Drupal 7. Opakované spuštění aktualizací je obvykle špatný nápad a nejčastěji způsobí chyby a v některých případech může vaše data zkomplikovat).

Před spuštěním aktualizací vždy nezapomeňte zálohovat databázi.

19
googletorp

Účel háčků je jiný.

  • hook_install () je vyvolán při instalaci modulu; to znamená, že modul nebyl dříve nainstalován, a proto jej není třeba aktualizovat.
  • hook_update_N () se vyvolá, když je modul již nainstalován a je třeba jej aktualizovat.

Pokud existují některé úkoly, které je třeba provést při instalaci modulu i při aktualizaci modulu, měl by být kód přítomen v obou háčcích. Neexistuje žádný modul, který během instalace vyvolá všechny aktualizační háčky, a to by bylo obzvláště špatné, když aktualizační funkce aktualizují schéma databázových tabulek použitých z modulu; hook_schema () by měl vždy vrátit aktualizované schéma a aktualizace schématu také pomocí aktualizačních funkcí by byla špatná.

Kód, který jste napsali, nefunguje, protože volání jedné z aktualizačních funkcí automaticky nespouští všechny ostatní aktualizační funkce.
Volání aktualizačních funkcí z implementace funkce hook_install() je nesprávné, protože je nesprávné volat aktualizační funkci z jiné; pokud existuje nějaký kód, který je třeba provést ze dvou nebo více aktualizačních funkcí, pak by měl být tento kód umístěn do funkce, která je vyvolána z aktualizačních funkcí, a z hook_install(), pokud je to nutné.

15
kiamlaluno

Instalační háček se volá pouze v případě, že je modul nainstalován čerstvě, takže není třeba provádět žádné aktualizace. Aktualizace se provádějí pouze v případě, že je modul již nainstalován, takže může použít další změny.

Chcete-li vynutit spuštění aktualizačních funkcí při instalaci, musíte změnit verzi schématu, například:

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();
}

Nebo spusťte z drush: drush -y updb.

Viz také: Je možné vynutit spuštění aktualizačního háku vašeho modulu?

5
kenorb

hook_install by nefungoval v souboru mymod.module.

Musíte umístit hook_install A hook_uninstall Do samostatného souboru mymod.install

Myslím, že hook_update_N() by také mělo být umístěno v mymod.install


Odpověď po aktualizaci otázky:

Citace z link , Zkontrolujte prosím číslo své verze v informačním souboru.

Vzhledem k tomu, že se vyvíjím soukromě a ne kvůli příspěvku, je při aktualizaci modulu pole „VERSION“ v souboru .info mého modulu prázdné nebo nezměněné. Vlastně používám Subversive pro Eclipse PDT, a proto se moje čísla verzí informačních souborů nikdy neaktualizují. Takže můj hook_update_6001 NEVYVOLALA update.php.

1
Shoaib Nawaz