Kategorien hinzufügen über MIgrationen

Hallo Community,

ich versuche gerade von SW5 die Kategorien nach SW6 zu importieren. Das mache ich mit keinem externen Plugin oder mit der Import-Funktion von SW6. Ich habe ein eigenes Plugin entwickelt dafür. Ich möchte gerne, dass einmalig, wenn das Plugin installiert wurde, Kategorien in SW6 erstellt werden.
Zuerst habe ich die Datenbank-Tabelle mit den Kategorien von SW5 als JSON-Datei heruntergeladen.

Meine Idee ist nun diese Datei in SW6 zu importieren über ein Migration-Script, welches ja nur einmal ausgeführt wird.

Ich habe dazu in der Update-Funktion folgenden Code:


$germanLanguageId = $connection->fetchOne('SELECT LOWER(HEX(`id`)) FROM language WHERE name = "Deutsch"');
        $englishLanguageId = $connection->fetchOne('SELECT LOWER(HEX(`id`)) FROM language WHERE name = "English"');
        $rootCategoryId = $connection->fetchOne('SELECT LOWER(HEX(`id`)) FROM category WHERE parent_id IS NULL');
        $rootCategoryVersionId = $connection->fetchOne('SELECT LOWER(HEX(`parent_version_id`)) FROM category WHERE id = "' . Uuid::fromHexToBytes($rootCategoryId) . '"');

foreach($categoriesDataFile[2]['data'] as $category) {
            if ($category['id'] < 4) {
                continue;
            }
            
            $data['id'] = Uuid::randomBytes();
            $data['version_id'] = Uuid::randomBytes();
            $data['parent_id'] = Uuid::fromHexToBytes($rootCategoryId);
            $data['active'] = $category['active'];
            $data['type'] = 'page';
            $data['level'] = 2;
            $data['parent_version_id'] = Uuid::fromHexToBytes($rootCategoryVersionId);
            $data['after_category_version_id'] = Uuid::fromHexToBytes($rootCategoryVersionId);
            $query = <<<SQL
            INSERT INTO `category` (`id`, `version_id`,`created_at`,`parent_id`,`type`,`parent_version_id`,`after_category_version_id`,`level`)
            VALUES (:id, :version_id, NOW(),:parent_id,:type,:parent_version_id,:after_category_version_id,:level);
            SQL;
            $connection->executeStatement($query, $data);
            
            $data['language_id'] = Uuid::fromHexToBytes($germanLanguageId);
            $data['name'] = $category['description'];
            $data['description'] = $category['description'];
            $data['meta_title'] = $category['meta_title'];
            $data['meta_description'] = $category['metadescription'];
            $data['keywords'] = $category['metakeywords'];
            
            $query = <<<SQL
            INSERT INTO `category_translation` (`category_id`, `category_version_id`,
                                                            `created_at`,`description`,`name`,`language_id`)
            VALUES (:id,:version_id, NOW(),:description,:name,:language_id);
            SQL;
            $connection->executeStatement($query, $data);
            
            break; //--- for debug. import only first category
        }

Die Kategorie wird in der Datenbank scheinbar richtig erstellt, aber im Shopware-Backend wird diese Kategorie nicht angezeigt. Ich mache in den Tabellen ‚category‘ und ‚category_translation‘ Einträge. Lösche ich einen Eintrag zu Testzwecken aus der ‚category‘-Tabelle über PHPMyAdmin, so wird auch richtigerweise der Eintrag aus der ‚category_translation‘-Tabelle entfernt. Indexer habe ich auch alle aktualisiert.
Woran liegt das? Was mache ich falsch?

Verwende ich das Kategorie-Repository an anderer Stelle dafür, so funktioniert das richtig. Aber Repositories kann ich ja nicht in Migrations benutzen, oder?

Vielen Dank!

Niko

Warum benutzt du nicht das Migrations-Tool von Shopware?

Nun das Migrations-Tool von Shopware funktioniert nicht richtig. Es verursacht sehr häufig Fehler und es wird auf verschiedenen Foren abgeraten dieses zu benutzen. Die Kategorien sind customized und auch das macht Probleme.

Außerdem möchte ich gerne wissen, wie man das über direkte Datenbankeinträge realisiert. Es kann ja sein, dass ein Plugin-Update erfordet, dass eine neue Kategorie angelegt wird. Wie macht man das über eine Migration ohne Repositories oder API?

Ein gleiches Problem habe ich, wenn ich Hersteller manuelle in der Datenbank anlege. Dort herrscht die gleiche Problematik: Einträge in der Datenbank, aber die Repositories zeigen keine Einträge an.

Vielleicht liegen ja SW5 und SW6 auf selben Server, dann könnte man direkt über die Datenbank das alles regeln.

Ich habe schon so manchen abendteuerliche Migration mit dem Tool durch, aber bei Kategorien gibt es kaum Probleme.

Was das heißen soll, weiß ich jetzt nicht.

Wie schon oben beschrieben, wenn beides Shops auf selben Server liegen könnte man zeitgleich auf beide Datenbanken zugreifen. Ähnliche Dinge hatte ich machen müssen um benutzerdefierte Einstellungen auch Migrieren zu können.

Das Auslesen aus SW5 sollte ja nicht das Problem sein. Ok, ggf. schwierig die Unterkategorien sauber zu erkennen. Was mir eben so ausfällt ist der Wert „version_id“ und „parent_version_id“ , welcher in SW6 immer gleich ist, nämlich (warum auch immer):

0x0fa91ce3e96a4bc2be4bd9ce752c3425

Bedeutet:

$data['version_id'] = Uuid::randomBytes();
$data['parent_version_id'] = Uuid::fromHexToBytes($rootCategoryVersionId);

das funktioniert so nicht. Dann steht zwar alles schon in der DB, aber Shopware kann sie ggf. nicht anzeigen.

Achso: Ich würde übrigens die SW6 Tabellen komplett füllen. Bei dir fehlen noch einige Spalten. „cms_page_id“ und „cms_page_version_id“ müssen unbedingt mit rein.

@R4M

Ich danke dir ganz herzlich! Ich konnte das Problem lösen.

Es lag tatsächlich an version_id.

So ist das nicht richtig.

$data['version_id'] = Uuid::randomBytes();
$data['parent_version_id'] = Uuid::fromHexToBytes($rootCategoryVersionId);

Ich musste bei ‚version_id‘ folgendes machen:

$data['version_id'] = Uuid::fromHexToBytes($rootCategoryVersionId);
//--- $rootCategoryVersionId ist immer '0x0fa91ce3e96a4bc2be4bd9ce752c3425'

Danach war die Kategorie sichtbar!

Ich habe noch ‚cms_page_id‘ und ‚cms_page_version_id‘ hinzugefügt.

Aber was es genau mit der Versions-Id auf sich hat, verstehe ich auch nicht. Diese ist tatsächlich immer gleich.

Ja mir ist es auch erst später bei einigen SW6 Umgebungen aufgefallen, dass überall die selbe ID benutzt wird. Für was das genau sein soll, weiß ich leider auch nicht. Spielt aber eine wichtige Rolle und zieht sich durchs ganze System.