Comment utiliser les scripts de configuration pour votre module?

22

Je me rends compte, vous pouvez utiliser des scripts de configuration pour votre propre module en les déclarant dans le fichier etc / config.xml de votre module dans l' <global>espace comme ceci:

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

Certains modules utilisent alors le fichier mysql4-install-0.0.1.phpalors que d'autres l'utilisent install-0.0.1.php. Alors, quand dois-je utiliser le mysql4 devant le nom de fichier et quand ne l'utilise-je pas?

De plus, que puis-je faire lorsque mon script d'installation n'est pas en cours d'exécution pour savoir pourquoi il ne l'est pas?

mpaepper
la source
1
Assurez-vous de supprimer votre entrée dans la table core_resource pour que votre configuration s'exécute à nouveau.
Rick Kuipers
En plus des autres réponses, il pourrait être intéressant de lire magentocommerce.com/images/uploads/RDBMS_Guide2.pdf Il provient de l'équipe principale et décrit les pensées derrière les modifications apportées avec 1.6 Je pense qu'il est toujours bon non seulement de savoir ce qui a changé mais aussi pourquoi.
Celldweller

Réponses:

21

À partir de Magento 1.6 et versions ultérieures, vous n'avez plus besoin d'utiliser mysql4 en raison de la prise en charge multi-RDBMS ajoutée.

Pour savoir pourquoi il ne fonctionne pas, vous pouvez vérifier le fichier exception.log ou system.log, peut-être que Magento n'a pas trouvé votre classe de configuration. La création d'un script d'installation est cependant assez simple.

Consultez également le guide d'Alan Storm: http://alanstorm.com/magento_setup_resources

Erfan
la source
11

En tant que @erfan saif, magento a pris en charge plusieurs rdbms depuis 1.6. Mais dans le monde réel, je ne connais que les backends mysql.

Il est important de comprendre que magento peut avoir différents scripts d'installation / mise à niveau / données pour différents backends. Si vous voulez un type d'index spécial qui est supporté par mysql mais pas par standard-SQL, vous pouvez implémenter un script mysql4-install-1.0.0.php. Si votre script est générique, utilisez install-1.0.0.php

Si vous jetez un œil à Mage_Core_Model_Resource_Setup, je peux trouver deux choses intéressantes:

  1. Vous pouvez nommer vos fichiers (% s -)% s-VERSION. (Php | sql)
  2. Si vous avez deux scripts d'installation (mais avec des scripts de données, c'est la même chose (app / code / core / Mage / Core / Model / Resource / Setup.php: 520)) magento préfère le script spécialisé au script générique (comme un seul attendrait)

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

Attention, si vous nommez votre script, .sqlil est appelé directement dans la base de données:

// 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);

De plus, que puis-je faire lorsque mon script d'installation n'est pas en cours d'exécution pour savoir pourquoi il ne l'est pas?

Je préfère un dé ('sadf') au début de mon fichier d'installation / mise à niveau, car je peux l'exécuter plusieurs fois s'il est appelé, donc je peux vérifier si toutes les variables que j'ai définies sont correctes, avant que quoi que ce soit ne soit changé dans la base de données. Si je vois le «sadf» à l'écran, je sais que le script est en cours d'exécution.

Je charge magento (au lieu du sadf), il est temps de déboguer, mes deux erreurs standard sont:

  1. J'ai oublié d'ajouter le script à la config
  2. J'ai le répertoire sql/oublié, par exemple sql/install-1.0.0.phpau lieu desql/my_module_setup/install-1.0.0.php

Et parce que je pense que cela convient ici, soyez prudent avec vos noms de variables: http://blog.fabian-blechschmidt.de/articles/file-kills-setup-script.html

UPDATE @ rouven-rieker a ajouté via twitter que les données et mysql4 manquants ont été ajoutés dans magento 1.6. Si vous avez besoin d'une compatibilité descendante, faites attention!

Fabian Blechschmidt
la source
3

Si votre script n'est pas en cours d'exécution, vous devez également vérifier si la version de vos modules correspond à la version de votre script d'installation.

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

Si votre script n'est pas en cours d'exécution, réinitialisez le numéro de version dans core_resource et videz le cache. Magento met en cache les versions à l'avance, il semble et manque d'exécuter des scripts de configuration lorsque tous les caches sont activés. Parce que nous travaillons tous avec le cache désactivé, nous ne le remarquerons peut-être pas, mais l'installation sur le site Live via le téléchargement ne fonctionnera pas si le cache est activé.

Petar Dzhambazov
la source