Ich hatte das gleiche Problem.
Genau betrachtet liefert dir Shopware ja eine „solide Basis“ um an alle Informationen zu kommen, die du brauchst - nämlich die ID des Bildes. Du musst eben sehr viel selbst machen. Hier ein Beispiel wie man es machen kann. (Diese Antwort basiert auf der Antwort in diesem Thread.)
(Um den direkt Kritikern den Wind aus den Segeln zu nehmen: Ja, hier wird im View-Bereich eine Datenbankabfrage gemacht, das gehört eigentlich in einen Controller, also in ein eigenes Plugin. Das lässt sich auch umsetzen. Aber Ugchen hat Recht damit, dass es ein Missstand ist, dass die Threads immer dann abreißen, wenn es anfängt hilfreich zu werden. Also: Dieses Beispiel ist eine kleine Unterstützung und nicht die perfekte Antwort. Auf Basis dieses Codes kann man ein Plugin aufbauen.)
1. SMARTY-MODIFIER ANLEGEN
Lege folgende Datei an:
Mein_Theme > _private > smarty > modifier.mediaurl.php
Mit folgendem Inhalt:
Models()->getRepository('Shopware\Models\Media\Media')->findOneBy(['id' => $id]);
$baseUrl = sprintf(
"%s://%s%s",
isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
$_SERVER['SERVER_NAME'], $_SERVER['REQUEST_URI']);
$baseUrl = parse_url($baseUrl);
$baseUrl = $baseUrl['scheme']."://".$baseUrl['host']."/";
if ($media) {
$originalImagePath = $media->getPath();
$mediaPaths = [];
$thumbnails = $media->getThumbnails();
$thumbnailsHdpi = $media->getHighDpiThumbnails();
if(!empty($thumbnails)) {
foreach($thumbnails as $key => $thumbnail) {
$values = explode('x',$key);
$maxWidth = (int)array_shift($values);
if($maxWidth === 140) {
continue;
}
$mediaPaths[$key] = ['resolution' => $key, "path" => $baseUrl.$thumbnail, 'maxWidth' => $maxWidth];
}
}
if(!empty($thumbnailsHdpi)) {
foreach($thumbnailsHdpi as $key => $thumbnail) {
if(array_key_exists($key, $mediaPaths)) {
$mediaPath = $mediaPaths[$key];
$mediaPath['hdpiPath'] = $baseUrl.$thumbnail;
$mediaPaths[$key] = $mediaPath;
}
}
}
$mediaPaths['fallback'] = ["resolution" => 'fallback',"path" => $baseUrl.$originalImagePath];
return $mediaPaths;
}
}
}
2. MODIFIER EINSETZEN
Nehmen wir an, dass das Freitextfeld den Namen „additional_image“ trägt und dass der Shop schon so aktuell ist, dass das „.attributes“ weggelassen werden kann.
Wo also vorher mit folgendem Code leider nur die ID des Bildes ausgegeben wurde
{$sArticle.additional_image}
schreiben wir jetzt folgendes:
{$sArticle.additional_image|mediaurl}
Im Frontend erscheint jetzt die Ausgabe
Array
Soweit also alles in Ordnung. Es bietet sich an, dieses Array direkt in eine eigene Variable zu speichern. Geben wir sie uns direkt aus, damit wir die Struktur anschauen und darauf aufbauend das Theme erweitern können:
{$imgData = $sArticle.additional_image|mediaurl}
{$imgData|@print_r}
In der Ausgabe sieht man, in welchen Auflösungen das Bild verfügbar ist und auch den Fallback Link. Damit lässt sich z.B. folgender Templatecode zusammenbauen:
Den Modifier und erst Recht das Beispiel für die Einbindung im Template müssen je nach Anwendungsfall etwas angepasst werden.
Ich hoffe, dass damit die Frage entweder beantwortet ist oder die Lösungsfindung unterstützt werden konnte.