MediaService -> virtuellen Pfad ausgeben

Hallo, möchte auf ein Bild zugreifen. Der Pfad ist ja nicht wie in der DB hinterlegt, es wird ein “virtual paths” angelegt. Jetzt muss ich ja diesen Pfad erstellen, damit ich im tpl drauf zugreifen kann. In der Bootstrap habe ich geschrieben: $path = $subcat[$n]['path']; $mediaService = $container-\>get('shopware\_media.media\_service'); $url = $mediaService-\>getUrl($path); Aber der gibt mir einen Fehler aus. Fatal error: Call to a member function getUrl() on null in …/html/engine/Shopware/Plugins/Local/Frontend/HPCategoryListing/Bootstrap.php on line 62 503 Service Unavailable Bestimmt habe ich wieder etwas falsch verstanden. Würde mich freuen, wenn mir wieder jemand helfen könnte. Gruß

Überprüfe mal deine path Variable. Die scheint leer zu sein!

Das Problem ist, ich weiß nicht, wie ich die “MediaService.php” in meine Bootstrap einbinde, damit ich auf die Klasse zugreifen kann. Den virtuellem Pfad, um auf das Bild zugreifen zu können, habe ich jetzt selber geschrieben: [code] $pathMD = md5($subcat[$n][‘path’]); $vPath1 = substr($pathMD, 0, 2); $vPath2 = substr($pathMD, 2, 2); $vPath3 = substr($pathMD, 4, 2); $temp = explode(’/’, $subcat[$n][‘path’]); for ($i=0; $i<count .="$temp[$i].’/’;" funktioniert auch. aber wie bekomme ich den code ans laufen in der fragestellung hatte>

Der Media Service kann nicht über $container instanziiert werden, weil - die Variable bzw. das passende Objekt in Deinem Kontext gar nicht vorhanden ist. Für die Bootstrap könnte es so aussehen (Zugriff über das Shopware Singleton) $mediaService = Shopware()-\>Container()-\>get('shopware\_media.media\_service'); $path = $subcat[$n]['path']; $url = !empty($path) ? $mediaService-\>getUrl($path) : $path; Schöne Grüße, Niklas

1 „Gefällt mir“

Super - funktioniert und verstanden. Vielen Dank !

ich häng mich mal dran an die Frage

wenn ich im Backend ein Bild hochlade. Kenn ich ja den Pfad und Bildnamen nicht! Vorallem wenn ich viele Bilder hochlade will ja nicht jedes Bild per Hand bennennen.

Wie erhalte ich den Bildnamen und den Pfad programatisch. Im Tutorial wird ja angenommen das der Pfad bereits bekannt ist 

 

The following code snippets should be self-explanatory. They assume you already retrieved both the virtual $path from the Media entity and the $mediaService instance from the DI container:

$path = 'media/image/my-fancy-image.png';
$mediaService = $container->get('shopware_media.media_service');

$path = ‘media/image/my-fancy-image.png’;
ist mir ja völlig unbekannt

 

Gibt es be spezielle Methode dazu die den $path beim Hochladen wiedergibt?

und keiner eine Idee wie der Media Service den Dateinamen ausgibt? 

 

 

Wer die Funktion mal außerhalb ohne Zugriff auf die Klasse braucht, hier die Kurzversion:

$path = ltrim($path, "/");
$path_elements = explode("/", $path);
$path_info = pathinfo($path);
$path_md5 = md5($path);
$path = array_slice(str_split($path_md5, 2), 0, 3);
$path = $path_elements[0]."/".$path_elements[1]."/".join("/", $path)."/".$path_info['basename'];
$path = '//'.$_SERVER['HTTP_HOST'].'/'.$path;

 

Hallo,

 

der Media Service sollte da sein, schließlich versuchst in einem Event darauf zuzugreifen. Du solltest auch

$this->container->get('shopware_media.media_service')

Anstatt von

$container->get('shopware_media.media_service')

verwenden. Falls es sich dabei um ein neues Plugin handelt, dann würde ich Dir auch empfehlen auf das neue Plugin System umzusteigen: https://developers.shopware.com/developers-guide/plugin-system/

Sobald der Shopware Kernel gebootet ist, ist auch der Container da. Der wird im Modul frontend und backend automatisch gebootet.

Von diesem ominösen Shopware() Aufruf würde ich die Finger lassen, der ist alt und man braucht ihn auch in 90% der Fälle nicht mehr. Von irgendwelchen selbst gebastelten Lösungen würde ich ebenfalls die Finger lassen. Falls es doch nötig sein soltle, dann baue Deinen eigenen Service, bzw. ersetze einen vorhandenen.

Wenn Du nur ein Bild in einem Template abrufen willst, dann gibt es auch eine Smarty Anweisung dafür: MediaService

Den virutellen Pfad findest Du für jedes Bild in der Datenbank.

 

 

MFG

derwunner

Hallo @derwunner,​

danke für Deine Antwort.

Gibt es irgendeine „best practice“ um in einer simplen PHP-Datei (die separat außerhalb von Shopware angebunden wird und für eine Ajax-Response sorgt) Shopware einzubinden? Ist das irgendwie über ein include möglich?

Für WordPress geht das relativ einfach (siehe How to include WordPress functions in custom .php file? - Stack Overflow).

 

Nein gibt es nicht. Musst es über ein Plugin machen. Für solche Methoden hassen auch sehr Viele Entwickler Wordpress  Kiss.

Auch wenn Smarty Chaos ist, verhindert es dennoch noch größeres Chaos.

PHP Dateien, die Ajax Abfragen enthalten ist mega Chaos. Eine Modul Einbindung oder ähnliches wäre denkbar, dafür braucht die ominöse PHP Datei aber erstmal eine saubere Struktur.