Update Problem beim Plugin

Hallo zusammen,

ich weiß garnicht wie ich hier anfangen soll…

Also ich habe ein Backend-Plugin für einen Kunden Entwickelt, dieses funktioniert einwandfrei.

Nun gab es neue Anforderungen und ich habe diese umgesetzt, bei mir funktioniert alles nach einem update weiterhin (wohlgemerkt sogar auf 2 verschiednen betriebssystemen mit zum teil unterschiedlichen Konfigurationen).

Das Update erweitert unter anderem das Custom Model um einige weitere Datenbankfelder.

Beim Kunden jedoch gibt es das Problem, dass sobald sie das Plugin update bei sich hochladen, das Update im Plugin-Manager durchführen und beim start des Plugins im Backend eine Fehlermeldung kommt. Diese Fehlermeldung kommt aus dem Grund weil die Datenbank beim Update nicht um die neuen felder aus dem Model erweitert wird.

Eine installation des Updates statt die ältere version zu updaten funktioniert jedoch fehlerfrei.

 

Folgende fälle gibt es:

  • Plugin installieren

  • Konfiguration ausfüllen

  • Plugin Update hochladen und update durchführen

-> Fehler, wenn man jedoch danach die current-version des Updates noch einmal hochsetzt und das update noch einmal durchführt wird alles richtig angelegt.


  • Plugin installieren

  • Konfiguration ausfüllen

  • Plugin Update hochladen und update durchführen

-> Fehler, geupdatetes Plugin neu installieren -> Kein Fehler, jedoch sind natürlich alle Daten aus der DB weg


  • Plugin installieren

  • Konfiguration ausfüllen

  • Gesamten cache löschen

  • Plugin Update hochladen und update durchführen

-> KEIN Fehler

 

Ich habe versucht diesen Fehler auf unterschiedlichen Shopware Versionen (4.3.7, 5.1.6, 5.2.x, 5.3.x, 5.4.x) und Unix Servern (Debian, Ubuntu) nachzustellen, jedoch kein Erfolg.

Die Server/PHP Konfigs werden beim Kunden in seinen Shopware Versionen auch alle Grün angezeigt unter Systeminfo…

Hat irgendwer eine idee was ich hier tun oder prüfen kann?

 

Update sieht wie folgt aus:

    public function update($version)
    {
        $modelManager = Shopware()->Models();

        $tool = new Doctrine\ORM\Tools\SchemaTool($modelManager);
        $schemas = [
            $modelManager->getClassMetadata(MeinModel::class),
        ];

        /** @var MySqlSchemaManager $schemaManager */
        $schemaManager = $modelManager->getConnection()->getSchemaManager();
        foreach($schemas as $class) {
            if (!$schemaManager->tablesExist($class->getTableName())) {
                try {
                    $tool->createSchema([$class]);
                } catch (\Exception $e) {
                    return array('success' => false, 'message' => $e->getMessage());
                }
            }else{
                $modelManager->regenerateProxies();
                $tool->updateSchema([$class], true);
            }
        }
        switch ($version) {
            case '1.0.6':
                $this->customUpdateSettings();
            default:
                break;
        }


        return array(
            'success' => true,
            'invalidateCache' => array('config', 'backend', 'proxy', 'frontend', 'template', 'snippets')
        );
    }

In CustomUpdateSettings werden einfach nur ein paar Daten in die DB geschrieben.

Vielen Dank im Voraus!

Für alle die auf die Problematik auch stoßen sollten:

Shopware cached die customModels (Warum das bei mir nicht der Fall war, keine Ahnung)

Die Lösung war also im update als allererstes den proxy cache zu löschen.

        $cacheManager = Shopware()->Container()->get('shopware.cache_manager');
       
        $cacheManager->clearProxyCache();

 

Hallo Nochmal,

 

irgendwie schient es jetzt den Fehler bei einigen anderen Systemen zu geben, da hilft wohl auch das Proxy Cache leeren nicht.

Hat jemand noch eine Idee warum beim Update das erweiterte CustomModel nicht berücksichtigt wird? Vllt. Jemand von Shopware?

 

Vielen Dank schonmal!

hallo ,

kannst du zu mir sagen was ist die genau Fehler Meldung??

 

Vg,

Ahmad

Hi,

der Fehler ist folgender:

core.CRITICAL: An exception occurred while executing 'SELECT s0_.shopId AS shopId_0, [alle datenbank-tabellen-spalten meines Plugins] …
SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘s0_.meinespalte’ in ‘field list’

Ich hab das mal ein wenig anonymisiert, der Kunden wegen…

Im Prinzip weiß ich, dass der  Fehler Aussagt: die Spalte kann nicht gefunden werden, wird zwar nur eine Spalte angezeigt aber in der Datenbank fehlen alle Spalten aus dem Update.

Ich habe folgendes Tutorial benutzt:

https://synonymous.rocks/shopware-model-entity-beim-update-eines-plugins-modifizieren/

Jetzt habe ich einfach gesagt, dass wenn die spaltenanzahl nach Update immernoch die alte ist, erstelle direkt per SQL diese Spalten. Mal schauen ob das workaround den Fehler löst. 

VG

 

Hallo @wabAB‍,

also in diese Tutorial gibt keine $modelManager->regenerateProxies(); , warum benutzen Sie diese Command , und in habe auch viele Plugins gesucht , und sie benutzen diese command nicht.

also probiere einmal ohne diese command, oder rufen Sie diese Command nach die updateSchema command.

es ist nur eine Idie , ich habe diese nicht probieren.

VG,

Ahmad

Hallo @ahmadsaad‍,

ja stimmt diese Methode gibt es nicht im Tutorial, die habe ich später hinzugefügt, weil cache leeren vor Update bei einigen Systemen nicht geholfen hat.

Aber auch dann lief es nicht überall.

 https://github.com/shopware/shopware/blob/051728399ef9478197ce9657db0d8375f78cccb7/engine/Shopware/Components/Model/ModelManager.php#L217

Da kommt sie her.

hallo @wabAB‍,

ja ich kenne diese Command.

hast du probieren zu rufen diese Command nach die schema update??

VG,

Ahamd

Ja das habe ich versucht.

Aber da ist es schon zu spät, das problem ist einfach dass die tabelle aus einem Model erzeugt wird das in den Proxies gecached wurde.

In Update Schema wurde bereits das Gecachete Model aufgerufen und da nützt regenerateProxies nichts mehr.

 

Hallo @wabAB‍,

in diese Fall , Ihre Probleme ist nicht beim Proxiescache, trotzdem beim Doctrine MetaData Cache.

und du hast zwei Lösung:

1 - löchen alle Doctrine Metadata Cache, before getClassMetadata anrufen bei die nächste code:

        $modelManager = Shopware()->Models();
        
        $tool = new Doctrine\ORM\Tools\SchemaTool($modelManager);

        $modelManager->getConfiguration()->getMetadataCacheImpl()->deleteAll();
        $schemas = [
            $modelManager->getClassMetadata(MeinModel::class),
        ];

 

2- löchen nur Ihre Model meta data cache 

        $modelManager = Shopware()->Models();
        
        $tool = new Doctrine\ORM\Tools\SchemaTool($modelManager);

        $className = MeinModel::class;
        $modelManager->getConfiguration()->getMetadataCacheImpl()->delete( $className . '$CLASSMETADATA');
        $schemas = [
            $modelManager->getClassMetadata(MeinModel::class),
        ];

 

ich hofe dass werde dir helfen.

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/