Wie erstelle ich per Code einen Media Ordner?

Hi, ich wollte fragen ob mir jemand helfen kann und mir beantworten kann wie ich aus einem Plugin herraus einen Medien-Ordner, der auch im Admin bereich angezeigt wird erstellen kann?

 

Bleibt gesund und bleibt zuhause.

Mit Freundlich Grüßen 

Jannus

Eigentlich ganz einfach:

Du benötigst lediglich das MediaRepository und einen Context, eventuell macht es Sinn die Id des Parent Folders mit zu übergeben.
Folgendes müsste eigentlich schon reichen:

$this->mediaFolderRepository->create(
    [
        [
            'name' => 'Mein Ordner',
            'parentId' => $parentFolderId, // optional
        ]
    ],
    $context
);

An das Repository (Servicebezeichnung: media_folder.repository) kommst du in der Regel via Dependency Injection z.B. innerhalb deines eigenen Service. (https://developers.shopware.com/developers-guide/services/)

Siehe auch:

https://docs.shopware.com/en/shopware-platform-dev-en/internals/core/data-abstraction-layer/write?category=shopware-platform-dev-en/internals/core/data-abstraction-layer#create

https://docs.shopware.com/en/shopware-platform-dev-en/internals/core/context

2 „Gefällt mir“

Hallo, danke für die Schnelle Antwort das hat mir sehr geholfen.

Jedoch hätte ich nun eine weitere Frage:

Woher bekomme ich die mediaID für 

api/v1/_action/media/{mediaID}/upload

wenn ich erst mit upload ein neue Media erstelle ?

habe versucht per mediaRepository erst eine neue Media zu erstellen doch wie bekomme ich diese zurück?

$newMedia = $this->mediaRepository->create([
            [
                'name' => 'xxx'
            ]
        ], $context->getContext());

Eine weitere Frage wäre woher weiß ich welche Repositorys welche Daten als $data parameter bekommen müssen?

Hi Jannuns,

du kannst einfach die MediaId vorher generieren und mit geben, dann brauchst du diese nicht nochmal abfragen.
Die Daten die ein Repository benötigt steht in der dazugehörigen Definition-Klasse, z.B. bei Media: MediaDefinition.
(Wenn du den EntityName der Definition nimmst und dann ein „.repository“ nimmst, erhälst du per DIC das dazugehörige Repository :wink: )

Hoffe das hilft dir weiter.

Gruß

Krispin

1 „Gefällt mir“

Wie kann ich denn diese generieren ? 

Vielen Dank für die Antwort!

Habe mir mit UUID:randomHex();

eine MediaID generieren lassen doch wenn ich diese nun verwende bekomme ich folgenes Error:

"status": "404",
            "code": "CONTENT__MEDIA_NOT_FOUND",
            "title": "Not Found",
            "detail": "Media for id 93b44f0ec86b44299fa423c75b204a44 not found.",
            "meta": {
                "parameters": {
                    "mediaId": "93b44f0ec86b44299fa423c75b204a44"
                }
            }

 

hier auch nochmal die function die ich versuchen lasse per api call aufzurufen 

$mediaId = Uuid::randomHex();
        $this->createFolder($context->getContext());

        $tempFile = tempnam(sys_get_temp_dir(), '');

        $customer = $context->getCustomer();

        $destination = "xxxx_" . $request->query->get('fileName', $mediaId);

        try {
            $uploadedFile = $this->mediaService->fetchFile($request, $tempFile);
            $this->fileSaver->persistFileToMedia(
                $uploadedFile,
                $destination,
                $mediaId,
                $context->getContext()
            );
        } finally {
            unlink($tempFile);
        }

 

Hi Jannus,

nutzt du denn ein create? Wie genau sieht dein Aufruf aus?

Gruß

Krispin

1 „Gefällt mir“

habe meinen post bearbeitet, der zweite Code ist alles was ausgeführt wird. 

da mich 

$newMedia = $this->mediaRepository->create([
            [
                'name' => 'xxx'
            ]
        ], $context->getContext());

nicht viel weiter gebracht hat, sont hatte ich dieses als erste zeile hier :

hier auch nochmal die function die ich versuchen lasse per api call aufzurufen 

$mediaId = Uuid::randomHex();
$this->createFolder($context->getContext());

$tempFile = tempnam(sys_get_temp_dir(), ‚‘);

$customer = $context->getCustomer();

$destination = „xxxx_“ . $request->query->get(‚fileName‘, $mediaId);

try {
$uploadedFile = $this->mediaService->fetchFile($request, $tempFile);
$this->fileSaver->persistFileToMedia(
$uploadedFile,
$destination,
$mediaId,
$context->getContext()
);
} finally {
unlink($tempFile);
}

 

p.s 

$newMedia = $this->mediaRepository->create([
            [
                'name' => 'xxx'
            ]
        ], $context->getContext());

hat eine leere Datei erzeugt, wie es auch sein soll, allerdings ohne namen und ich weiß auch nicht wie ich die UUid davon abfragen kann

und leider wird hier kein neuer Ordner erzeugt :

$this->mediaFolderRepository->create(
    [
        [
            'name' => 'Mein Ordner'
        ]
    ],
    $context
);

 

Hi Jannus,

wie schon geschrieben: Du müsstest bei dem Anlegen des Media-Objektes auch eine ID angeben, dann kennst du die ID und musst dies nicht abfragen.

Beim Erzeugen des MediaFolders sollte bei dir auch schon eine Fehlermeldung geworfen werden, da die MediaFolderConfiguration-ID nicht gesetzt ist.
Diese Configuration kannst du beim Anlegen deines Ordner selbst mit erstellen, in dem du einfach eine vorher generierte UUID mit gibst (die benötigten Werte der Konfiguration haben Standardwerte und könnten auch selbst gefüllt werden (siehe MediaFolderConfigurationDefinition).

Ein deinem Falle könnte es dann so aussehen:
 

$this->mediaFolderRepository->create(
    [
        [
            'name' => 'Mein Ordner',
            'configuration' => [
                 'id' => "0d0981d462a843619ddb385999c9bf32"
            ]
        ]
    ],
    $context
);

Ich hoffe dies hilft dir weiter.

Gruß

Krispin

1 „Gefällt mir“

Hallo ich würde das Thema gern nochmal aufgreifen.

Ich entwickle ein Plugin, mit welchem im Storefront Bilder hochgeladen werden können.

Dazu habe ich einen neuen Mediaordner erstellt, welcher mir als Hauptordner dienen soll. Für jeden Upload erstelle ich programmatisch einen Unterordner. Dies funktioniert so weit.

Hier der Code dazu:

$context = Context::createDefaultContext();
$mediaFolderRepository = $this->container->get('media_folder.repository');

$pluginMediaFolder = "7aa052bdf3e04e788e0d50ba6753482a";
$folderId = Uuid::randomHex();
$configFolderId = Uuid::randomHex();
$mediaFolderRepository->create(
    [
        [
            'id' => $folderId,
            'name' => 'upload-' . (new \DateTime())->getTimestamp(),
            'parentId' => $pluginMediaFolder,
            'configuration' => [
                'id' => $configFolderId
            ]
        ]
    ],
    $context
);

Nun versuche ich meine Bilder in diesem Unterordner zu speichern. 

//$folderId ist hier die ID des oben erstellen Unterordners
$mediaId = $this->mediaService->createMediaInFolder($folderId, $context, $isPrivate = false);

// entnommen aus
// vendor/shopware/platform/src/Storefront/Framework/Media/StorefrontMediaUploader.php

try {
    $context->scope(Context::SYSTEM_SCOPE, function (Context $context) use ($mediaFile, $mediaId): void {
        $this->fileSaver->persistFileToMedia(
            $mediaFile,
            pathinfo(Uuid::randomHex(), PATHINFO_FILENAME),
            $mediaId,
            $context
        );
    });
} catch (MediaNotFoundException $e) {
    throw new UploadException($e->getMessage());
}

Damit wird das Bild auch gepseichert, jedoch nicht in meinem Unterordner sondern  im (Default)-Mediabereich.
Wenn ich es richtig verstehe, wird ein Platzhalter vom mediaService erstellt, welcher durch $mediaId widergesepiegelt wird. 

Anschließend wird per persistFileToMedia das file auf diesen Platzhalter gespeichert, korrekt? 

Was übersehe ich?

Vielen Dank für jeden Hinweis & Viele Grüße