# CMS Blöcke in TWIG Template nutzen?

**URL:** <https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865>\
**Category:** Programmierung\
**Created:** [17. Juni 2022 um 08:39 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865 "2022-06-17T08:39:53Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [17. Juni 2022 um 08:39 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/1 "2022-06-17T08:39:53Z")

</div>

Hallo,

ist es möglich, die vorgefertigten CMS-Blöcke (die man im Backend in den Erlebniswelten auswählen kann), auch direkt in einem TWIG Template zu nutzen?

Konkret würde ich gerne in meinem eigenen TWIG-Template für die „Homepage“ den _cms-block-product-slider.html.twig_ nutzen. Wenn ich den allerdings mit

```auto
{% sw_include "@Storefront/storefront/block/cms-block-product-slider.html.twig" %}

```

einfüge, passiert logischerweise gar nichts, denn es fehlen die Konfigurationen, die man per Erlebniswelt vornehmen kann (welche Produkte, usw).

Mein Ziel ist es, auf der „Homepage“ Produkte mit einem bestimmten Tag anzuzeigen. Per Erlebniswelt würde man das wahrscheinlich über die „Dynamische Produktgruppe“ lösen. Ich würde es aber gerne direkt in meinem Theme im TWIG Template verankern.

Vielen Dank bereits im Voraus.

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [17. Juni 2022 um 08:51 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/2 "2022-06-17T08:51:38Z")

</div>

Hallo @zlep,

du kannst die Templates wie gewohnt inkludieren. Wichtig ist hierbei, dass du dem Slider die entsprechenden Konfigurationen mit gibst, siehe dir als Beispiel das „Page/product-detail/Cross-Stellung/tabs.html.twig“ Template an.

Die gewünschten Produkte usw. könntest du ggf. über einen Subscriber zuweisen.

vg

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [17. Juni 2022 um 09:08 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/3 "2022-06-17T09:08:54Z")

</div>

@abdullah  
Super, vielen Dank. Das hilft schon mal ein Stück weiter.  
Ich würde das CMS Element im Template also wie folgt einfügen

```auto
                 {% sw_include "@Storefront/storefront/element/cms-element-product-slider.html.twig" with {
                     sliderConfig: config,
                     element: {
                         'data': {
                             'products': {
                                 elements: item.getProducts()
                             }
                         },
                         type: 'product-slider'
                     }
                 } %}

```

und in einem Subscriber (der auf ein Event hört, z.B. CmsPageLoaded) ganz einfach meine Produkte laden.  
Könntest du mir noch auf die Sprünge helfen, wie ich diese dann in die sliderConfig bekomme? Wahrscheinlich müssen sie in das „element“ Objekt, nehme ich an? Wie würde ich das im Subscriber genau bewerkstelligen?

Danke noch mal

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [17. Juni 2022 um 10:52 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/4 "2022-06-17T10:52:29Z")

</div>

@zlep, je nach Anwendungsfall würde ich den StorefrontRendererEvents verwenden. Hier kannst du das Event um Parameter erweitern, z. B. zlebProducts und kannst dann im Template mit zlebProducts auf den Parameter zugreifen. Wichtig wäre hier, dass deine Änderungen also das hinzufügen des Parameters nur bei bestimmten Views passiert, damit nicht auf jeder Seite der Code ausgeführt wird.

Statt item-\>getProducts() verwendest du dann zlebProducts z. B.

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [17. Juni 2022 um 12:42 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/5 "2022-06-17T12:42:50Z")

</div>

@abdullah  
Super, vielen Dank für deine Unterstützung. Wirklich super. 🙂

Das hier wäre wahrscheinlich genau das was ich suche?

> [@How to pass data to this storefront view page using events ?](https://forum.shopware.com/t/how-to-pass-data-to-this-storefront-view-page-using-events/64912/2):
>
> We can pass custom data to view the page by using StorefrontRenderEvent &nbsp; &nbsp; public static function getSubscribedEvents(): array &nbsp; &nbsp; { &nbsp; &nbsp; &nbsp; &nbsp; return [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StorefrontRenderEvent::class =\> ‘onStorefrontRender’ &nbsp; &nbsp; &nbsp; &nbsp;]; &nbsp; &nbsp; } &nbsp; &nbsp; public function onStorefrontRender(StorefrontRenderEvent $event) &nbsp; &nbsp; { &nbsp; &nbsp; &nbsp; &nbsp; $route = $event-\>getRequest()-\>get(’\_route’); &nbsp; &nbsp; &nbsp; &nbsp; if($route == ‘frontend.product.reviews’) &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$event-\>setParameter(‘testParam’, ‘testParamValue’); &nbsp; …

Als route dann _frontend.home_, wenn ich es nur auf der Homepage benötige, damit es nur dort ausgeführt wird, meinst du, oder?

Schönes WE.

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [17. Juni 2022 um 16:03 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/6 "2022-06-17T16:03:54Z")

</div>

@zlep , genau so oder so ähnlich.  
Wenn keine Einschränkung vorhanden ist, wird überall im Storefront dein Code ausgeführt, was zu Performance Einbußen und somit lange Ladezeiten führen kann.

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [18. Juni 2022 um 13:02 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/7 "2022-06-18T13:02:34Z")

</div>

@abdullah

Sorry, ich muss noch mal nachfragen. Ich habe nun Produkte in einem Parameter „test“ in einem „elements“ array:

 ![Bildschirmfoto 2022-06-18 um 14.56.23](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/3X/9/3/9304f0eaf0a0c2bceb71abad7bc67fef5c27d92e.png)

Leider ist mir nun immer noch nicht ganz klar, wie ich diese in meinem Twig Template in den Product Slider bekomme, sprich in diese Config:

```auto
     {% sw_include "@Storefront/storefront/element/cms-element-product-slider.html.twig" with {
         sliderConfig: config,
         element: {
             'data': {
                 'products': {
                     elements: item.getProducts()
                 }
             },
             type: 'product-slider'
         }
     } %}

```

Wäre wirklich super nett von dir, wenn du mir noch mal auf die Sprünge helfen könntest.  
Vielen Dank

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [18. Juni 2022 um 15:14 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/8 "2022-06-18T15:14:44Z")

</div>

Ah, ich denke, ich habe es. Hier mal meine Lösung. Vielleicht hilft es weiter.

_…/Subscriber/StorefrontRenderer.php_

```auto
class StorefrontRenderer implements EventSubscriberInterface
{
    private EntityRepositoryInterface $productRepository;

    public function __construct(EntityRepositoryInterface $productRepository)
    {
        $this->productRepository = $productRepository;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            StorefrontRenderEvent::class => "onStorefrontRender"
        ];
    }

    public function onStorefrontRender(StorefrontRenderEvent $event): void
    {

        $routeName = $event->getRequest()->attributes->get('_route');

        if ($routeName == "frontend.home.page") {

            $criteria = new Criteria();

            $criteria->addFilter(new EqualsFilter('name', 'Main product with properties '));
            $context = $event->getContext();
            $products = $this->productRepository->search($criteria, $context);
            
            $event->setParameter("test", $products);
        }

    }
}

```

In Twig dann ganz einfach:

```auto
{% sw_include "@Storefront/storefront/element/cms-element-product-slider.html.twig" with {
         sliderConfig: config,
         element: {
             'data': {
                 'products': {
                     elements: test
                 }
             },
             type: 'product-slider'
         }
     } %}

```

Was allerdings immer noch nicht passt, ist die Formatierung. Es werden einfach nur 5 Produkte nebeneinander angezeigt. Also nicht wirklich der Slider.

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [21. Juni 2022 um 16:49 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/9 "2022-06-21T16:49:28Z")

</div>

@zlep Versuch Mal Test nicht das EntitySearchResult zuzuweisen sondern die productcollection (getEntities()).

Ansonsten wie sieht denn deine config im Template aus?

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [2. Juli 2022 um 14:40 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/10 "2022-07-02T14:40:42Z")

</div>

@abdullah  
Sorry, bin erst jetzt dazu gekommen.  
Also, das Problem bleibt, dass auch wenn ich die ProductCollection zuweise, der Preis als auch das Artikelbild fehlen:

```auto
$products = $this->productRepository->search($criteria, $event->getContext())->getEntities();

```

In der ProductCollection ist nur das hier vorhanden:

```auto
Shopware\Core\Content\Product\ProductCollection {#7015 ▼
  #elements: array:5 [▼
    "06793e437ed4490a82d33223a36cf44f" => Shopware\Core\Content\Product\ProductEntity {#7021 ▼
      #parentId: "c7bca22753c84d08b6178a50052b4146"
      #childCount: null
      #autoIncrement: 16
      #taxId: "1a276c67ff9b4a48acb7851fab272842"
      #manufacturerId: "7f24e96676e944b0a0addc20d56728cb"
      #unitId: null
      #active: true
      #displayGroup: "af160339563fcd7ae2c9becf4cd95adb"
      #price: Shopware\Core\Framework\DataAbstractionLayer\Pricing\PriceCollection {#7025 ▶}
      #manufacturerNumber: null
      #ean: null
      #sales: 0
      #productNumber: "SWDEMO10007.4"
      #stock: 50
      #availableStock: 50
      #available: true
      #deliveryTimeId: null
      #deliveryTime: null
      #restockTime: null
      #isCloseout: false
      #purchaseSteps: 1
      #maxPurchase: null
      #minPurchase: 1
      #purchaseUnit: 1.0
      #referenceUnit: 1.0
      #shippingFree: true
      #purchasePrices: null
      #markAsTopseller: null
      #weight: null
      #width: null
      #height: null
      #length: null
      #releaseDate: DateTimeImmutable @1650533412 {#7024 ▶}
      #categoryTree: array:3 [▶]
      #streamIds: null
      #optionIds: array:1 [▶]
      #propertyIds: array:7 [▶]
      #name: null
      #keywords: null
      #description: null
      #metaDescription: null
      #metaTitle: null
      #packUnit: null
      #packUnitPlural: null
      #variantRestrictions: null
      #configuratorGroupConfig: null
      #mainVariantId: null
      #variation: []
      #tax: Shopware\Core\System\Tax\TaxEntity {#7033 ▶}
      #manufacturer: null
      #unit: null
      #prices: Shopware\Core\Content\Product\Aggregate\ProductPrice\ProductPriceCollection {#7023 ▶}
      #cheapestPrice: Shopware\Core\Content\Product\DataAbstractionLayer\CheapestPrice\CheapestPrice {#7216 ▶}
      #cover: null
      #parent: null
      #children: null
      #media: null
      #cmsPageId: null
      #cmsPage: null
      #slotConfig: null
      #searchKeywords: null
      #translations: null
      #categories: null
      #customFieldSets: null
      #tags: null
      #properties: null
      #options: null
      #configuratorSettings: null
      #categoriesRo: null
      #coverId: "683c3a0a0c26464fb65332d1a9adf7e2"
      #blacklistIds: null
      #whitelistIds: null
      #visibilities: null
      #tagIds: null
      #categoryIds: array:1 [▶]
      #productReviews: null
      #ratingAverage: null
      #mainCategories: null
      #seoUrls: null
      #orderLineItems: null
      #crossSellings: null
      #crossSellingAssignedProducts: null
      #featureSetId: null
      #featureSet: null
      #customFieldSetSelectionActive: null
      #customSearchKeywords: null
      #wishlists: null
      #canonicalProductId: null
      #canonicalProduct: null
      #cheapestPriceContainer: Shopware\Core\Content\Product\DataAbstractionLayer\CheapestPrice\CheapestPriceContainer {#7029 ▶}
      #streams: null
      #_uniqueIdentifier: "06793e437ed4490a82d33223a36cf44f"
      #versionId: "0fa91ce3e96a4bc2be4bd9ce752c3425"
      #translated: array:10 [▶]
      #createdAt: DateTimeImmutable @1650533421 {#7030 ▶}
      #updatedAt: DateTimeImmutable @1654328944 {#7031 ▶}
      -_entityName: "product"
      -_fieldVisibility: Shopware\Core\Framework\DataAbstractionLayer\FieldVisibility {#7018 ▶}
      #extensions: array:1 [▶]
      #id: "06793e437ed4490a82d33223a36cf44f"
      #customFields: []
    }
    "1a521184875f4eb2b1dace6ef903d852" => Shopware\Core\Content\Product\ProductEntity {#7163 ▶}
    "44a2bd78c9134014bebd2b326f2f2c18" => Shopware\Core\Content\Product\ProductEntity {#7178 ▶}
    "c7bca22753c84d08b6178a50052b4146" => Shopware\Core\Content\Product\ProductEntity {#7188 ▶}
    "cee29c2947d6400fb3319177d605bad8" => Shopware\Core\Content\Product\ProductEntity {#7198 ▶}
  ]
  #extensions: []
}

```

Für den Slider würde man aber noch `{% set cover = product.cover.media %}` für die _box-standard.html.twig_ sowie `{% set real = product.calculatedPrice %}` für die price-unit.html.twig benötigen.

Ganz davon abgesehen, verstehe ich aber sowieso nicht, wieso die ProductCollection kein Preis (calculatedPrice) und Bild (cover.media) mitliefert? Wo bekomme ich diese Infos denn her?

Danke noch mal

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [2. Juli 2022 um 19:19 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/11 "2022-07-02T19:19:02Z")

</div>

Eine Collection ist nichts anderes als ein Array von Entities. Da werden keine Properties hinzugefügt oder entfernt.

Shopware Nutzt coverId um an das Cover zu gelangen.

Wenn dir etwas fehlt, dann musst du es mit $criteria-\>addAssociation(…) hinzufügen.

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [3. Juli 2022 um 10:30 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/12 "2022-07-03T10:30:25Z")

</div>

@zlep wie bereits @Max_Shop erwähnt hat, musst du die gewünschten Associations deinem Criteria hinzufügen. In Shopware werden die Associations standardmäßig nicht mit geladen.

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [3. Juli 2022 um 11:58 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/13 "2022-07-03T11:58:14Z")

</div>

@Max_Shop , @abdullah

Danke euch.  
Das Cover-Bild konnte ich mit `$criteria->addAssociation('cover');` nun mitgeben. Preise haben allerdings leider nicht funktioniert. War mir nicht ganz klar, wie ich den calculatedPrice mitgeben kann. Den gibt es nämlich nicht in `Shopware\Core\Content\Product\ProductDefinition` oder übersehe ich etwas?

Bin nun aber einen (ganz) anderen Weg gegangen. Und zwar ist im `sales_channel.product.repository` (anstatt dem normalen `product.repository`) schon alles mit dabei, was man benötigt. Siehe `Shopware\Core\Content\Product\SalesChannel\SalesChannelProductDefinition`.

Wichtig ist nur, dass das das `SalesChannelRepositoryInterface` (anstatt dem `EntityRepositoryInterface`) benötigt sowie aus dem Event den `$event->getSalesChannelContext()`.

Nun scheint tatsächlich alles zu funktionieren.  
Danke euch noch mal für eure Unterstützung.

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [4. Juli 2022 um 15:25 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/14 "2022-07-04T15:25:15Z")

</div>

Hm, ein bisschen eine Never-Ending-Story. Ein weiteres Problem ist aufgetaucht, und zwar, dass die Produkte manchmal angezeigt werden und manchmal nicht. Ich habe die Vermutung, dass es irgendwie mit dem Cache zu tun haben könnte bzw., dass die Search-Query zu lange dauert und die Seite bis dahin schon geladen wurde.

Mir fehlt gerade ein bisschen der Ansatz, das Problem zu lösen. Jemand noch eine Idee?

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [4. Juli 2022 um 15:28 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/15 "2022-07-04T15:28:16Z")

</div>

Es gibt ein CachedSalesChannelRepoitory. Versuche es mal damit (könnte ggf. leicht anders heißen).

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [4. Juli 2022 um 16:14 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/16 "2022-07-04T16:14:13Z")

</div>

@Max_Shop Klingt gut, leider kann ich den nicht finden:

 ![Bildschirmfoto 2022-07-04 um 18.12.41](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/3X/b/9/b9acf25b0ae8413e67d82edfa98703a6311668f0.png)

Könntest du noch mal schauen, wie der genau heißen könnte bzw. wo ich den finde?  
Thx

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [4. Juli 2022 um 18:21 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/18 "2022-07-04T18:21:25Z")

</div>

@zlep, der PHP Teil sollte noch vor dem Rendern der Seite zu einem Ergebnis kommen, daher denke ich nicht, dass die Search-Query zu lange braucht.  
Hast du mal versucht die Daten zu loggen (PHP-seitig und ggf. mit einem dump im Template)?

Ich denke nicht, dass Cache das Problem verursacht, wenn du den SalesChannelRepository verwendest. Meiner Meinung nach sollte das Problem wo anders liegen.

Zum Laden von (List)Produkten verwende ich die ProductListRoute, die macht nichts anderes als ein SalesChannelRepository zu benutzen.  
Wenn du die Produkte einer bestimnten Kategorie laden möchtest und die Kategorie kennst, kannst du auch die (Cached)ProductListingRoute verwenden.

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [5. Juli 2022 um 07:24 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/19 "2022-07-05T07:24:11Z")

</div>

@abdullah  
Ich lade Produkte mit einem bestimmten Tag:

```auto
 $criteria->addAssociation('tags');
 $criteria->addFilter(new EqualsFilter('tags.name', "meinTag"));

```

In der Produktionsumgebung werden die nicht zuverlässig geladen.  
Der Filter per Name funktioniert hingegen problemlos:

```auto
$criteria->addFilter(new EqualsFilter('name', 'Produktname'));

```

Kann das tatsächlich mit den Tags zu tun haben?

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [6. Juli 2022 um 00:04 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/20 "2022-07-06T00:04:41Z")

</div>

@zlep  
ich bin mir nicht mehr sicher, aber ich glaube ich hatte früher mal auch Probleme beim Vergleich vom Tag Namen.  
Ich habe dann die Tag-ID verwendet. Bei der Verwendung der Tag-ID hatte ich dann keine Probleme mehr.

---

<div class="post-metadata">

**Author:** ![zlep](https://avatars.discourse-cdn.com/v4/letter/z/9de0a6/32.png) [@zlep](https://forum.shopware.com/u/zlep)\
**Post date:** [6. Juli 2022 um 08:35 UTC](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865/21 "2022-07-06T08:35:14Z")

</div>

@abdullah  
Du scheinst recht zu haben. Ich verwende nun die TagId und damit scheint es zu funktionieren.

Hier mal meine Lösung. Bin mir noch nicht ganz sicher, ob das wirklich am besten so gelöst ist:

Als Service benötigt man noch das tag.repository

```auto
<argument type="service" id="tag.repository"/>

```

Danach hole ich die TagId anhand des Tag Namen:

```auto
$tagName = new Criteria();
$tagName->addFilter(new EqualsFilter('tag.name', 'meinTag'));
$tagId = $this->tagRepository->searchIds($tagName, $event->getContext())->firstId();

```

Anhand der TagId hole ich letztlich die Produkte:

```auto
$criteria = new Criteria();
$criteria->addAssociation('tagIds');
$criteria->addFilter(new EqualsFilter('tagIds', $tagId));

$products = $this->salesChannelRepository->search($criteria, $event->getSalesChannelContext())->getEntities();

```

[Nächste Seite](https://forum.shopware.com/t/cms-bloecke-in-twig-template-nutzen/94865.md?page=2)
