Media path in shopware 6, Bilder-Pfad anhand des Dateinamen in twig ermitteln

Hallo,
ich muss in twig auf Bilder zugreifen, wobei nur der Dateiname bekannt ist. In Shopware 5 und smarty ging das so:

<img src="{media path="media/image/{$aRating[0]}-logo.png"}">

Wie kann man das mit twig lösen?

Die Bilder sollen ganz normal im Backend hochgeladen werden.

Danke
Stephan

Wenn ich die in meinem Theme hinterlege ist das schon klar. Und auch, wenn ich die Media-Id schon habe. Ich möchte aber in twig nach dem Dateinamen suchen. Wie in Shopware 5.

Ungefähr so als Twig Extension:

./custom/plugins/deinePlugin/src/Twig

<?php declare(strict_types=1);

namespace deinPlugin\Twig;

use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Context;
use Shopware\Core\Content\Media\MediaEntity;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class MediaByFileNameExtension extends AbstractExtension
{
    private EntityRepository $mediaRepository;

    public function __construct(EntityRepository $mediaRepository)
    {
        $this->mediaRepository = $mediaRepository;
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('getMediaByFileName', [$this, 'getMediaByFileName']),
        ];
    }

    /**
     * Gibt die vollständige URL eines Bildes anhand des Dateinamens zurück.
     * Achtung: Der Dateiname ist ohne Erweiterung, z. B. "logo" statt "logo.png"
     */
    public function getMediaByFileName(string $fileName): ?string
    {
        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('fileName', $fileName));
        $criteria->addAssociation('mediaFolder');

        $context = Context::createDefaultContext();
        $media = $this->mediaRepository->search($criteria, $context)->first();

        if ($media instanceof MediaEntity) {
            return $media->getUrl(); // Gibt den Pfad zurück, z. B. /media/xyz/logo.png
        }

        return null;
    }
}

Im template dann:

{% set logoUrl = getMediaByFileName('logo') %}
{% if logoUrl %}
    <img src="{{ logoUrl }}" alt="Logo">
{% endif %}

In ./custom/plugins/deinePlugin/src/Resources/config/services.xml:

<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services
           http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
      <service id="deinPlugin\Twig\MediaByFileNameExtension" public="false">
    <tag name="twig.extension"/>
    <argument type="service" id="media.repository"/>
</service>
    </services>
</container>

Ist eine mischung von einer lösung von mir und chagpt, also testen und lernen :smiley:

Super, danke, hat prima geklappt!

Du triggerst damit jedes Mal eine Datenbankanfrage. Solltest du das x Mal quer über dein Template machen, ggf. auch in Schleife, dann kann das negative Auswirkungen auf die Performance haben.

Die Lösung ist zwar bequem, aber mit Vorsicht zu genießen.

1 „Gefällt mir“

Oh, ja. Aber wird das nicht gecached?
Optimal ist hier meine gesamte Umsetzung nicht. Jetzt brauche ich erst mal quick&dirty.

Solange keine Produkte im Warenkorb sind oder der Kunde eingeloggt ist, ja. Shopware Standard Konfiguration unterstellt.

Wird nur jeweils 1 mal in der Detailansicht benötigt. Denke das sollte dann wohl kein großes Problem sein.