it-swarm.com.de

Mein Magento Extension-Installationsskript wird nicht ausgeführt

Ich versuche, ein Installationsskript für meine Erweiterung zu erstellen, und aus irgendeinem Grund wird es nicht das Installationsskript sein. Die Erweiterung wird in der Tabelle "core_resource" angezeigt, aber die Attribute, die ich erstellen möchte, werden nicht erstellt.

Ich bin mir ziemlich sicher, dass das Skript nicht einmal aufgerufen wird, weil ich am Anfang ein exit () gesetzt habe und die Seite gut lief.

Folgendes habe ich in meiner config-XML-Datei. Dieser befindet sich im globalen Pfad -> Ressourcenpfad:

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

Mein Installationsskript lautet wie folgt:

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

Gibt es etwas offensichtliches, was mir fehlt, das wäre der Grund, warum das Skript nicht läuft?

30
Josh Pennington

Arbeite dich durch diesen Artikel , um sicherzustellen, dass du keine Missverständnisse darüber hast, was die Setup-Ressourcen tun, wie sie funktionieren und wie du sie beheben kannst.

Nachdem Sie dies getan haben, klingt das nach allem, was Sie in diesem Fragenthread gesagt haben, dass Ihre Ressource "installiert" wird, das Installationsskript jedoch nicht ausgeführt wird. Meine Vermutung ist, dass Sie die Versionsnummer verwendet haben 

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

passte nicht zur Version Ihres Moduls

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

Diese sollten übereinstimmen, damit das Skript ausgeführt wird. Ich denke Magento ist intelligent genug, um frühere Versionen auszuführen, wenn sie diese finden. Der Code in den Setup-Ressourcen ist jedoch der Art, der schwer zu folgen ist. Daher stelle ich sicher, dass sie übereinstimmen.

Unabhängig davon, wie Sie sehen können, welche Datei (en) Magento beim Ausführen Ihrer Setup-Ressource ausführen möchte. Löschen Sie alle Einträge aus core_resource, die sich auf Ihr Modul beziehen. Leeren Sie den Cache. Suchen Sie dann die folgenden Positionen in der Setup-Klasse

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

und ändern Sie sie dann, um einige temporäre Debugging-Ausnahmen hinzuzufügen 

    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.");

Wenn Sie die Seite neu laden, wird der Ausnahmetext darüber angezeigt, dass Magento nicht gefunden wird. Das sollte ausreichen, um herauszufinden, welches Installationsskript Magento auszuführen versucht, aber nicht gefunden wird. Denken Sie daran, die Zeile Ihres Moduls in core_resource zu löschen und den Cache zu löschen. (Magento-Caches, deren Module für eine Installation/ein Upgrade geprüft werden müssen)

Wenn dies nicht funktioniert, fangen Sie an, sich mit der Logik von applyAllDataUpdates zu beschäftigen und herauszufinden, warum die Klasse Ihre Installationsdatei nicht enthält. 

70
Alan Storm

Der einfachste und aufschlussreichste Weg, diesen Fehler aufzuspüren, besteht darin, Ihre IDE zum Debuggen von Magento einzurichten und einen Haltepunkt in Ihrem mysql4-install-0.0.1.php festzulegen. Wenn der Haltepunkt nicht erreicht wird, wissen Sie, ob das Problem in Ihrer XML-Konfiguration liegt. Wenn der Haltepunkt erreicht wird, können Sie den Code nachverfolgen, um die Fehlerquelle zu finden. 

Es kann einen halben Tag dauern, um das Setup einzurichten, aber Live Debuggen von Magento ist bei weitem der beste Weg, um den Code zu erlernen und zu verstehen. Tun Sie sich selbst einen Gefallen und investieren Sie jetzt. 

14
Jonathan Day

Als ich auf dieses Problem stieß, musste ich eigentlich den Cache deaktivieren. Nur das Spülen half aus irgendeinem Grund nicht.

12
Björn Tantau

Gemäß der Magento Knowledgebase können Sie versuchen, einen <class>-Tag in Ihren <setup> einzufügen. Auf diese Weise können Sie sicherstellen, dass das richtige Einrichtungsmodell verwendet wird, und wenn es so weit ist, übergibt es das Modell an Ihr Installationsskript, ohne dass ein $setup manuell erstellt werden muss.

Überprüfen Sie die Dateiberechtigungen des Installationsskripts und das Verzeichnis, in dem es sich befindet. Manchmal finde ich das Löschen des Datensatzes aus core_resources hilfreich, um den Prozess zu starten.

3
clockworkgeek

Sie können in Magento prüfen, welche Module geladen sind und welche Version dieses Moduls geladen ist:

  1. Gehe zu app/code/core/Mage/Core/Model/Resource/Setup.php
  2. Gehe zur Funktion __construct()
  3. Am Ende der Funktion schreiben Sie:

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

Es werden alle mit der Versionsnummer geladenen Module protokolliert. Hier können Sie überprüfen, ob Ihr Modul geladen ist oder nicht.

3
Arvind Bhardwaj

Sie sollten die Version Ihres Moduls um einen Punkt nach oben ändern, damit das Aktualisierungsskript ausgeführt wird.

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

Wenn diese Version der Ressourcenversion aus core_resources-Tabelle entspricht, wird kein Upgrade-Skript ausgeführt. Die Version sollte mit dem Namen Ihres Upgrade-Skripts übereinstimmen

2
Eugene Tulika

Wir hatten das gleiche Problem für unseren Shop http://www.looxis.de Um eine von uns verwendete Erweiterung zu aktualisieren, haben wir alle Dateien über FTP übertragen, aber die Datenbank hat sich nach dem Löschen nicht selbst aktualisiert der Cache Die aktualisierte Erweiterung konnte daher nicht ausgeführt werden, sodass wir uns nicht im Backend anmelden konnten.

Auf der Suche nach einer Lösung haben wir diese Seite gefunden.

Das Problem war, dass wir vor einigen Wochen eine neuere Version des Moduls installiert haben, die ebenfalls aufgrund eines Konflikts mit anderen Modulen zu Fehlern führte. Daher haben wir teilweise aus unserem Datenbank-Backup einige Tabellen übertragen und die alten Dateien zurückgesetzt. alles funktionierte wieder

als wir versuchten, das Modul zu aktualisieren, das jetzt mit der anderen Erweiterung kompatibel war (Konflikt wurde entfernt), wurde das SQL-Aktualisierungsskript nicht ausgeführt.

Dies lag an der Tabelle "core_resources". Dort wurde die Versionsnummer des Moduls auf die neueste Version eingestellt, die wir vor Wochen installiert hatten. Magento konnte also nicht erkennen, dass ein neues Update erneut durchgeführt wurde. Es wurde davon ausgegangen, dass die neueste Version bereits vorhanden war.

Wir haben die Versionsnummer manuell in eine niedrigere Version geändert. Boom, das Upgrade-Skript wurde initiiert und alles funktionierte einwandfrei!

1
Etienne Renaud

Überprüfen Sie Ihre App/etc/modules-Datei, stellen Sie sicher, dass der Name Ihres Moduls korrekt ist und der Codepool genau angegeben ist.

0
Coolster