Hi, ich versuche im großen und ganzen seit 2 Wochen ein Plugin zu erstellen, dass mir die gesamten Bilder aus der media repository anhand ihrer Namen und ihrer Pfade ausgibt in einer Tabelle. Das ist das endgültige Ziel, um in das Thema reinzukommen.
Das Problem ist, ich bekomme schon das Tutorial nicht hin mit dem Titel „Reading data“, da ich schlicht nicht weiß, oder verstehe, wie ich die Methode(n) aus meiner Service php Datei „ReadingData.php“ in meinem Modul „swag-example“ oder in meiner Komponente „hello-world“ aufrufen kann.
Könnte mir hier jemand bitte helfen?
Ein Service ist Symfony. Ein Modul oder eine Component ist VueJS.
Das sind zwei unterschiedliche Frameworks, basierend auf PHP bzw. JavaScript, die nichts miteinander zu tun haben.
Im Backend (VueJS) wird alles über API-Requests geladen bzw. getriggert.
Sorry, ich bin halt maximal verwirrt. Wie sollte ich jetzt also am besten vorgehen, um an mein Ziel zu kommen? Gibt es ein besseres Tutorial?
Wie funktionieren API requests? Sorry, im Prinzip ist hier alles neu für mich, ich kannte bisher lediglich java und C#
Symfony: Add store API route - Shopware Developer Für die Backend-API gibt es glaube ich kein Tutorial. Da musst du dich am Storefront-API Tutorial halten oder bei GitHub nachsehen.
VueJS: https://developer.shopware.com/docs/guides/plugins/plugins/administration/add-custom-service
Ok, vielen Dank, ich schaue es mir an.
Ich komme schon bei „Add Custom Service“ nicht weiter. Also schon ganz am Anfang, wo befindet sich denn mein „administration root“? Das wurde nie erklärt und taucht scheinbar nur in diesem Tutorial auf. Ist es „/src/Resources/app/administration/src/“ ?
Dann zum Teil „Service injection“, hier steht, ich soll das in eine vue Komponente Packen, für mich wäre das also die „hello-world“ Komponente, ja? Will nur sicher gehen.
Müsste vermutlich /src/Resources/app/administration/ sind, ggfs. aber auch /src/Resources/app/administration/src/. Am besten bei Github nachsehen, wie Shopware das selbst macht.
Der Service ist nur dafür da, Daten zu schreiben bzw. erhalten. Die Ein-/Ausgabe erfolgt in einer Component. In deinem Fall hello-world.
Ok, ich habe es nun tatsächlich geschafft, dass in der Konsole unter F12 der Witz mir angezeigt wird. Dennoch weiß ich jetzt nicht, wie ich eine Service php nutze. Ich glaube ich bin zu dumm für shopware
Du erstellst nun in Synfony PHP eine Admin-API-Route und verbindest damit deinen Service. Diese Admin-API-Route rufst du dann anstatt des Witz-Service auf.
Hallo Max_Shop, sorry, ich habe über das Wochenende was zu tun gehabt und kam nicht dazu.
Ich bin aktuell so weit, dass ich scheinbar die Sachen tatsächlich auslesen kann, ich nutze aktuell die folgende Methode:
public function getMediaConfigurationInformation(Context $context): JsonResponse
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('fileName', 'favicon'));
$products = $this->productRepository->search($criteria, $context);
print_r($products);
return new JsonResponse($products);
}
Ich bekomme jedoch die Tabelle nicht aufgebaut, da scheinbar das JSON nicht das richtige Format hat, denke ich mal… Ich habe in meiner Tabelle die Werte mit den Namen „url“ und „fileName“. Die JSON sieht laut Netzwerkanalyse wie folgt aus:
{"entity":"media","total":1,"aggregations":[],"page":1,"limit":null,"elements":{"0c62448c9abf4ea3872fa2c6a56bdd2d":{"userId":null,"mimeType":"image\/png","fileExtension":"png","fileSize":549,"title":null,"metaData":{"type":3,"width":32,"height":32},"mediaType":{"name":"IMAGE","flags":["transparent"],"extensions":[]},"uploadedAt":"2022-12-10T16:21:56.967+00:00","alt":null,"url":"http:\/\/localhost\/media\/ec\/f8\/d2\/1670689316\/favicon.png","fileName":"favicon","user":null,"translations":null,"categories":null,"productManufacturers":null,"productMedia":null,"avatarUser":null,"thumbnails":[],"mediaFolderId":"0eb144799aee4e3eb648b31e31581d77","mediaFolder":null,"hasFile":true,"private":false,"propertyGroupOptions":null,"mailTemplateMedia":null,"tags":null,"thumbnailsRo":"O:77:\u0022Shopware\\Core\\Content\\Media\\Aggregate\\MediaThumbnail\\MediaThumbnailCollection\u0022:2:{s:11:\u0022\u0000*\u0000elements\u0022;a:0:{}s:13:\u0022\u0000*\u0000extensions\u0022;a:0:{}}","documentBaseConfigs":null,"shippingMethods":null,"paymentMethods":null,"productConfiguratorSettings":null,"orderLineItems":null,"cmsBlocks":null,"cmsSections":null,"cmsPages":null,"documents":null,"appPaymentMethods":null,"_uniqueIdentifier":"0c62448c9abf4ea3872fa2c6a56bdd2d","versionId":null,"translated":{"alt":null,"title":null,"customFields":[]},"createdAt":"2022-12-10T16:21:56.896+00:00","updatedAt":"2022-12-10T16:21:56.998+00:00","extensions":{"foreignKeys":{"apiAlias":null,"extensions":[]}},"id":"0c62448c9abf4ea3872fa2c6a56bdd2d","customFields":null}},"extensions":[],"states":[]}
Noch eine Idee? Es klappt mir der Beispiel JSON: $result = [ [ "url"=> "Hans", "fileName"=> "xyz" ], [ "url"=> "Wurst", "fileName"=>"asdf" ] ];
Das kannst du ja sehr leicht prüfen, indem du das JSON in einen Validator packst.
Auf Seiten von VueJS ist es Vue ja völlig egal, was für ein Format das JSON hat, solange es valide ist. Du kannst die Daten ja „biegen und brechen“ wie du möchtest.
Ich denke ich habe es endlich hinbekommen. Habe es umgeändert:
$criteria = new Criteria();
$products = $this->productRepository->search($criteria, $context);
$products = $products->getEntities()->getElements();
Durch das getElements() hat es nun geklappt und mir werden alle Bilder anhand ihrer Namen und URLs angezeigt.
Danke für deine Unterstützung
Hi, ich noch mal, eine Sache, die ich nicht verstehe und die mich beschäftigt: Wenn ich eines der Default Bilder von dockware lösche, bleibt das ergebnis dennoch in der Liste, obwohl die URL nirgendwo mehr hinführt. Auch das Boolean „hasFile“ dass eigentlich zur Laufzeit berechnet werden soll, hat den Wert True.
Eine Idee, warum sich das nicht aktuallisiert?
Auch, wenn du den Cache geleert hast?
Ja genau. Ich habe die Datei überFilezilla gelöscht, habe mich eingewählt in 127.0.0.2:22 mit user und Passwort = dockware
Muss ich die komplette Ordnerstruktur löschen? Ich habe bisher nur die demostore-logo.png entfernt.
EDIT: Hier mal ein Ausschnitt meiner Liste:
Ich habe 18 Elemente in der Liste. Ich weiß nicht, ob das überhaupt stimmt. Ist halt die Beispielinstallation, noch habe ich keine eigenen Bilder eingefügt
Nutze Dockware nicht, kann dir da leider nicht weiterhelfen. Ggf. ist die Datei noch im Browser-Cache gespeichert.
Na ja, dockware ist halt eine lokale Shopware installation. Ich brauche halt dann keinen Onlinespeicher.
Gibt es denn einen Befehl zum löschen von Medien? Ich habe bisher einfach die Datei im entsprechenden Ordner gelöscht, doch das System behölt den „hasFile“ Zustand als true bei und mal kann tatsächlich die Datei auch wieder „generieren“ durch ./bin/console Befehle. Welche genau, weiß ich gerade nicht, aber ich habe 2-3 ausgeführt und die Datei war wieder da.
Das ist echt frustrierend.
Mein Ziel ist übrigens nicht die Auflistung aller Mediendateien, sondern nur von denen, die Fehlerhaft sind. Diesen Zustand versuche ich eben gerade nachzustellen, doch es mislingt.
Hallo noch mal, ich bin das ganze wohl falsch angegangen. Ich habe ja bereits mein Array, wo alle Medienelemente drin stecken. Es muss eine Möglichkeit geben, per php zu prüfen, ob die Dateien, die in diesem Array stecken, auch wirklich noch vorhanden sind. Ich denke, das wird mit is_File() gehen. Ich muss nur noch eine Möglichkeit finden, durch mein „Array“ zu iterieren. Ich weiß nämlich noch immer nicht, wie genau ich das anstelle. Es ist scheinbar ein Array mit Object Elementen, die Object Elemente enthalten sehr viele Informationen. Jedes Object repräsentiert dabei eine Mediendatei.