Administration API: Thumbnails erzeugen / WriteProtected

Hallo zusammen,

ich habe mir ein Administration Modul entwickelt, mit dem ich Produkten Bilder von Pixxio zuweisen kann, ohne sie herunter zu laden. Jetzt möchte ich Thumbnails dafür generieren lassen.

Leider sind die Felder width&height bei media_thumbnail WriteProtected und das Feld media:thumbnailsRo ist nicht ApiAware - kann soweit ich weis also nicht durch die API beschrieben werden?

Kann mir hier evt. jemand sagen, ob ich das umgehen kann? Ich habe mir gedacht ich „überschreibe“ temporär die Einstellung:


// remove write protection
Shopware.EntityDefinition.get('media_thumbnail').forEachField((field, fieldName) => {
    if(fieldName === 'width' || fieldName === 'height') {
        field.flags.write_protected = null;
        delete field.flags.write_protected;
    }
})

// get sizes and save thumbnails
this.getThumbnailSizes().then((sizes) => {
    let aSizes = []
    sizes.forEach((size) => {
        let MediaThumbnail = this.mediaThumbnailRepository.create()

        MediaThumbnail.mediaId = media.id
        MediaThumbnail.pixxio = true
        MediaThumbnail.width = size.width
        MediaThumbnail.height = size.height

        this.mediaThumbnailRepository.save(MediaThumbnail, Context.api)
        // Produce error 500 because of write protection
    })
});

In PHP müsste ich die Daten dann abfangen und selbst irgendwie über ein Event speichern, oder die EntityDefinition überschreiben.

public function onControllerArguments(ControllerArgumentsEvent $event): void
{
    $request = $event->getRequest();
    $controller = $event->getController()[0];

    if ($this->matcher instanceof RequestMatcherInterface) {
        $parameters = $this->matcher->matchRequest($request);
    } else {
        $parameters = $this->matcher->match($request->getPathInfo());
    }

    if($controller instanceof ApiController && $parameters['entityName'] === 'media-thumbnail') {
        // SAVE TUMBNAILS OR ORVERRIDE MediaThumbnailDefinition
    }
}

Klingt das für euch gut, oder gibt es da einen besseren Weg?

Danke & LG
Sio

Ich habe noch mal drüber geschlafen, für das Problem generiere ich keine Thumbnails. Es sollte reichen, wenn ich die Thumbnail-Sizes einfach an Pixxio übergebe und die Links dem Srcset übergebe.

Allerdings wäre es noch super, falls mir jemand das System hinter WriteProtected und ApiAware erklären könnte, bzw. warum ich diese Felder nicht per API anlegen kann.

Bei Media bspw. kann ich deswegen leider auch viele Felder nicht befüllen. Hat hier evt. schon jemand „etwas“ mit dem Bilder in die Tabelle media gespeichert werden können?

const pixxioMedia = this.mediaRepository.create(Context.api, media.id)
pixxioMedia.mimeType = response.data.fileType
pixxioMedia.fileExtension = 'jpg'
pixxioMedia.fileSize = response.data.fileSize
pixxioMedia.fileName = response.data.originalFilename
pixxioMedia.title = response.data.originalFilename

this.mediaRepository.save(pixxioMedia, Context.api).then(() => {
    // do cool stuff …
})

Danke & LG
Sio