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.
<?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:
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.