Ordner per API anlegen

Hallo,

ich versuche seit einiger Zeit weitere Medienordner per API anzulegen. Es will mir partout nicht gelingen. Ich kann Artikel anlegen, Preise abändern, Bilder hochladen - alles per API. Aber diese sch… Ordner rauben mir den letzten Nerv!

Über Symfony schaue ich mir immer die API Aufrufe an. Um einen Ordner anzulegen, werden 2 relevante Aufrufe benötigt.

Der erste an api/search/media-default-folder zur Abfrage der ID des aktuellen Ordners.
Der zweite an api/media-folder zum anlegen des neuen Ordners.

Der erste Aufruf klappt bei mir. Beim zweiten Aufruf …

{
    "key": "write",
    "action": "upsert",
    "entity": "media",
    "payload": {
        "parentId": "069424e2b9ed4872bf85134d8dc4d465",
        "configurationId": "69cffa7928cb4d878969b15365fa5302",
        "id": "c129e5552da64910b6e9b2ab48e1ee03",
        "name": "apiTest",
        "useParentConfiguration": false
    }
}

bekomme ich immer wieder die Rückmeldung. Hääää, der Wert ist doch nicht leer! Ich kapiere es nicht.

 ["errors"]=>
  array(2) {
    [0]=>
    object(stdClass)#849 (6) {
      ["code"]=>
      string(36) "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
      ["status"]=>
      string(3) "400"
      ["detail"]=>
      string(35) "Dieser Wert sollte nicht leer sein."
      ["template"]=>
      string(31) "This value should not be blank."
      ["meta"]=>
      object(stdClass)#848 (1) {
        ["parameters"]=>
        object(stdClass)#841 (1) {
          ["{{ value }}"]=>
          string(4) "null"
        }
      }
      ["source"]=>
      object(stdClass)#843 (1) {
        ["pointer"]=>
        string(18) "/0/configurationId"
      }
    }

Ich sende das alles per POST an /api/media-folder. Was übersehe ich denn hier?

Bitte gebt mir einen Tipp.

Danke
tomquenten

{
    "key": "write",
    "action": "upsert",
    "entity": "media",
    "payload": {
        "parentId": "069424e2b9ed4872bf85134d8dc4d465",
        "configuration": {"id":"69cffa7928cb4d878969b15365fa5302"},
        "id": "c129e5552da64910b6e9b2ab48e1ee03",
        "name": "apiTest",
        "useParentConfiguration": false
    }
}

Geht es vllt so?

Nein. Im Symfony Profiler steht es aber auch so wie o.g.

(raus kopiert)

{
    "id": "328f65edd3a64829919b229f0eed1114",
    "useParentConfiguration": true,
    "configurationId": "8f130df0c23d45fca41ec021df49b51a",
    "parentId": "069424e2b9ed4872bf85134d8dc4d465",
    "name": "ghk"
}

Genau deshalb kann ich es nicht nachvollziehen, weshalb ich die o.g. Antwort von der API bekomme. Es muss irgendeine Kleinigkeit sein die ich nach stundenlangem anstarren des Monitors schlicht nicht erkenne.

tomquenten

Ich würde hier einfach mal auf ein github issue verweisen, welches ich mal erstellt hatte.

Vielen Dank! Das hilft mir jedoch nicht weiter - da ich es schlicht nicht verstehe.

Nachdem ich heute nun den ganzen Tag probiert habe, bin ich keinen Schritt weiter. Gestern konnte ich ein einziges mal einen Ordner erstellen, jedoch nicht über POST an /api/media-folder sondern über POST an _action/sync. Heute wollte mir das nicht gelingen, den ganzen versch… Tag hänge ich jetzt da dran.

Resultat: keinen Schritt weiter. :frowning:

Also, erster Aufruf per POST an api/media?_response=true

{
    "key": "write",
    "action": "upsert",
    "entity": "media",
    "payload": {
        "id": "fa196fbd62dbf0925a043d1176c4276d",
        "mediaFolderId": "749e83d7c8c93020847d26917ca34716"
    }
}

liefert mir eine hübsche neue ID in rosa Schleife zurück.

string(32) "56368db84c87492585dfa020225a4c32"

Mit dieser ID starte ich dann den zweiten Aufruf per POST api/media

{
    "key": "write",
    "action": "upsert",
    "entity": "media",
    "payload": {
        "parentId": "069424e2b9ed4872bf85134d8dc4d465",
        "configurationId": "8f130df0c23d45fca41ec021df49b51a",
        "id": "56368db84c87492585dfa020225a4c32",
        "name": "apiTest"
    }
}

was mir auch mit einem Success bestätigt wird.

object(stdClass)#57 (5) {
  ["success"]=>
  bool(true)
  ["data"]=>
  object(stdClass)#110 (2) {
    ["media"]=>
    array(1) {
      [0]=>
      string(32) "56368db84c87492585dfa020225a4c32"
    }
    ["media_translation"]=>
    array(1) {
      [0]=>
      object(stdClass)#112 (2) {
        ["mediaId"]=>
        string(32) "56368db84c87492585dfa020225a4c32"
        ["languageId"]=>
        string(32) "2fbb5fe2e29a4d70aa5854ce7ce3e20b"
      }
    }
  }
  ["deleted"]=>
  array(0) {
  }
  ["notFound"]=>
  array(0) {
  }
  ["extensions"]=>
  array(0) {
  }
}

Im Backend ist jedoch nur die erstellte leere „Hülle“ zu sehen.

Nächster Versuch war den 2 Aufruf an per POST an _action/sync zu senden

[
    {
        "key": "write",
        "action": "upsert",
        "entity": "media",
        "payload": [
            {
                "parentId": "069424e2b9ed4872bf85134d8dc4d465",
                "configurationId": "8f130df0c23d45fca41ec021df49b51a",
                "id": "56368db84c87492585dfa020225a4c32",
                "name": "apiTest"
            }
        ]
    }
]
object(stdClass)#116 (5) {
  ["success"]=>
  bool(true)
  ["data"]=>
  object(stdClass)#112 (2) {
    ["media"]=>
    array(1) {
      [0]=>
      string(32) "56368db84c87492585dfa020225a4c32"
    }
    ["media_translation"]=>
    array(1) {
      [0]=>
      object(stdClass)#119 (2) {
        ["mediaId"]=>
        string(32) "56368db84c87492585dfa020225a4c32"
        ["languageId"]=>
        string(32) "2fbb5fe2e29a4d70aa5854ce7ce3e20b"
      }
    }
  }
  ["deleted"]=>
  array(0) {
  }
  ["notFound"]=>
  array(0) {
  }
  ["extensions"]=>
  array(0) {
  }
}

Auch hier das gleiche Ergebniss im Backend. :frowning:

Über den Symfony Profiler sehe ich das doch, warum will das bei mir nicht funktionieren???

tomquenten

Dann schau dir mal den Link an, den @shyim bei der Github issue gepostet hat.

Und hast du denn meinen ersten Vorschlag auch probiert?

Ist denn eine Konfiguration notwendig?

Also Deinen Vorschlag hatte ich ausprobiert - ja. Brachte aber nicht das gewünschte Ergebnis. Das was @shyim gepostet hat, habe ich mir natürlich auch angeschaut. Jedoch sieht mir das nicht nach PHP aus, sondern eher nach JavaScript. Da bin ich dann aber wieder raus. Das ist nicht meins. Daher habe ich es nicht verstanden.

Was meinst du mit Konfiguration? Ich habe eine eigene API Klasse geschrieben, die natürlich eine Konfiguration benötigt wie z.B. API Schlüssel etc. Das ist aber, denke ich mir, nicht das Problem, da ich über die gleiche Klasse ja auch Produkte aus der Sage100 in Shopware importiere, das funktioniert ja auch, genauso wie der Preis- und Bestandsabgleich. Meintest du das damit?

tomquenten

Es geht doch garnicht darum, dass er js benutzt in dem Bsp. Sondern darum das statt der configurationId eine neue configuration mit dem payload angelegt wird. Ein eigener Ordner mit ner eigenen Konfiguration. So kannst du den Fehler nicht haben, dass configurationId nicht gesetzt ist.

Aber vllt nutzt du nen falschen endpoint? Vllt media und media-folder verdreht?

Oder die falsche entity media statt media_folder

Genau den Fehler hatte ich auch schon gemacht!

Und DAS war die Lösung!!!
Nicht media und auch nicht media-folder SONDERN media_folder. Das hatte ich auch schon probiert gehabt, jedoch mit media-folder. Da das Ergebnis ein Server-Error war, hab ich das dann wieder in media benannt und damit weiter probiert. Ich bin nicht mal auf die Idee gekommen den Unterstrich zu nehmen, hab das völlig übersehen. So eine Kleinigkeit kann es eben sein. Man, @ Moorleiche, tausend Dank dafür!!!

DANN jedoch ist das im Symfony Profiler falsch. Dort steht eindeutig media-folder! Das habe ich soeben noch einmal geprüft.

LÖSUNG
So jedenfalls funktioniert es…

[
    {
        "key": "write",
        "action": "upsert",
        "entity": "media_folder",
        "payload": [
            {
                "parentId": "069424e2b9ed4872bf85134d8dc4d465",
                "configurationId": "8f130df0c23d45fca41ec021df49b51a",
                "id": "fa612d3a889346f3b67dffdc57463bdb",
                "name": "apiTest"
            }
        ]
    }
]

Was sagt denn die configurationID eigentlich aus??? Wofür ist die? Ich habe diese bisher einfach aus dem Symfony Profiler übernommen

tomquenten

Hallo, freut mich, dass du die Lösung herausgefunden hast.

Die Konfiguration ist für Thumbnail-Einstellungen, wie z.B. die Auflösung und Qualität der darin enthaltenen Bilder.