Como usar scripts de instalação para o seu módulo?

22

Sei que você pode usar scripts de instalação para seu próprio módulo declarando-os no arquivo etc / config.xml do seu módulo dentro do <global>espaço da seguinte forma:

<resources>
    <catalog_setup>
        <setup>
            <module>Mage_Catalog</module>
            <class>Mage_Catalog_Model_Resource_Setup</class>
        </setup>
    </catalog_setup>
</resources>

Alguns módulos usam o arquivo, mysql4-install-0.0.1.phpenquanto outros usam install-0.0.1.php. Então, quando uso o mysql4 na frente do nome do arquivo e quando não o uso?

Além disso, o que posso fazer quando meu script de instalação não está em execução para descobrir por que não está?

mpaepper
fonte
1
Certifique-se de excluir sua entrada na tabela core_resource para que sua instalação seja executada novamente.
precisa saber é o seguinte
Além das outras respostas, pode ser interessante ler magentocommerce.com/images/uploads/RDBMS_Guide2.pdf É da equipe principal e descreve os pensamentos por trás das alterações feitas no 1.6. Acho que é sempre bom não apenas saber o que tem mudou, mas também por quê.
precisa saber é o seguinte

Respostas:

21

A partir do Magento 1.6 e superior, você não precisa mais usar o mysql4 por causa do suporte a multi-RDBMS.

Para descobrir por que ele não está sendo executado, você pode verificar o exception.log ou system.log, talvez o Magento não tenha encontrado sua classe de configuração. Criar um script de instalação é bastante simples.

Verifique também o guia de Alan Storm: http://alanstorm.com/magento_setup_resources

Erfan
fonte
11

Como @erfan saif, o magento tem suporte a multi-rdbms desde a versão 1.6. Mas no mundo real, eu sei apenas back-end mysql.

É importante entender que o magento pode ter diferentes scripts de instalação / atualização / dados para diferentes back-end. Se você deseja um tipo de índice especial suportado pelo mysql, mas não pelo SQL padrão, você pode implementar um script mysql4-install-1.0.0.php. Se o seu script for genérico, use install-1.0.0.php

Se você der uma olhada no Mage_Core_Model_Resource_Setup, posso encontrar duas coisas interessantes:

  1. Você pode nomear seus arquivos (% s -)% s-VERSION. (Php | sql)
  2. Se você possui dois scripts de instalação (mas com scripts de dados, é o mesmo (app / code / core / Mage / Core / Model / Resource / Setup.php: 520)), o magento prefere o script especializado ao invés do script genérico (como um esperaria)

app / code / core / Mage / Core / Model / Resource / Setup.php: 488

$regExpDb   = sprintf('#^%s-(.*)\.(php|sql)$#i', $actionType);
$regExpType = sprintf('#^%s-%s-(.*)\.(php|sql)$#i', $resModel, $actionType);

while (false !== ($file = $handlerDir->read())) {
    $matches = array();
    if (preg_match($regExpDb, $file, $matches)) {
        $dbFiles[$matches[1]] = $filesDir . DS . $file;
    } else if (preg_match($regExpType, $file, $matches)) {
        $typeFiles[$matches[1]] = $filesDir . DS . $file;
    }
}
[...]
foreach ($typeFiles as $version => $file) {
    $dbFiles[$version] = $file;
}

Cuidado, se você nomear seu script .sql ele será chamado diretamente no banco de dados:

// app/code/core/Mage/Core/Model/Resource/Setup.php:621
switch ($fileType) {
    case 'php':
        $conn   = $this->getConnection();
        $result = include $fileName;
        break;
    case 'sql':
        $sql = file_get_contents($fileName);
        if (!empty($sql)) {

            $result = $this->run($sql);

Além disso, o que posso fazer quando meu script de instalação não está em execução para descobrir por que não está?

Eu prefiro um dado ('sadf') no início do meu arquivo de instalação / atualização, porque posso executá-lo várias vezes se for chamado, para que eu possa verificar se todas as variáveis ​​que defini estão corretas antes que qualquer coisa seja alterada. o banco de dados. Se eu vir o 'sadf' na tela, eu sei, o script está sendo executado.

Eu carrego magento (em vez do sadf), é hora de depurar, meus dois erros padrão são:

  1. Esqueci de adicionar o script à configuração
  2. sql/Esqueci o diretório , por exemplo, em sql/install-1.0.0.phpvez desql/my_module_setup/install-1.0.0.php

E como acho que se encaixa aqui, tenha cuidado com os nomes das variáveis: http://blog.fabian-blechschmidt.de/articles/file-kills-setup-script.html

UPDATE @ rouven-rieker adicionou via twitter que dados e mysql4 ausentes foram adicionados no magento 1.6. Se você precisar de compatibilidade com versões anteriores, tenha cuidado!

Fabian Blechschmidt
fonte
3

Se o seu script não estiver em execução, verifique também se a versão do seu módulo corresponde à versão do seu script de instalação.

<modules>
    <Your_Module>
        <version>0.0.1</version>
    </Your_Module>
</modules> 
Anna Völkl
fonte
1

Se seu script não estiver em execução, redefina o número da versão em core_resource e limpe o cache. O Magento armazena em cache as versões antecipadamente, parece e não executa os scripts de instalação quando todos os caches estão ativados. Como todos trabalhamos com o cache desativado, podemos não perceber isso, mas a instalação no site ao vivo por upload não funcionará se o cache estiver ativado.

Petar Dzhambazov
fonte