it-swarm.it

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

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.

18
Lucy

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 verranno eseguiti andando su update.php. In Drupal 6 selezionerà automaticamente quali aggiornamenti fare, ma puoi cambiarlo, 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 molto spesso causerà errori e in alcuni casi può confondere i tuoi dati.

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

19
googletorp

Lo scopo dei ganci è diverso.

  • hook_install () viene richiamato quando viene 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 sbagliato.

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 esiste del codice che deve essere eseguito da due o più funzioni di aggiornamento, quel codice deve essere inserito in una funzione chiamata dalle funzioni di aggiornamento e da hook_install(), se necessario.

15
kiamlaluno

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

O eseguilo da Drush: drush -y updb.

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

5
kenorb

hook_install non funzionerebbe con nel file mymod.module.

Devi inserire hook_install E hook_uninstall In un file separato mymod.install

Immagino che hook_update_N() dovrebbe essere inserito anche in mymod.install


Risposta dopo l'aggiornamento della domanda:

Citando da un link , controlla il tuo numero di versione nel file informativo.

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. Attualmente sto usando Subversive per Eclipse PDT e quindi i numeri di versione dei miei file di informazioni non vengono mai aggiornati. Pertanto, il mio hook_update_6001 NON veniva chiamato da update.php.

1
Shoaib Nawaz