web-dev-qa-db-fra.com

Mon script d'installation d'extension Magento ne s'exécutera pas

J'essaie de créer un script d'installation pour mon extension et, pour une raison quelconque, ce ne sera pas le script d'installation. L'extension apparaîtra dans la table core_resource, mais les attributs que je tente de créer ne créeront pas.

Je suis à peu près sûr que le script n'est même pas appelé car j'ai mis un exit () au début et le site a fonctionné correctement.

Voici ce que j'ai dans mon fichier XML de configuration. Ceci est placé dans global -> chemin des ressources:

<nie_setup>
    <setup>
        <module>Nie_Nie</module>
    </setup>
    <connection>
        <use>core_setup</use>
    </connection>
</nie_setup>

Mon script d'installation est le suivant:

$installer = $this;
$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();

$setup->addAttribute('customer', 'nie_admin', array(
    'input'                 => 'text',
    'type'                  => 'text',
    'backend'               => '',
    'visible'               => 0,
    'required'          => 0,
    'user_defined'  => 1,
));

$installer->endSetup();

Y a-t-il quelque chose d'évident qui me manque ici qui serait la raison pour laquelle le script ne fonctionnera pas?

30
Josh Pennington

Parcourez cet article pour vous assurer de ne pas vous méprendre sur ce que font les ressources d’installation, comment elles fonctionnent et comment les résoudre.

Une fois que vous avez fait cela, tout ce que vous avez dit sur ce fil de question donne l’impression que votre ressource est "installée", mais que votre script d’installation ne s’exécute jamais. Je suppose que le numéro de version que vous avez utilisé dans 

//0.0.1 is your version number
mysql4-install-0.0.1.php

ne correspond pas à la version de votre module

<modules>
    <Nie_Nie>
        <version>?.?.?</version>
    </Nie_Nie>
</modules>

Ceux-ci doivent correspondre pour que le script s'exécute. Je pense que Magento est suffisamment intelligent pour exécuter les versions précédentes s’il les trouve, mais le code des ressources de configuration est difficile à suivre. Je m’assure donc toujours qu’elles correspondent.

Quoi qu’il en soit, voici comment vous pouvez voir le ou les fichiers que magento essaie d’exécuter lorsqu’il exécute votre ressource de configuration. Supprimez toutes les entrées de core_resource relatives à votre module. Videz votre cache. Trouvez ensuite les emplacements suivants dans la classe d'installation

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

protected function _modifyResourceDb($actionType, $fromVersion, $toVersion)
{
    ... 

    $sqlFilesDir = Mage::getModuleDir('sql', $modName).DS.$this->_resourceName;        

    if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) {
        return false;
    }

    ...

    $sqlDir->close();

    if (empty($arrAvailableFiles)) {
        return false;
    }

    ...

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);
    if (empty($arrModifyFiles)) {
        return false;
    }

puis modifiez-les pour ajouter des exceptions de débogage temporaires 

    if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) {
        throw new Exception("$sqlFilesDir not found");
        return false;
    }

    ...

    if (empty($arrAvailableFiles)) {
        throw new Exception("No files found to run");
        return false;
    }

    ...

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);
    if (empty($arrModifyFiles)) {
        throw new Exception("No valid upgrade files found to run for ");
        return false;
    }

    throw new Exception("If you're getting here, we have a file.  Remove your exceptions here and place one in your installer to make sure it's the one you think it is.");

Rechargez la page et vous obtiendrez un texte d'exception se plaignant de tout ce que Magento ne peut pas trouver. Cela devrait suffire à vous aider à identifier le script d’installation que Magento essaie d’exécuter mais n’a pas réussi à trouver. N'oubliez pas de supprimer la ligne de votre module dans core_resource et d'effacer votre cache. (Magento met en cache quels modules doivent vérifier une installation/mise à jour)

Si cela ne fonctionne pas, commencez à vous plonger dans la logique de applyAllDataUpdates et déterminez pourquoi la classe n'inclut pas votre fichier d'installation. 

70
Alan Storm

Le moyen le plus simple et le plus instructif de détecter cette erreur consiste à configurer votre IDE pour déboguer Magento et définir un point d'arrêt dans votre mysql4-install-0.0.1.php. Si le point d'arrêt n'est pas touché, vous saurez si le problème se trouve dans votre configuration XML. Si le point d'arrêt est touché, vous pouvez suivre le code pour trouver la source de l'erreur. 

Cela peut prendre une demi-journée à l’installation, mais le débogage en direct de Magento est de loin le meilleur moyen d’apprendre et de comprendre le code. Faites-vous une faveur, faites l'investissement maintenant. 

14
Jonathan Day

Lorsque j'ai rencontré ce problème, j'ai dû désactiver le cache. Rincer simplement ça n'a pas aidé pour une raison quelconque.

12
Björn Tantau

Selon Magento Knowledgebase vous pouvez essayer d’inclure une balise <class> dans votre <setup>. De cette façon, vous pouvez vous assurer que le bon modèle de configuration est utilisé et (le cas échéant) le transmet à votre script d'installation, évitant ainsi la nécessité de créer un $setup manuellement.

Vérifiez les autorisations de fichier du script d'installation et le répertoire dans lequel il se trouve. Je trouve parfois que supprimer l'enregistrement de core_resources aide également à démarrer le processus.

3
clockworkgeek

Vous pouvez vérifier dans Magento quels modules sont chargés et quelle version de ce module est chargée:

  1. Aller au app/code/core/Mage/Core/Model/Resource/Setup.php
  2. Aller à la fonction __construct()
  3. A la fin de la fonction, écrivez:

    Mage::log($modName); Mage::log($this->_moduleConfig);

Il enregistrera tous les modules chargés avec leur numéro de version. Ici, vous pouvez vérifier si votre module est chargé ou non.

3
Arvind Bhardwaj

Vous devez changer la version de votre module d'un point supérieur pour que votre script de mise à jour s'exécute.

<modules>
    <Nie_Nie>
        <version>1.5.0.0</version>
    </Nie_Nie>
</modules>

Si cette version est égale à la version de la ressource à partir de core_resources, le script de mise à niveau de la table ne sera pas exécuté. Et la version doit correspondre au nom de votre script de mise à niveau

2
Eugene Tulika

Nous avons eu le même problème pour notre magasin http://www.looxis.de Pour mettre à jour une extension utilisée, nous avons transféré tous les fichiers via FTP, mais la base de données ne s'est pas mise à jour après la suppression. la cache. Donc, l'extension mise à jour a échoué, nous n'avons pas pu nous connecter au backend.

En recherchant une solution, nous avons trouvé cette page.

Le problème était que nous avions installé une version plus récente du module quelques semaines auparavant, ce qui entraînait également des erreurs dues à un conflit avec d'autres modules. Nous avons donc transféré partiellement à partir de notre base de données de sauvegarde certaines tables et restitué les anciens fichiers. tout fonctionnait à nouveau,

lorsque nous avons essayé de mettre à jour le module, qui était désormais compatible avec l'autre extension (le conflit avait été supprimé), le script de mise à jour SQL ne s'exécutait pas.

Cela était dû à la table "core_resources". dans celui-ci, le numéro de version du module était défini sur la version la plus récente que nous avions installée plusieurs semaines auparavant - afin que magento ne reconnaisse pas qu'une nouvelle mise à jour a été effectuée à nouveau, il suppose que la version la plus récente existe déjà.

Nous avons modifié manuellement le numéro de version en une version inférieure et boum, le script de mise à niveau a été lancé et tout fonctionnait bien!

1
Etienne Renaud

Assurez-vous de vérifier le fichier de votre application/etc/modules, assurez-vous que le nom de votre module est exact et que le pool de codes est spécifié avec précision.

0
Coolster