Wie verwende ich Setup-Skripte für mein Modul?

22

Mir ist klar, dass Sie Setup-Skripte für Ihr eigenes Modul verwenden können, indem Sie sie in der Datei etc / config.xml Ihres Moduls in folgendem Bereich deklarieren <global>:

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

Einige Module verwenden dann die Datei, mysql4-install-0.0.1.phpwährend andere verwenden install-0.0.1.php. Wann verwende ich mysql4 vor dem Dateinamen und wann verwende ich es nicht?

Was kann ich auch tun, wenn mein Setup-Skript nicht ausgeführt wird, um herauszufinden, warum dies nicht der Fall ist?

mpaepper
quelle
1
Stellen Sie sicher, dass Sie Ihren Eintrag in der Tabelle core_resource löschen, damit das Setup erneut ausgeführt wird.
Rick Kuipers
Zusätzlich zu den anderen Antworten könnte es interessant sein, magentocommerce.com/images/uploads/RDBMS_Guide2.pdf zu lesen . Es stammt aus dem Kernteam und beschreibt die Gedanken hinter den Änderungen, die mit 1.6 vorgenommen wurden. Ich denke, es ist immer gut, nicht nur zu wissen, was hat aber auch warum geändert.
Celldweller

Antworten:

21

Ab Magento 1.6 müssen Sie mysql4 nicht mehr verwenden, da Multi-RDBMS unterstützt wird.

Um herauszufinden, warum es nicht läuft, können Sie die Datei exception.log oder system.log überprüfen. Magento hat möglicherweise Ihre Setup-Klasse nicht gefunden. Das Erstellen eines Installationsskripts ist jedoch ziemlich einfach.

Lesen Sie auch den Alan Storm-Leitfaden: http://alanstorm.com/magento_setup_resources

Erfan
quelle
11

Als @erfan saif hat Magento seit 1.6 Multi-Rdbms-Unterstützung. Aber in der realen Welt kenne ich nur MySQL-Backends.

Es ist wichtig zu verstehen, dass Magento verschiedene Installations- / Upgrade- / Datenskripte für verschiedene Backends haben kann. Wenn Sie einen speziellen Indextyp wünschen, der von MySQL, aber nicht von Standard-SQL unterstützt wird, können Sie ein Skript für MySQL4-Install-1.0.0.php implementieren. Wenn Ihr Skript generisch ist, verwenden Sie install-1.0.0.php

Wenn Sie sich Mage_Core_Model_Resource_Setup ansehen, finde ich zwei interessante Dinge:

  1. Sie können Ihre Dateien benennen (% s -)% s-VERSION. (Php | sql)
  2. Wenn Sie über zwei Installationsskripte verfügen (jedoch mit Datenskripten, die identisch sind (app / code / core / Mage / Core / Model / Resource / Setup.php: 520)), zieht magento das spezielle Skript dem generischen Skript (als ein Skript) vor würde erwarten)

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

Seien Sie vorsichtig, wenn Sie Ihr Skript benennen, wird .sqles direkt in der Datenbank aufgerufen:

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

Was kann ich auch tun, wenn mein Setup-Skript nicht ausgeführt wird, um herauszufinden, warum dies nicht der Fall ist?

Ich bevorzuge einen Würfel ('sadf') am Anfang meiner Installations- / Aktualisierungsdatei, da ich ihn bei einem Aufruf mehrmals ausführen kann, um zu überprüfen, ob alle von mir festgelegten Variablen korrekt sind, bevor etwas geändert wird die Datenbank. Wenn ich das "sadf" auf dem Bildschirm sehe, läuft das Skript.

Wenn ich magento lade (anstelle des sadf), ist es Zeit zu debuggen, meine zwei Standardfehler sind:

  1. Ich habe vergessen, das Skript zur Konfiguration hinzuzufügen
  2. Ich habe das Telefonbuch sql/vergessen, zB sql/install-1.0.0.phpstattsql/my_module_setup/install-1.0.0.php

Und weil ich denke, dass es hier passt, seien Sie vorsichtig mit Ihren Variablennamen: http://blog.fabian-blechschmidt.de/articles/file-kills-setup-script.html

UPDATE @ rouven-rieker fügte via Twitter hinzu, dass Daten- und fehlendes mysql4- in Magento 1.6 hinzugefügt wurden. Wenn Sie Abwärtskompatibilität benötigen, seien Sie vorsichtig!

Fabian Blechschmidt
quelle
3

Wenn Ihr Skript nicht ausgeführt wird, sollten Sie auch überprüfen, ob Ihre Modulversion mit der Version Ihres Setup-Skripts übereinstimmt.

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

Wenn Ihr Skript nicht ausgeführt wird, setzen Sie die Versionsnummer in core_resource zurück und leeren Sie den Cache. Magento zwischenspeichert Versionen im Voraus und es scheint, dass Setup-Skripte nicht ausgeführt werden, wenn alle Caches aktiviert sind. Da wir alle mit deaktiviertem Cache arbeiten, bemerken wir dies möglicherweise nicht, aber die Installation auf einer Live-Site per Upload funktioniert nicht, wenn der Cache aktiviert ist.

Petar Dzhambazov
quelle