Api Category import

Beim Importieren von einem Kategoriebaum in ein blankes System nehmen ich die Shopware API für Kategorien und die XML meines Datenimports wo die Kategorien mit „>“ separiert sind. Das hin und her abgleichen ist ziemlich aufwändig. Gibt es hier keine leichte Lösung?

SubCat > SubsubCat

Idee: kann man die Kategorien nicht importieren , so wie der Breadcrumb ausgegeben wird? Und der Import legt es an if not exists?

"breadcrumb": [
"Home",
"Subcat", 
"Subsubcat"
],

Sollte eigentlich machbar sein, oder?
Man könnte ja dafür z.B ein CSV File hernehmen, also so:

Breadcrumb Level 1, Breadcrumb Level 2, Breadcrumb Level 3, ...
Home, Subcat, Subsubcat, ...
Home, Subcat, AnotherSubsubcat, ...

Den Rest könnte man dann evtl mit einem Python-Skript erledigen, das die CSV-Datei liest und Kategorien in Shopware 6 über die API erstellt.

Na die liegen sozusagen schon so vor wie in deinem Beispiel beschrieben, jedoch weiss ich nicht wie ich das in die API übergeben kann.
Ich muss dann immer checken: existiert die Subcat auf diesem Level mit der und der parentId schon? Nein, dann importieren sie. Wäre irgendwie cool wenn man das einfach per Array übergeben könnte.

Ginge das Ganze evtl. sogar über die Konsole?

bin/console dal:import:category categories.csv

Da unendlich viele gleich benannte Kategorien erstellt werden können, ist das nicht möglich. Die UUID ist dafür zwingend. Die kann man aber selbst erstellen und muss das nicht Shopware überlassen. So kann man mit zwei API Requests 1. Aktuelle Kategorien abfragen und 2. per Upsert alle Kategorien einfügen das Vorhaben umsetzen.

Oder direkt per DB. Je nachdem von wieviel Kategorien wir sprechen, dürfte das schneller sei - da ich es da mit nur einem Request (bzw. zwei mit Category-Translation) abhandeln kann.

Muss sich @brettvormkopp eine Logik überlegen, wie er es mit der Sortierung (after_category_id) hinbekommt - aber das muss er über die API ja auch.

Ja leider hat die gelieferte XML keine IDs … aber es gibt eindeutige Namen im Level 2, sozusagen nach Home… und dann Level 3 und 4 gibt es jeweils in dem einen, und dem anderen Strang. der Strang ist sozusagen immer unique als „category.name“. Also meine Abrage wäre dann immer vorwärts und rückwärst die API runterreiten :smiley:

Winter > VWreifen > 14Zoll
Sommer > VWreifen > 14Zoll

Ok, ich habe es jetzt geschafft die Shopware Menus und die XML zu mappen.
Wie bekomme ich jetzt eine Kategorie erstellt über die API?

Hier ist ein Beispiel, aber die Rückgabe des POST ist ein JSON mit allen Kategorien und die neue Fehlt.

Habe dann versucht mehr Daten(siehe Beispeil) zu übertragen, aber auch das geht nicht. Hat jemand eine Idee?

{
    "displayNestedProducts": true,
    "type": "page",
    "productAssignmentType": "product",
    "name": "peter",
    "id": "018d131737217262b7f66a47ecbfa555",
    "parent_id": "018d131737217262b7f66a47ecbfa580",
    "version_id": "0x0fa91ce3e96a4bc2be4bd9ce752c3425",
    "parent_version_id": "0fa91ce3e96a4bc2be4bd9ce752c3425",
    "after_category_version_id": "0fa91ce3e96a4bc2be4bd9ce752c3425",
    "level":2,
    "active": true,
    "createdAt": "2024-04-19 19:05:31.033",
    "parent": {},
  "children": [
    {}
  ]
}

Danke und Gruss

parentId und afterCategoryId sind die zwei UUIDs, die du benötigst.

@Max_Shop vielen Dank. leider geht es auch nicht mit diesen, muss die id umgewandelt werden? Mit 0x…?
Kannst du bitte ein minimal json schreiben, wie ich das reinbekomme?

„peter“ soll subcat von „Home“(018d131737217262b7f66a47ecbfa580) sein

{
    "name": "peter",
    "id": "018d131737217262b7f66a47ecbfa555",
    "parent_id": "018d131737217262b7f66a47ecbfa580",
    "after_category_version_id":"0fa91ce3e96a4bc2be4bd9ce752c3425"
}

Vielen lieben Dank.

API: api/category
METHOD: POST
Bearer Token vorhanden

Schau dir mal an, was alles mit required gekennzeichnet ist:

Was aber viel einfacher ist, gehe ins Backend, lege eine neue Kategorie an und schau dir dann das XHR an, welches das Backend an die API geschickt hat. Dann hast du dein JSON per Copy & Past.

Ich glaube, das hast du ja schon in einem vorherigen Beitrag geposrted.

Also einfach zusätzlich die required übernehmen.

Ich habe langsam den Verdacht, dass man mit der API gar keine Kategorien anlegen kann, es gibt ja auch nirgendwo eine beschreibung dazu. Kann ein Shopware Mitarbeiter dazu was sagen? @Moritz_Naczenski

Hier ist mein Code:

POST:

domain..../api/category

HEADER:

'Accept: application/json',
    'Content-Type: application/json',
    'Authorization: Bearer eyJ0eXAiOiJKV1Qi......'

BODY:

{
    "total": 1,
    "data": [{
    "extensions": {
        "foreignKeys": {
            "extensions": [],
            "apiAlias": "category_foreign_keys_extension"
        },
        "search": {
            "extensions": [],
            "_uniqueIdentifier": null,
            "translated": [],
            "autoIncrement": 2
        }
    },
    "_uniqueIdentifier": "018ef1165ded7c02a347fab7948ece2e",
    "versionId": "0fa91ce3e96a4bc2be4bd9ce752c3425",
    "translated": {
        "breadcrumb": [
            "Home",
            "Peter"
        ],
        "name": "Peter",
        "customFields": {},
        "slotConfig": [],
        "linkType": null,
        "internalLink": null,
        "externalLink": null,
        "linkNewTab": null,
        "description": null,
        "metaTitle": null,
        "metaDescription": null,
        "keywords": null
    },
    "createdAt": "2024-04-18T12:02:47.987+00:00",
    "updatedAt": "2024-04-18T12:07:48.883+00:00",
    "afterCategoryId": null,
    "parentId": "018d131737217262b7f66a47ecbfa580",
    "autoIncrement": 2,
    "mediaId": null,
    "name": "Peter",
    "breadcrumb": [
        "Home",
        "Peter"
    ],
    "path": "|018d131737217262b7f66a47ecbfa580|",
    "level": 2,
    "active": true,
    "childCount": 1,
    "visibleChildCount": 0,
    "displayNestedProducts": true,
    "parent": null,
    "children": null,
    "translations": null,
    "media": null,
    "products": null,
    "nestedProducts": null,
    "tags": null,
    "cmsPageId": "018d1317375b708fa5ef34fbe5d5d445",
    "cmsPageIdSwitched": true,
    "cmsPage": null,
    "productStreamId": null,
    "productStream": null,
    "slotConfig": [],
    "navigationSalesChannels": null,
    "footerSalesChannels": null,
    "serviceSalesChannels": null,
    "linkType": null,
    "linkNewTab": null,
    "internalLink": null,
    "externalLink": null,
    "visible": true,
    "type": "page",
    "productAssignmentType": "product",
    "description": null,
    "metaTitle": null,
    "metaDescription": null,
    "keywords": null,
    "mainCategories": null,
    "seoUrls": null,
    "customEntityTypeId": null,
    "customFields": null,
    "id": "018ef1165ded7c02a347fab7948ece2e",
    "apiAlias": "category"
}],
    "aggregations": []
}

RESULT:
Alle existierende Kategorien, aber nicht die eben hinzugefügte.

Bei dem von dir geposteten Link zu Category | Admin API sind auch Produkte aufgezählt, ich habe zum jetzigen Zeitpunkt keine. Ich will nur die Kategorien importieren.

Shopware 6.6.1.1
PHP 8.3
MySQL 10.6

Danke und Gruss

OH MANN, bin ich blöd. ich hatte kein https sondern http…
Jetzt hat es geklappt.
Es reicht:

{
  "displayNestedProducts": true,
  "type": "page",
  "productAssignmentType": "product",
  "name": "Hallo"
}

Antwort vom Server ist dann „1“

ich möchte noch hinzufügen, dass man nur GET und POST nutzen sollte, bei PATCH löscht sich die deutsche Sprache und die Kategorie geht futsch. Durch die verwendung der UUID kann man es fast vergessen das wieder herzustellen. Ein falscher Klick in phpmyadmin auf den Eintrag und statt ESCAPE irgendwo hingeklickt und der Wert ist weg.

Du kannst im Header die Sprache definieren. Ohne Angabe der Sprache wird immer die Standardsprache verwendet.

Noch zu deinem JSON vorab:

parentId und afterCategoryId angeben, dann kannst du neue Kategorien exakt einfügen, wo du es möchtest.

1 „Gefällt mir“

Das komplette/admin Backend basiert auf der API. Was du dort machen kannst, kannst du definitiv auch selbst über die API machen, ggf. mit mehreren GET und dann POST Requests.

1 „Gefällt mir“

Das ist gut zu wissen dass das Backend es auch so macht.

Bei dem Beispiel wird jedoch parent_id nicht übernommen. Ich wollte hier als Subcat von „Home“ haben, aber es landet als „Hauptkategorie“ in der Datenbank

{
  "displayNestedProducts": true,
  "type": "page",
  "productAssignmentType": "product",
  "name": "Peter",
  "parent_id": "018d131737217262b7f66a47ecbfa580",
  "after_category_version_id": "0fa91ce3e96a4bc2be4bd9ce752c3425"
}

EDIT: kann es was mit dem Wert „path“ aus der Tabelle „category“ zu tun haben? Weil der ist auch leer.

Ich habe auch Unsinn geschrieben, entschuldige bitte.

Es sollte auch afterCategoryId und parentId verwendet werden und nicht after_category_version_id und parent_id

Die Schreibweisen mit _ werden in der Datenbank verwendet, bei JSON macht man daraus camelCase.

path is read-only und wird automatisch von der API erstellt.

1 „Gefällt mir“

Vielen vielen Dank, after_category_version_id ist korrekt, nur parentID muss camelCase :slight_smile:

So funktioniert es jetzt:

{
  "displayNestedProducts": true,
  "type": "page",
  "productAssignmentType": "product",
  "name": "Hallo",
  "parentId": "018d131737217262b7f66a47ecbfa580",
  "after_category_version_id": "0fa91ce3e96a4bc2be4bd9ce752c3425"
}

Vielen Lieben Dank @Max_Shop

Wie immer gilt: schau dir mal den request in der Administration an, wenn du eine neue Kategorie anlegst. Das sollte helfen, um die Daten korrekt zu formatieren.

Viele Grüße

1 „Gefällt mir“