Come ottenere hook_install () per eseguire tutto hook_update_N ()?


18

Come posso ottenere hook_install () per eseguire tutti gli aggiornamenti che ho per il mio modulo? Ho al suo interno il file mymod.install.

Ho provato

function mymod_install() {
  mymod_update_6001();
}

ma non sembra fare nulla. Se avessi un mymod_update_6002 () chiamerei ancora 6001 (), basta chiamare 6002 () o chiamare entrambi nell'ordine 6001 (), 6002 ().

Ho pensato che sarebbe stato logico eseguire tutti gli aggiornamenti quando hai installato un modulo per impostazione predefinita.

Risposte:


19

Non dovresti ottenere il tuo hook di installazione per eseguire gli aggiornamenti. Quando un modulo viene installato per la prima volta, non dovrebbero essere necessari aggiornamenti.

Gli aggiornamenti vengono utilizzati quando il modulo è già installato (il database o le variabili sono stati creati). In tal caso, non si desidera reinstallare il modulo poiché cancellerà tutti i dati, invece si creano hook di update_N. Drupal rileverà quali aggiornamenti sono necessari e quelli che verranno eseguiti andando update.php. In Drupal 6 selezionerà automaticamente quali aggiornamenti eseguire, ma è possibile modificarlo, mentre ciò non è possibile in Drupal 7.

Drupal rileva quali aggiornamenti sono necessari salvando il numero dell'ultimo aggiornamento eseguito. Queste possono essere modifiche nel database, che consentiranno di rieseguire gli aggiornamenti in Drupal 7. La riesecuzione degli aggiornamenti è di solito una cattiva idea e spesso causa errori e in alcuni casi può confondere i tuoi dati.

Ricordarsi sempre di eseguire il backup del database prima di eseguire gli aggiornamenti.


15

Lo scopo dei ganci è diverso.

  • hook_install () viene richiamato quando è installato un modulo; significa che il modulo non è stato precedentemente installato e quindi non ha bisogno di essere aggiornato.
  • hook_update_N () viene richiamato quando un modulo è già installato e deve essere aggiornato.

Se ci sono alcune attività che devono essere eseguite sia quando il modulo è installato, sia quando il modulo viene aggiornato, il codice dovrebbe essere presente in entrambi gli hook. Non ci sono moduli che invocano tutti gli hook di aggiornamento durante l'installazione e ciò sarebbe particolarmente sbagliato quando le funzioni di aggiornamento aggiornano lo schema delle tabelle del database utilizzate dal modulo; hook_schema () dovrebbe sempre restituire lo schema aggiornato e l'aggiornamento dello schema anche con le funzioni di aggiornamento sarebbe errato.

Il codice che hai scritto non funziona perché la chiamata a una delle funzioni di aggiornamento non esegue automaticamente tutte le altre funzioni di aggiornamento.
Chiamare le funzioni di aggiornamento dall'implementazione di hook_install()è errato, poiché è errato chiamare una funzione di aggiornamento da un'altra; se è presente un codice che deve essere eseguito da due o più funzioni di aggiornamento, tale codice deve essere inserito in una funzione chiamata dalle funzioni di aggiornamento e hook_install(), se necessario, da.


5

Il hook di installazione viene chiamato solo quando il modulo è appena installato, quindi non è necessario alcun aggiornamento. Gli aggiornamenti vengono eseguiti solo quando il modulo è già installato, quindi può applicare ulteriori modifiche.

Per forzare l'esecuzione delle funzioni di aggiornamento all'installazione, è necessario modificare la versione dello schema, ad esempio:

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

Oppure lanciarlo da Drush: drush -y updb.

Vedi anche: È possibile forzare l'esecuzione dell'hook di aggiornamento del modulo?


1

hook_install non funzionerebbe con nel mymod.modulefile.

Devi posizionare hook_installe hook_uninstallin un file separatomymod.install

Immagino che hook_update_N()dovrebbe essere inserito anche inmymod.install


Risposta dopo l'aggiornamento della domanda:

Citando da un collegamento , si prega di controllare il numero di versione nel file di informazioni.

Dal momento che sto sviluppando privatamente e non per il contributo, il mio campo "VERSIONE" nel file .info del mio modulo è vuoto o invariato quando aggiorno un modulo. In realtà sto usando Subversive per eclipse PDT e quindi i miei numeri di versione dei file di informazioni non vengono mai aggiornati. Pertanto, il mio hook_update_6001 NON veniva chiamato da update.php.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.