Migration und die Sichtbarkeit des Produktes mangelhaft

Bei den folgenen Zeilen geht es um das Migration-Plugin 4.2.5 und einer Migration von SW 5.7 zu einem SW 6.4. Nach erheblichen Startproblemen bei der Migration (habe nun eine MigrationsCheck Datei geschrieben) ist mir noch ein Punkt aufgefallen - die Sichtbarkeit der Produkte.

Im folgenen Fall gabe es 2 Verkaufskanäle, da im SW5 2 Subshops. Die Verkaufskanäle wurden korrekt angelegt. Allerdings bei der Einstellung Sichtbarkeit (beim Produkt) wurden alle Produkte einem Verkaufskanel zugeordnet. Wenn man nicht viele Produkte hat, kann man über diesen Fehler hinwegsehen. Wer aber tausende Produkte hat und nicht gerade Programmierer ist, hat ein Riesen-Problem. Das sollte bei der Migration nicht passieren. Ich persönlich biege das über SQL schon wieder hin, sollte aber nicht die Lösung sein.

Hallo R4M,
sorry ist schon lange her aber … gibt es schon eine Lösung dafür?
Ich habe eine Migration von sw5.7 auf sw 6.4 gemacht: nach der Installation hat man ja einen Verkaufskanal für den auch die Domain vergeben wurde (also bei mir war das sw6 auf shop.domain.de) NACH der Migration erscheint ein neuer Verkaufskanal (shopSW5) wo auch die 4.200 Produkte zu finden sind. Wie kann ich jetzt diese 4200 Produkte meinem sw6 auf shop.domain.de zuweisen? Oder soll ich diesen sw6 auf shop.domain.de löschen damit ich dem Verkaufskanal (shopSW5) die Domain aus der .env Datei zuweisen kann?
Für jegliche Hilfe bin ich sehr dankbar

Also ich mache es nach wie vor über SQL.

Lege ich bei SW6 Installtion (also nur Shop wo eine Migration stattfindet) immer als „temp“ an und fliegt später raus.

Korrekt, und mit diesem arbeite ich weiter. Sprich Produkte zuweisen und URL einstellen.

1 „Gefällt mir“

DANKE sehr, ich habe jetzt tatsächlich den Verkaufskanal der bei der Installation des sw6 shops erstellt wurde gelöscht und die ganzen Einstellungen (inklusive subdomain) dem Verkaufskanal der nach der Migration erstellt wird zugewiesen!!! Das hattest du gemeint mit „temp“ oder?
VG

Ja, der Verkaufskanal bei der Installtion ist ja praktisch überflüssig, wenn man eine Migration macht. Und damit auf alle Fälle nichts durcheinander kommt, mache ich das jedenfalls so. Zumal die Produkte automatisch dem Migrations-Verkaufskanal zugeordnet werden.

1 „Gefällt mir“

Hallo @R4M ,

sag mal könntest du mir (und vermutlich tausenden anderen Migrationsverzweifelten) eine Art Anleitung machen, wie du das mit SQL „wieder hin biegst“ :slight_smile:

Ich habe ein Multishopsystem (SW5 - 43 Subshops) migriert und habe nun ca. 33.000 Artikel und 14.000 Kategorien die soweit korrekt übernommen wurden, aber in den Verkaufskanälen, die migriert wurden fehlen fast alle Artikel… Jetzt brauche ich eine Lösung, zumindest alle Artikel einem Verkaufskanal zu zuweisen.

Ich wäre dir sehr sehr dankbar!

Viele Grüße
Max

Sorry, hab mich hier eben vertan - Beitrag noch mal umschreiben.

Nun, wenn ich die Sichrbarkeit auf alle Verkaufskanäle erweitern möchte, so hab ich das über ein Script gelöst, welche ich dazu unter /public/ abgelegt habe. Ob das Script jetzt schön aus aussieht oder nicht spielt hier keine Rolle, denn es soll nur seinen einmaligen Zweck erfüllen.

Hier meine Lösung (Verwendung auf eigene Gefahr):

use Shopware\Core\Framework\Uuid\Uuid;

// DB herstellen
$dbi = mysqli_connect( 'host', 'username', 'password' 'dbname', 'port' );

// Version 
$version = '0x0fa91ce3e96a4bc2be4bd9ce752c3425';

// alle aktiven SaleChannel ermitteln
$channel_ids = [];
$scQuery = "SELECT LOWER(HEX(id)) as id FROM `sales_channel` WHERE `active` = 1 ";
$sql = mysqli_query($dbi, $scQuery);
while ( $res = mysqli_fetch_assoc($sql) ) { 
  $channel_ids[] = '0x'.$res['id'];
}

// alle Produkte ermitteln
$sql = mysqli_query($dbi, "SELECT LOWER(HEX(id)) as id FROM `product` " );
while ( $res = mysqli_fetch_assoc($sql) ) { 

  $product_id = '0x'.$res['id'];

  // alle Sale Channel durchgehen
  foreach ( $channel_ids as $channel_id ) {

    // neue Uuid
    $uuid = '0x' . Uuid::randomHex();

    // neuen Eintrag setzen
    $query = "
    INSERT IGNORE INTO `product_visibility` 
    (`id`, `product_id`, `product_version_id`, `sales_channel_id`, `visibility`, `created_at`, `updated_at`) 
    VALUES 
    ($uuid, $product_id, $version, $channel_id, 30, '2024-01-01 00:00:00', NULL);
    ";
    mysqli_query($dbi, $query);

  }

}

Hallo @R4M ,

danke, dass du dir die Zeit und Mühe gemacht hast. Wollte es gerade testen, da hab ich gemerkt, dass ich nicht weiß, wie ich deinen Code ausführen soll?

Muss ich da ein Script auf dem Server ablegen und das per Cronjob ausführen, via API, oder wie mache ich das?

Gruß Max

Oh, nein den Code habe ich als XYZ-PHP Datei (Name kann sich jeder selber aussuchen) im Hauptorder (/public/) hinterlegt und dann via Browser einfach aufgerufen.

1 „Gefällt mir“

Alternativ in einer query pro sales channel:

SET sales_channel_id = '12345678';
SET version_id = '0fa91ce3e96a4bc2be4bd9ce752c3425';
INSERT INTO product_visibility
    SELECT 
        UNHEX(LOWER(MD5(CONCAT(HEX(id), @sales_channel_id)))) AS 'id',
        id AS 'product_id',
        UNHEX(@version_id) AS 'product_version_id',
        UNHEX(@sales_channel_id) AS 'sales_channel_id',
        30 AS 'visibility',
        NOW() AS 'created_at',
        NULL AS 'updated_at'
    FROM product
    WHERE version_id = UNHEX(@version_id)

Viele Grüße

1 „Gefällt mir“

Update: mit einem CROSS JOIN auch direkt für alle sales channels möglich:

SET version_id = '0fa91ce3e96a4bc2be4bd9ce752c3425';
INSERT INTO product_visibility
    SELECT 
        UNHEX(LOWER(MD5(CONCAT(HEX(product.id), HEX(sales_channel.id))))) AS 'id',
        product.id AS 'product_id',
        UNHEX(@version_id) AS 'product_version_id',
        sales_channel.id AS 'sales_channel_id',
        30 AS 'visibility',
        NOW() AS 'created_at',
        NULL AS 'updated_at'
    FROM product
    CROSS JOIN sales_channel
    WHERE product.version_id = UNHEX(@version_id)
        AND sales_channel.active = 1

Viele Grüße

1 „Gefällt mir“

Danke Jungs ihr seid der Hammer! Ich werde schauen, dass ich es nachher testen kann und nochmal Feedback geben!