Bilder per API anlegen - This field is write-protected?

Beim anlegen von Bildern per API in einem Shop (andere komischerweise nicht) kommt bei der API diese Fehlermeldung:

[code] => FRAMEWORK__WRITE_CONSTRAINT_VIOLATION
[status] => 400
[detail] => This field is write-protected. (Got: "crud" scope and "system" is required)
[template] => This field is write-protected. (Got: "%s" scope and "%s" is required)
[meta] => Array
    (
        [parameters] => Array
            (
                [0] => crud
                [1] => system
            )

    )

[source] => Array
    (
        [pointer] => /0/mimeTypemimeType
    )

Was mich etwas wundert, dass diese Fehler in anderen Shops nicht vorkommt obwohl 1:1 das Selbe übertragen wird :thinking:

Wie dem auch sei, was bedeutet das nun genau?

Nachtrag:

Selbst wenn ich zum Test „mimeType“ bei der API auskommentiere, kommt der selber Fehler dann bei „fileName“. Was ist denn das für ein Mist? Hatte das schon mal jemand?

Wie sieht der POST aus, welchen du schickst?

Genau so:

'id' => $mediaId,
'mediaFolderId' => self::$mediaFolderId, 
'mimeType' => $MedienData['mimeType'],
'alt' => $MedienData['alt'],
'title' => $MedienData['title'],
'fileName' => $MedienData['fileName'],
'url' => $MedienData['url'],

Aber, wie schon oben erwähnt, die Übertragung in andere Shops (exakt die selbe SW Version) funktioniert ohne Probleme. Als ob bei diesem Shop die API ‚/api/media‘ nicht zulässt.

Liest sich, als hätte der Ordner keine Schreibrechte. Da mal alles geprüft?

Hat der API Nutzer überhaupt die Berechtigung zum Erstellen / Schreiben? :sweat_smile:
… aber CRUD könnte ein Hinweis auf die Schreibrechte des /media Ordners sein.

Sagen wir mal so, es sind keine expliziten Rollen vergeben. Der Benutzer ist Admin - exakt so wie in den anderen Shops. Der Medien-Ordner hat 0755.

Wenn man Bilder im Backend manuell hochladen kann, muss der Fehler wo anders liegen.

Im Code kommt das hier vor:

private function validateContextHasPermission(Field $field, KeyValuePair $data, WriteParameterBag $parameters): void
    {
        $flag = $field->getFlag(WriteProtected::class);
        if ($flag === null) {
            return;
        }

        if ($flag->isAllowed($parameters->getContext()->getContext()->getScope())) {
            return;
        }

        $message = 'This field is write-protected.';

WriteProtected ist ein Flag des DBAL, d.h. aus irgendeinem Grund ist das Feld damit markiert. Wüsste allerdings keinen Grund. Plugin?

Das ist ein sehr seltsames und mir unbekanntes Verhalten. Habe jetzt mal alles mit „medien“ auskommentiert. Das Produkt wurde über die API sauber abgelegt - allerdings ohne Bilder. Alle Versuche die Bilder per API anzulegen scheitern an der oben erwähnten Fehlermeldung. Werd mal zum Test einen anderen Benutzer anlegen und auch bei Plugin suchen ob hier ggf. irgendetwas blockiert.

Im Moment weiß ich nicht was das sein soll :thinking:

Ich les da raus, das „mimeType“ das Feld sein soll, das ist aber im Originalcode nicht WriteProtected, es gibt aber andere Felder, die sind durchaus damit markiert, z.B. mediaType. Desweiteren versteh ich das so, das CRUD und System als Berechtigung vorliegen müssen (dann würde das wohl „überschrieben“) oder versteh ich das falsch? Das müsste doch aber von einem Adminaccount gegeben sein?

Andere API-Einspielungen (wie z.B. Produkt anlegen) funktionieren ohne Probleme - mit selben Benutzer. Ich kann das nicht verstehen.

Tja, Plugin kontrolliert (deaktiviert, aktiviert), neuen Benutzer angelegt und sogar Rechte per Rolle vergeben. Fehler bleibt wie im Eingangspost schon geschrieben. Shopware nevt manchmal schon etwas. Keine Ahnung welcher Mist hier schief läuft.

War der ursprüngliche Benutzer Admin ohne Rolle?

Ja, war er. Aber auch mit Rolle (bereits obene erwähnt) hat sich nichts geändert.

Ähm ja, ergibt aber keinen Sinn da die Fehlermeldung bereits beim Anlegen von Media kommt - nicht beim eigentlichen Upload. Ansonsten sind die Schreibrechte wie in anedern Shops. Das kann es nicht sein. Zudem müsste da eine völlig andere Fehlermeldung kommen.

write protected Felder werden von Shopware selber gesetzt. Ich habe den Code gerade nicht vor Augen - aber Dateiname und mime type werden von Shopware selber generiert/gelesen und gesetzt. Du kannst/darfst keine write protected Felder bei API crud Operationen mitgeben.

Viele Grüße

1 „Gefällt mir“

Ne die Aussage kann so nicht stimmen. Ich erwähnte bereits, dass es in anderen Shops KEINE Fehlermeldungen an dieser Stelle gibt wo ich genau die selben Daten und im selben Format übertrage. Sicher dass diese Aussage so stimmt? Und laut Doku wird das auch nicht erwähnt.

Rückmeldung/Feedback:

Ich habe jetzt die Felder „mimeType“ und „fileName“ herausgenommen, so dass jetzt nur dies übrig bleibt.

'id' => $mediaId,
'mediaFolderId' => self::$mediaFolderId, 
'alt' => $MedienData['alt'],
'title' => $MedienData['title'],
'url' => $MedienData['url']

Die Fehler sind weg.

Aber, dennoch bleibt die Fragen offen:

  1. Warum haben andere Shops selber Version an dieser Stelle keinen Fehler angezeigt (Bilder wurden aber angelegt)?
  2. Warum steht dieser Hinweis bezüglich „write-protected“ nicht in der API-Doku?

Siehe dazu: Create a new Media resources. | Admin API

Das muss irgendwie besser kommuniziert werden.