Bei Freitextfeld werden nur IDs ausgegeben

Hallöchen zusammen,

ich möchte an der Stelle, wo das Freitextfeld-2 standardmäßig sitzt einige kleine Icons ausgeben, die ich im Backend beim Artikel vorher anwähle.

Unter der Freitextfeld-Verwaltung habe ich nun diese Varianten versucht:

Mehrfachauswahl - MEDIUMTEXT   -->  Media - Shopware\Models\Media\Media
Mehrfachauswahl - MEDIUMTEXT   -->  Eigenschafts-Option - Shopware\Models\Property\Value

 

Beim ersten kann ich im Backend ganz einfach per Mediaverwaltung die gewünschten Bilder auswählen. Diese werden im Backend auch richtig angezeigt, aber im Frontend steht dann an der Ausgabestelle nur eine numerische ID und kein Bild.

Bei der zweiten Variante habe ich unter “Artikel” --> “Eigenschaften” eine neue Gruppe angelegt und rechts daneben Optionen angelegt. Die Optionen tragen einen Namen und sind auch in ihren Einstellungen mit einem entsprechenden Bild hinterlegt. In der Artikelverwaltung kann ich diese Bezeichnungen auch auswählen, aber im Frontend werden auch hier wieder nur numerische IDs angezeigt.

 

Das ID-Problem habe ich hier im Forum nun mehrfach gefunden, aber die Threads blieben an der Stelle, wo das Problem mit den IDs auftritt unbeantwortet. Die sind aber nun alle mindestens 1 Jahr alt, daher habe ich die Hoffnung, dass zwischenzeitlich jemand eine Lösung dafür kennt.

 

Ich nutze SW5.3.1 und PHP7.1.6

Keiner eine Idee, woran das liegen kann oder was ich noch beachten muss? =(

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.