Como fazer com que hook_install () execute todos os hook_update_N ()?

18

Como posso obter o hook_install () para executar todas as atualizações que tenho para o meu módulo? Eu tenho nele o arquivo mymod.install.

eu tentei

function mymod_install() {
  mymod_update_6001();
}

mas parece não fazer nada. Se eu tiver um mymod_update_6002 (), eu ainda chamaria 6001 (), basta ligar para 6002 () ou para ambos na ordem 6001 (), 6002 ().

Eu pensei que seria bom senso executar todas as atualizações quando você instalasse um módulo por padrão.

Lucy
fonte

Respostas:

19

Você não deve obter o gancho de instalação para executar atualizações. Quando um módulo é instalado pela primeira vez, nenhuma atualização deve ser necessária.

As atualizações são usadas quando o módulo já está instalado (o banco de dados ou variáveis ​​foram criadas). Nesse caso, você não deseja reinstalar o módulo, pois ele limpará todos os dados; em vez disso, você criará ganchos update_N. O Drupal detectará quais atualizações são necessárias e as que serão executadas update.php. No Drupal 6, ele seleciona automaticamente quais atualizações executar, mas você pode alterá-lo, enquanto isso não é possível no Drupal 7.

O Drupal detecta quais atualizações são necessárias, salvando o número da última atualização de execução. Isso pode ser alterações no banco de dados, o que permitirá executar novamente as atualizações no Drupal 7. Executar novamente as atualizações geralmente é uma má idéia e geralmente causa erros e, em alguns casos, pode atrapalhar seus dados.

Lembre-se sempre de fazer backup do seu banco de dados antes de executar as atualizações.

googletorp
fonte
15

O objetivo dos ganchos é diferente.

  • hook_install () é chamado quando um módulo é instalado; significa que o módulo não foi instalado anteriormente e, portanto, não precisa ser atualizado.
  • hook_update_N () é chamado quando um módulo já está instalado e precisa ser atualizado.

Se houver algumas tarefas que precisam ser executadas quando o módulo estiver instalado e quando o módulo for atualizado, o código deverá estar presente nos dois ganchos. Não há módulo que chame todos os ganchos de atualização durante a instalação e isso seria especialmente errado quando as funções de atualização atualizassem o esquema das tabelas de banco de dados usadas no módulo; hook_schema () sempre deve retornar o esquema atualizado, e a atualização do esquema também com as funções de atualização estaria errada.

O código que você escreveu não funciona porque a chamada de uma das funções de atualização não executa automaticamente todas as outras funções de atualização.
Chamar as funções de atualização a partir da implementação de hook_install()está errado, pois é errado chamar uma função de atualização de outra; se houver algum código que precise ser executado a partir de duas ou mais funções de atualização, esse código deverá ser colocado em uma função chamada pelas funções de atualização e hook_install(), se necessário.

kiamlaluno
fonte
5

O gancho de instalação é chamado apenas quando o módulo é instalado recentemente, portanto, não há necessidade de atualizações. As atualizações são executadas apenas quando o módulo já está instalado, para que possa aplicar alterações adicionais.

Para forçar a execução das funções de atualização na instalação, você deve alterar sua versão do esquema, por exemplo:

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

Ou executá-lo a partir Drush: drush -y updb.

Consulte também: É possível forçar a atualização do gancho de seu módulo?

kenorb
fonte
1

hook_install não funcionaria com no mymod.modulearquivo.

Você precisa colocar hook_installe hook_uninstallem um arquivo separadomymod.install

Eu acho que isso hook_update_N()também deve ser colocado emmymod.install


Resposta após a pergunta atualizada:

Citando um link , verifique o número da sua versão no arquivo de informações.

Como estou desenvolvendo de forma privada e não para contribuição, meu campo 'VERSION' no arquivo .info do meu módulo fica em branco ou inalterado quando atualizo um módulo. Na verdade, estou usando o Subversive para eclipse PDT e, portanto, meus números de versão dos arquivos de informações nunca são atualizados. Assim, meu hook_update_6001 NÃO estava sendo chamado pelo update.php.

Shoaib Nawaz
fonte