Eu sou o autor do módulo Date iCal e a nova versão principal em que estou trabalhando (3.x) exige uma atualização de esquema em duas partes para usuários com o 2.x instalado. Eu escrevi o gancho de atualização que faz essas alterações, mas se um dos meus usuários não conseguir executar o script de atualização do banco de dados, eles receberão uma mensagem de erro relacionada aos importadores de feeds do iCal.
A solução certa é que eles executem o script de atualização ... mas se eles entrarem e mudarem manualmente seus importadores para se livrar da mensagem, seus importadores permanecerão permanentemente quebrados (porque a segunda parte da atualização do esquema não será foram executados).
Existe alguma maneira de exibir uma mensagem para usuários que não executaram a atualização? Ou, de alguma maneira, executar forçosamente o gancho de atualização na primeira vez que um carregamento de página ocorre quando o 3.x é instalado sobre o 2.x?
variable_set()
na sua função de atualização que define uma variável, quando foi executada com êxito, que você poderia ver dentro de um,_preprocess_page()
mas você o observaria toda vez, para não ter certeza de quão amigável seria o desempenho.Respostas:
estendendo sobre o comentário de Jimajamma:
e, em vez de verificar isso em cada carregamento da página, faça-o apenas se estiver navegando na área de administração e se a versão instalada for 3.0 (3.1, 3.2, interrompa essa verificação se você parar de oferecer suporte à versão antiga como um caminho de atualização).
Além disso, use hook_requirements para fornecer feedback sobre a página do relatório de status:
fonte
Existem algumas maneiras de forçar a atualização do módulo.
Chamando a função de atualização diretamente.
Redefinindo a versão do esquema para o ponto de interesse e execute as atualizações novamente como de costume.
Ou redefina para executar novamente apenas o esquema de atualização mais recente:
Notas:
hook_install
, portanto, durante o processo de atualização, todos os ganchos de atualização sequenciais serão executados.Para usar esta função fora do arquivo de instalação, você deve incluir o Drupal
install.inc
primeiro e o arquivo de instalação do módulo, por exemploini_set('max_execution_time', 0);
atualizações de instalação mais longas para evitar o tempo limite do PHP.Usando
drush
. Veja abaixo alguns exemplos:drush eval 'module_load_include('install', 'foo'); $s = []; foo_update_7001($s);'
drush sqlq "UPDATE system SET schema_version = 7000 WHERE name = 'foo'" && drush -y updb
fonte
drupal_set_installed_schema_version()
. Isso seria super útil para depurar ganchos de atualização!hook_install()
é a execução de longas atualizações em lotes (em área restrita). Na situação ideal, deve haver uma maneira de disparar atualizações da mesma maneiraupdate.php
que reinicia o encadeamento do PHP para evitar tempos limite. Idéias de formiga como fazer isso?ini_set('max_execution_time', 0);
antes de acionar as atualizações.(Reescrito em uma resposta)
Você pode "SELECT schema_version FROM system" para detectar se uma atualização foi executada. Caso contrário, recuse-o a executar (com uma mensagem de erro).
fonte
Concordo com as sugestões acima - minha única adição seria investigar "Acionadores e ações" também - parece que você precisa de uma ação (notificar o usuário ou executar uma atualização) para ocorrer quando um acionador (o usuário verifica a página de administração, etc.) é acionado . Para exemplos de uso, consulte o módulo Exemplos, existem códigos de exemplo de ação e acionador. :)
fonte
function MYMODULE_install() { $functions = get_defined_functions(); foreach ($functions['user'] as $function) { if (strpos($function, 'MYMODULE_update_') === 0) { call_user_func($function); } } }
fonte