Kategorie-Stamm kopieren/duplizieren

Hallo.

Gibt es eine Möglichkeit wie ich einen kompletten Kategorie-Stamm duplizieren kann? Ein Ticket diesbezüglich gibt es bei Shopware wohl schon aber leider noch keine Lösung. Vielleicht hat hier schon mal jemand eine Lösung entwickelt und kann anleiten? Habe schon mit der Entwicklung begonnen und Ermittle auch schon den kompletten Tree. Leider weiß ich aktuell noch nicht wie ich mit diesen Daten den Stamm neu anlegen kann. Müsste ja aller IDs tauschen. Weiter müssten alle Produkte mit den neuen IDs versorgt werden damit diese auch in dem neuen Stamm erscheinen.

Hintergrund:
Es sollen mehrere Verkaufskanäle mit annähernd den gleichen Kategorien und Produkten geben. Kategorie und Produkte sollen pro VK aktiviert/deaktiviert werden können. Bei Produkten kann das über die Sichtbarkeit geregelt werden. Bei den Kategorien gibt es dies leider nicht.

Zudem haben die ganzen Content-Seiten einen unterschiedlichen Inhalt. Dies lässt sich ja auch nur mit unterschiedlichen Kategorien bewerkstelligen da die Inhalte je VK nicht gesteuert werden können oder?

Beste Grüße
Mike

Hallo,
technisch gesehen ist eine Möglichkeit im Core Vorhanden um den Kategorie-Baum rekursiv zu duplizieren. Wurde wahrscheinlich nur nicht aktiviert, weil man sich damit auch leicht den Shop zerschießen kann. Außerdem würden die SEO Urls Probleme bereiten.
Ich habe einen ähnlichen Fall vor ca. einem Jahr bei einem meiner Kunden. Ich denke man könnte Stand jetzt ein Plugin bauen um die Sichtbarkeit und eine CMS Page Zuweisung pro Verkaufskanal zu steuern. Würde aus meiner Sicht mehr Sinn machen. Nur was darf sowas kosten? Ich denke 2-3 Tage muss man dafür einplanen.

Dazu wäre mein Ansatz eine Relationstabelle anlegen und die navigationRoute neu dekorieren. Dort die Criteara mit der Relationstabelle + SalesChannel-spezifische Filter anreichern. Anschließend das sales_channel.category.loaded Event abfangen und dort die ID der CMS Page überschreiben…

Oder wenn du doch nur die Kategorien klonen willst:

Folgende Stellen sind relevant:

src/Administration/Resources/app/administration/src/module/sw-category/component/sw-category-tree/sw-category-tree.html.twig
:allow-duplicate="true"

src/Administration/Resources/app/administration/src/module/sw-category/component/sw-category-tree/index.js (Methode einbauen)
async duplicateElement(contextItem) {
    const behavior = {
        cloneChildren: true,
        overwrites: {
            name: `${contextItem.data.name} ${this.$tc('global.default.copy')}`
        }
    };

    await this.categoryRepository.clone(contextItem.id, Shopware.Context.api, behavior);
}

VG
Philipp

1 „Gefällt mir“

Hi Philipp.

Danke für dein Feedback! Die beschriebenen Stellen schaue ich mir mal an. Bzgl. SEO Urls. In wie fern würden diese Probleme verursachen? Die Toplevel Domain ist ja eine unterschiedliche. Habe das mal rudimentär mit gleichen Kategorienamen bzw. SEO Urls in unterschiedlichen SCs getestet. Scheint keine Probleme zu geben. Übersehe ich etwas?

Das mit der Sichtbarkeit je Kategorie und CMS Seite finde ich auch interessant. Hatte auch schon die Gedanken. Wobei ich dann aber auch denke das es schnell unübersichtlich werden könnte wenn du ein großen Kategoriebaum hast. Da verliert man bestimmt schnell den Überblick welche Kategorie zu welchem SC gehört. Alles in allem kein leichtes Thema :frowning:

Gruß

So habe es jetzt mal implementiert. Funktioniert wunderbar. Nochmal ein dickes DANKE!!! Wie gesagt das mit den SEO Urls bedarf noch Klärung aber da es sich um unterschiedliche SCs handelt, sollte es da eigentlich keine Problem geben.

Für alle die das auch mal benötigen. Habe die duplicateElement Methode noch etwas erweitert damit nach dem Klonen der Kategoriebaum aktualisiert wird und die neuen Kategorien direkt angezeigt werden.

async duplicateElement(contextItem) {
            const behavior = {
                cloneChildren: true,
                overwrites: {
                    name: `${contextItem.data.name} ${this.$tc('global.default.copy')}`
                }
            };

            await this.categoryRepository.clone(contextItem.id, Shopware.Context.api, behavior).then((clone) => {
                const criteria = new Criteria();
                criteria.setIds([clone.id]);
                this.categoryRepository.search(criteria).then((categories) => {
                    this.addCategories(categories);
                });
            }).catch(() => {
                this.createNotificationError({
                    message: this.$tc('global.notification.unspecifiedSaveErrorMessage'),
                });
            });
        }

Leider doch zu früh gefreut. Er legt die kopierten Kategorien zwar in der Datenbank an, aber fehlen Infos wie das Feld breadcrump und vermutlich noch ein paar andere Infos.
Hat zur Folge, dass ich die Kategorien ab Ebene 2 im Admin nicht sehe. Kategorien sind nicht „aufklappbar“ da vermutlich die entsprechende Verknüpfung fehlt. Obwohl parentId korrekt versorgt wird.

Vermutlich doch alles komplizierter und deshalb im Core deaktiviert :frowning:

Kein Problem, hab bereits an einem Plugin gebastelt. Wenn du mir deine Mail per PM senden könntest, sende ich dir das gerne mal zu. Store Veröffentlichung dauert wahrscheinlich noch etwas. Hab aktuell 8 Plugins in der Pipeline.

https://docs.moori.net/MoorlExtCat/

Ich glaube das Modul von Moorleiche bietet keine Kopierfunktion sondern geht den anderen Ansatz, mit einem Kategoriebaum?

Falls dem so ist, versuche ich gerade die snippets oben in ein FOSS-Modul zu packen.

@_MikeB: Ich kann in meinen ersten Versuchen die Subkategorien aufklappen (6.4.16.0)

breadcrumb fehlt aber scheinbar auch hier.
Außerdem ist mir aufgefallen, dass die Untermenüs nicht mehr in der ursprünglichen Sortierung vorliegen.

Für die Kopierfunktion haben wir ein Modul erstellt:

1 „Gefällt mir“