Varianten erstellung über API im Frontend falsch dargestellt und nicht auffindbar über die Suche

Hallo,

wenn ich eine neues Produkt inklusive Variante/n über die API hinzufüge und mir diese im Frontend anzeigen lasse, komme ich mithilfe der Produkt-ID zwar auf die richtige Seite, aber das Produkt wird mir „leer“ angezeigt. Also wenn mein Artikel zum Beispiel die Eigenschaft Format hat wird mir kein Format zur Auswahl angeboten. Sieht so aus:

Über die Suche ist der Artikel gar nicht auffindbar:

Sobald ich mich im Admin-Bereich anmelde (einfach nur anmelden, ohne was zu tun), funktioniert alles, also der Artikel wird richtig mit entsprechendem Format angezeigt und ist über die Suche auffindbar:

… kann mir so gar nicht erklären was hier schief läuft.
Hat vielleicht jemand ähnliches Verhalten festgestellt oder eine Ahnung wo der Fehler sein könnte?

Die Erstellung über die API sollte fehlerfrei sein, da im Admin-Bereich der Artikel richtig angelegt wird und zuvor hat die Erstellung über API ohne Probleme geklappt.
Vom Gefühl besteht das Problem seit Version 6.6.0.
Der Shop ist auf dem aktuellsten Stand: Version 6.6.8.2

Zur Vollständigkeit, hier das übergebene JSON an die _action/sync:

  {
    "action": "upsert",
    "entity": "product",
    "payload": [
      {
        "active": true,
        "categories": [
          {
            "id": "f01b88680c4996d70a495e4d33a86c48"
          },
          {
            "id": "7109231ba34d123a78869920405b0657"
          },
          {
            "id": "8fb28219ad4707ee630286d0b704f242"
          }
        ],
        "configuratorSettings": [
          {
            "optionId": "eecd0261830df29d3ea8624f8907ec5c"
          },
          {
            "optionId": "67190a1c83adc9799e0a79db53576d50"
          }
        ],
        "coverId": null,
        "customFields": {
          "custom_nimbits_pdftab1_headline": null,
          "custom_nimbits_pdftab1_media": null,
          "custom_nimbits_pdftab2_headline": null,
          "custom_nimbits_pdftab2_media": null,
          "custom_nimbits_pdftab3_headline": null,
          "custom_nimbits_pdftab3_media": null,
          "custom_nimbits_pdftab4_headline": null,
          "custom_nimbits_pdftab4_media": null,
          "custom_nimbits_pdftab5_headline": null,
          "custom_nimbits_pdftab5_media": null
        },
        "description": "",
        "featureSetId": "705610123cfe42b286680690b8b920cd",
        "id": "64c2c1a4c6ae7000c2a1a3bcba794098",
        "manufacturer": {
          "id": "b2c016e46108ab730dd591c9de26725d",
          "name": "Hersteller (Firmierung)"
        },
        "maxPurchase": null,
        "media": null,
        "minPurchase": 1,
        "name": "TEST Indizierung",
        "price": [
          {
            "currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
            "gross": "0.00",
            "linked": true,
            "net": "0"
          }
        ],
        "productNumber": "WEB_BASIS_FTEST",
        "purchaseSteps": 1,
        "stock": 999999,
        "taxId": "90fad0e3958742bbbc51edbec9ed2d4f",
        "visibilities": [
          {
            "id": "13e9cae320e21f3256f4926644f1c918",
            "productId": "64c2c1a4c6ae7000c2a1a3bcba794098",
            "salesChannelId": "3c1b7b5b1b2c468a92d482089186d1a3",
            "visibility": 30
          },
          {
            "id": "daa6477fa7d7a988845da247788375ac",
            "productId": "64c2c1a4c6ae7000c2a1a3bcba794098",
            "salesChannelId": "98432def39fc4624b33213a56b8c944d",
            "visibility": 30
          }
        ]
      }
    ]
  },
  {
    "action": "upsert",
    "entity": "product",
    "payload": [
      {
        "active": true,
        "coverId": null,
        "customFields": {
          "custom_nimbits_pdftab1_headline": null,
          "custom_nimbits_pdftab1_media": null,
          "custom_nimbits_pdftab2_headline": null,
          "custom_nimbits_pdftab2_media": null,
          "custom_nimbits_pdftab3_headline": null,
          "custom_nimbits_pdftab3_media": null,
          "custom_nimbits_pdftab4_headline": null,
          "custom_nimbits_pdftab4_media": null,
          "custom_nimbits_pdftab5_headline": null,
          "custom_nimbits_pdftab5_media": null
        },
        "id": "c9fb470833af0aa95c1b426a984ab270",
        "maxPurchase": null,
        "media": null,
        "minPurchase": 1,
        "options": [
          {
            "id": "eecd0261830df29d3ea8624f8907ec5c"
          },
          {
            "id": "67190a1c83adc9799e0a79db53576d50"
          }
        ],
        "parentId": "64c2c1a4c6ae7000c2a1a3bcba794098",
        "price": [
          {
            "currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
            "gross": "1338.75",
            "linked": true,
            "net": "1125"
          }
        ],
        "productNumber": "03106201",
        "purchaseSteps": 1,
        "stock": 999999,
        "taxId": "90fad0e3958742bbbc51edbec9ed2d4f"
      },
      {
        "active": true,
        "coverId": null,
        "customFields": {
          "custom_nimbits_pdftab1_headline": null,
          "custom_nimbits_pdftab1_media": null,
          "custom_nimbits_pdftab2_headline": null,
          "custom_nimbits_pdftab2_media": null,
          "custom_nimbits_pdftab3_headline": null,
          "custom_nimbits_pdftab3_media": null,
          "custom_nimbits_pdftab4_headline": null,
          "custom_nimbits_pdftab4_media": null,
          "custom_nimbits_pdftab5_headline": null,
          "custom_nimbits_pdftab5_media": null
        },
        "id": "487cec6d4ca374d8640f9c9983c52c3d",
        "maxPurchase": null,
        "media": null,
        "minPurchase": 1,
        "options": [
          {
            "id": "eecd0261830df29d3ea8624f8907ec5c"
          },
          {
            "id": "67190a1c83adc9799e0a79db53576d50"
          }
        ],
        "parentId": "64c2c1a4c6ae7000c2a1a3bcba794098",
        "price": [
          {
            "currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
            "gross": "0.00",
            "linked": true,
            "net": "0"
          }
        ],
        "productNumber": "656Test",
        "purchaseSteps": 1,
        "stock": 999999,
        "taxId": "90fad0e3958742bbbc51edbec9ed2d4f"
      }
    ]
  },
  {
    "action": "upsert",
    "entity": "vio_customer_price",
    "payload": [
      {
        "customerId": "f20bdab62d24416286a3f3cd5591a358",
        "id": "181be498b95f69aaff4e92b96e04d96f",
        "price": "9999991",
        "productId": "c9fb470833af0aa95c1b426a984ab270",
        "quantityStart": 0
      }
    ]
  }
]
"configuratorGroupConfig": [
    // braucht es evtl. nicht ?
],
"variantListingConfig": [
    "displayParent" => true,
    "sorting" => "name-asc"
],
"configuratorSettings": [
    {
        "optionId": "eecd0261830df29d3ea8624f8907ec5c",
        "productId": "product_id_der_variante_mit_der_option_eecd0261830df29d3ea8624f8907ec5c"
    },
    {
        "optionId": "67190a1c83adc9799e0a79db53576d50",
        "productId": "product_id_der_variante_mit_der_option_67190a1c83adc9799e0a79db53576d50"
    }
],

ich hatte so ein ähnliches Problem. Ich habe dann die 3 Keys wie oben hinzu gefügt:

  • configuratorGroupConfig
    hiermit wird im Wesentlichen die GroupId der Optionen angeben mit denen/der die Varianten definiert werden
  • variantListingConfig
    bestimmt letztlich die Darstellung der Variantenauswahl
  • configuratorSettings
    hier hast Du ja schon die optionId drin, hier fehlt aber auf jeden Fall die productId. Und das ist die ID der Varianten. Wobei ich glaube da ist ein ForeignKey drauf. Ich mache das bei mir so, dass ich zuerst den Vater/Parent erzeugen mit „configuratorSettings“ = [ ], dann die Varianten erzeuge (und damit sind die ids gültig). Und final mache ich dann ein Update in das Parent mit dem configuratorSettings.

Danke für die Antwort.
Hab etwas rumgetestet und auch wenn ich die 3 Keys ergänze bleibt der Fehler. Hab auch alle einmal einzeln getestet, auch hier ohne Erfolg.

Wenn ich mein unangepasstes JSON über Postman an meinen Shop schicke, wird der Artikel mit Variante auch richtig erstellt, ohne Fehler.
Dadurch hatte ich die Vermutung, dass eventuell mein Header fehlende Informationen hat. Hier hab ich auch rumgetestet und den selben Header, wie über Postman übergeben, aber leider auch ohne Erfolg …

Werde mich die Tage nochmal dran setzen.

Bin für jeden Ansatz dankbar, falls jemand noch eine Idee hat :slightly_smiling_face:

Hallo chamaw, eine Nachfrage zu deinen „configuratorSettings“. Diese werden doch, soweit ich weiss, am Parent definiert. Wenn ich jetzt mehrere Variantenfelder habe, kommt jede Einzeloption eventuell mehrmals vor.
Wäre productId dann eine Liste von variantenIds? Denn ich kann die einzelnen Options dort nicht mehrmals angeben, was ich aber müsste, wenn productId als String übergeben wird.

Beispiel:

"configuratorSettings": [
    {
        "optionId": "id-für-option-farbe-blau",
        "productId": ["id-für-variante blau-xl","id-für-variante-blau-m"]
    },
    {
        "optionId": "id-für-option-farbe-rot",
        "productId": ["id-für-variante rot-xl","id-für-variante-rot-m"]
    },
    {
        "optionId": "id-für-option-größe-xl",
        "productId": ["id-für-variante blau-xl","id-für-variante-rot-xl"]
    },
    {
        "optionId": "id-für-option-größe-m",
        "productId": ["id-für-variante blau-m","id-für-variante-rot-m"]
    },
],

Danke schonmal im Voraus für eine Antwort.

nee, das ist immer 1:1,
sprich Product_1 => Option_1, Product_1 => Option_15, Product_1 => Option_4711
ausgeschrieben dann T-Shirt, weiß, xs, Damen

Ich habe es selbst herausgefunden. Im Parent-Product muss ich dort gar keine productId angeben,
sondern die „optionId“ reichen völlig aus.
Am Ende des Tages fehlte in meinen gesyncten Produktdaten (Parent inkl. Children) auch nichts,
sondern das Problem war die eingeschaltete asynchrone Indexierung.
Nachdem ich die ausgeschaltet habe, wurden meine Varianten auch im Store wieder richtig ausgegeben. Das nur als Tipp, falls jemand das gleiche Problem hat.
Da hätte ich noch lange weiter nach fehlenden Varianten-Einstellungen suchen können.

Wir haben über die API fehlende Varianten ergänzt,
sprich:
erst „PropertyGroup“
dann „PropertyGroupOption“
dann „ProductConfiguratorSetting“

Die Werte sind theoretisch bereits korrekt am Produkt hinterlegt. Trotz nachträglicher indexierung sehe ich allerdings keine Varianten.

Was ich sehe, sind die Eigenschaften korrekt angewählt in der „Varianten generieren“ übersicht.

Gibt es eine Möglichkeit, fehlende Varianten automatisch über die API zu generieren?

Nicht dass ich wüsste. Die API ist mehr oder weniger eine Schnittstelle zur Datenbank. Zusätzliche Funktionalität ist da stark begrenzt.

Aber eine zusätzliche Varianten anzulegen ist mehr oder weniger Copy & Past. Bestehende Variante abfragen, Option ändern, ProductConfiguratorSetting anpassen, neue Variante speichern.

Ja, habe es nun selbst herausgefunden.

Wenn Varianten generiert werden sollen, dann in folgender Reihenfolge:

  1. Product erstellen => id abgreifen
  2. PropertyGroup erstellen => id abgreifen
  3. PropertyGroupOption erstellen (mit GroupId zuweisung) => id abgreifen
  4. OptionId’s dem Produkt zuweisen
  5. ConfiguratorSetting erstellen mit zuweisung der OptionID
  6. VariantenProduct erstellen (parentId == productId) mit zuweisung der ConfiguratorSetting

Das ganze über Sync und indexing ambesten aus bei einem batch von ca. 100 z.b.

Ungefähr so ist das dann möglich, aber nicht perfekt.

1 „Gefällt mir“

Ich finde das auch jedes mal wieder so unfassbar ekelig, wenn ich Varianten erstellen muss… Kannst du mal ein konkretes Beispiel posten, wie du das machst @cci-woelfel ?

Viele Grüße

Ich kann es zumindest im PseudoCode darstellen:

//1. Vaterartikel definieren
Product vaterArtikel= new Product
{
     Name = "Vaterartikel-Name",
     ProduktNumber = "Vaterartikel",
     Stock = 100,
     Price = new List<Price>{
          new Price
          {
               Linked = false,
               Net = 10,
               Gross = //...
          }
     }
}
// In den Shop hochladen und dessen ID abgreifen, 
// z.b. direkt über die Response oder via SearchCriteria => Filter / Field
//2. PropertyGroup definieren
PropertyGroup eigenschaftsGruppe = new PropertyGroup
{
     Name = "Farbe",
     Position = //...
}
// In den Shop hochladen und dessen ID abgreifen, -.
//3. PropertyGroupOption definieren
PropertyGroupOption eigenschaft = new PropertyGroupOption
{
     Name = "Rot",
     GroupId = "Hier die vorab abgegriffene ID der PropertyGroup eintragen"
     Position = //...
}
// In den Shop hochladen und dessen ID abgreifen, -.
//4. ConfiguratorSetting definieren
ConfiguratorSetting produktKonfiguration = new ConfiguratorSetting
{
     ProductId = "Hier die vorab abgegriffene ID von Product eintragen",
     OptionId = "Hier die vorab abgegriffene ID der PropertyGroupOption eintragen",
     Position = //...
}
// In den Shop hochladen. => Matching erfolgt automatisch
//5. Product definieren => VariantenProdukt
Product kindArtikel= new Product
{
     ParentId = "ID des Vaterartikels"
     Name = "Vaterartikel-Name",
     ProduktNumber = "Vaterartikel.0001",
     Stock = 200,
     Price = new List<Price>{
          new Price
          {
               Net = 10,
               Gross = //...
          }
     },
     Options = new List<PropertyGroupOption>
     {
          new PropertyGroupOption
          {
               Id = "Hier die vorab abgegriffene ID der PropertyGroupOption eintragen"
          }
     }
}
//Dies sollte i.d.R so funktionieren
2 „Gefällt mir“