# Frage zu ListProductService dekorieren

**URL:** https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673
**Category:** Programmierung
**Created:** [11. Mai 2016 um 10:23 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673 "2016-05-11T10:23:06Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![mtruebenbach](https://avatars.discourse-cdn.com/v4/letter/m/d9b06d/32.png) [@mtruebenbach](https://forum.shopware.com/u/mtruebenbach)
#### Post date: [11. Mai 2016 um 10:23 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/1 "2016-05-11T10:23:06Z")

</div>

Ich habe mit folgendem Script den ListProductService um weitere Bilder dekoriert. Das funktioniert auch soweit. Es existieren Objekte mit weiteren Bilddaten.

Nun habe ich Verständnisprobleme wie ich in meinem Smarty Template darauf zugreife. Kann mir jemand ein konkretes Beispiel geben?

\<?php   
 namespace ShopwarePlugins\AmbicoAddDataToProduct\StoreFrontBundle; use Shopware\Bundle\StoreFrontBundle\Service\ListProductServiceInterface; use Shopware\Bundle\StoreFrontBundle\Service\MediaServiceInterface; use Shopware\Bundle\StoreFrontBundle\Struct; class ListProductService implements ListProductServiceInterface { &nbsp; &nbsp; private $service; &nbsp; &nbsp; private $mediaService; &nbsp; &nbsp; function \_\_construct(ListProductServiceInterface $service, MediaServiceInterface $mediaService) { &nbsp; &nbsp; &nbsp; &nbsp; $this-\\>service = $service; &nbsp; &nbsp; &nbsp; &nbsp; $this-\\>mediaService = $mediaService; &nbsp; &nbsp; } &nbsp; &nbsp; public function getList(array $numbers, Struct\ProductContextInterface $context) { &nbsp; &nbsp; &nbsp; &nbsp; $products = $this-\\>service-\\>getList($numbers, $context); &nbsp; &nbsp; &nbsp; &nbsp; $media = $this-\\>mediaService-\\>getProductsMedia($products, $context); &nbsp; &nbsp; &nbsp; &nbsp; foreach($numbers as $number) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $product = $products[$number]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(isset($media[$number])) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $attribute = new Struct\Attribute(['images' =\\> $media[$number]]); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $product-\\>addAttribute('moreimages', $attribute); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $products[$number] = $product; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; return $products; &nbsp; &nbsp; } &nbsp; &nbsp; public function get($number, Struct\ProductContextInterface $context) { &nbsp; &nbsp; &nbsp; &nbsp; $products = $this-\\>getList([$number], $context); &nbsp; &nbsp; &nbsp; &nbsp; return array\_shift($products); &nbsp; &nbsp; } } &nbsp; In meinem Smarty Template sehe ich mit folgendem Script das Objekte weiterer Bilder existieren. Möchte ich jedoch auf ein Feld zugreifen kommt folgende Fehlermeldung&nbsp; Cannot use object of type Shopware\Bundle\StoreFrontBundle\Struct\Attribute as array in ... &nbsp; {if $sArticle.attributes.moreimages} {$ambicomoreimages = $sArticle.attributes.moreimages} {$moreimages=$ambicomoreimages-\\>get('images')} {foreach $moreimages as $image} {$image|@var\_dump} {/foreach} {/if} &nbsp; &nbsp; &nbsp;

---

<div class="post-metadata">

### Author: ![steinsoftware](https://avatars.discourse-cdn.com/v4/letter/s/b487fb/32.png) [@steinsoftware](https://forum.shopware.com/u/steinsoftware)
#### Post date: [11. Mai 2016 um 11:30 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/2 "2016-05-11T11:30:15Z")

</div>

An die Template-Engine wird ein Objekt übergeben. Die kommt an der Stelle jedoch nur mit einem Array klar. Es gibt in Shopware einen StructConverter den kannst du nutzen.

---

<div class="post-metadata">

### Author: ![mtruebenbach](https://avatars.discourse-cdn.com/v4/letter/m/d9b06d/32.png) [@mtruebenbach](https://forum.shopware.com/u/mtruebenbach)
#### Post date: [12. Mai 2016 um 07:17 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/3 "2016-05-12T07:17:14Z")

</div>

Hi,

muss das Thema nochmal aufrollen.

Ich komme hier nicht ganz klar damit. Ich habe das wie folgt proboert:

&nbsp;

```
 $attribute = new Struct\Attribute(['images' =\> $media[$number]]); $convattribute = $this-\>legacyStructConverter-\>convertMediaStruct( $attribute ); $product-\>addAttribute('moreimages', $convattribute);

```

Kann mir bitte jemand nochmal Support&nbsp;&nbsp;geben?

Danke!

```
 &nbsp;
```

---

<div class="post-metadata">

### Author: ![pixelecho](https://avatars.discourse-cdn.com/v4/letter/p/4af34b/32.png) [@pixelecho](https://forum.shopware.com/u/pixelecho)
#### Post date: [19. Juli 2016 um 18:07 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/4 "2016-07-19T18:07:43Z")

</div>

Hat für den&nbsp;

legacyStructConverter jemand eine lösung? Ich komme an dieser stelle auch nicht weiter Der Aufbau des Converters wie mtruebenbach aufgeführt hat müsste doch korrekt sein. So jedenfalls ist er auch in sArticles hinterlegt.

---

<div class="post-metadata">

### Author: ![pixelecho](https://avatars.discourse-cdn.com/v4/letter/p/4af34b/32.png) [@pixelecho](https://forum.shopware.com/u/pixelecho)
#### Post date: [20. Juli 2016 um 06:40 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/5 "2016-07-20T06:40:14Z")

</div>

Ich konnte mein Problem lösen. Das ganze hat ohne den legacy struct converter geklappt. Mein Problem lag beim zugriff auf die Variable aus dem Template heraus. in der getList des eigenen&nbsp;ListProductServiceInterface muss man ganz normal wie bereits oben beschrieben folgendes aufrufen:

```
$attribute = new Struct\Attribute(['images' => $media[$number]]);
$product->addAttribute('peaddon', $attribute);

```

Danach kann man im Template über folgenden Befehl darauf zugreifen;

```
{$peAddon = $sArticle.attributes.peaddon}
{$peAddon->get('images')|var_dump}

```

&nbsp;

---

<div class="post-metadata">

### Author: ![viertypen](https://avatars.discourse-cdn.com/v4/letter/v/a4c791/32.png) [@viertypen](https://forum.shopware.com/u/viertypen)
#### Post date: [9. September 2016 um 12:02 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/6 "2016-09-09T12:02:56Z")

</div>

Da ich jetzt auch vor dem gleichen Problem stand, habe ich nun das gefunden, was ihr glaube ich gesucht habt. Es ist aus meiner Sicht nicht ganz sauber gelöst in Smarty das ‘get’ zu benutzen. Man könnte stattdessen toArray benutzen. So wird nicht das Struct-Object in Smarty übergeben, sondern direkt der Inhalt dessen.

```
$attribute = new Struct\Attribute(['images' => $media[$number]]);
$product->addAttribute('peaddon', $attribute->toArray());

```

&nbsp;

---

<div class="post-metadata">

### Author: ![designhunger](https://avatars.discourse-cdn.com/v4/letter/d/e47c2d/32.png) [@designhunger](https://forum.shopware.com/u/designhunger)
#### Post date: [21. November 2016 um 15:43 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/7 "2016-11-21T15:43:32Z")

</div>

Nun stand ich vor der gleichen Herausforderung und habe mal den legacyStructConverter eingesetzt.

```
public function getList(array $numbers, Struct\ProductContextInterface $context)
{
    $products = $this->service->getList($numbers, $context);
    $media = $this->mediaService->getProductsMedia($products, $context);

    /**@var $product Struct\ListProduct */
    foreach ($numbers as $number) {
        $product = $products[$number];

        if (isset($media[$number])) {

            foreach ($media[$number] as $key => $image) {
                $image_array[$key] = Shopware()->Container()->get('legacy_struct_converter')->convertMediaStruct(
                    $image
                );
            }

            $attribute = new Struct\Attribute(['images' => $image_array]);
            $product->addAttribute('images', $attribute);
        }
    }

    return $products;
}

```

In der View kann dann wie folgt zugegriffen werden:

```
{if $sArticle.attributes.images}
    {$images = $sArticle.attributes.images->get('images')}

    {foreach $images as $image}
        
    {/foreach}
{/if}

```

&nbsp;

---

<div class="post-metadata">

### Author: ![designhunger](https://avatars.discourse-cdn.com/v4/letter/d/e47c2d/32.png) [@designhunger](https://forum.shopware.com/u/designhunger)
#### Post date: [24. November 2016 um 12:37 UTC](https://forum.shopware.com/t/frage-zu-listproductservice-dekorieren/36673/8 "2016-11-24T12:37:12Z")

</div>

Eine kleine Ergänzung noch dazu. Das&nbsp;$image\_array muss vor der foreach Schleife immer wieder resettet werden, da ansonsten die Bilder vorhergehender Produkte auch noch beigemischt werden. Folgende getList Funktion macht also mehr Sinn.

```
public function getList(array $numbers, Struct\ProductContextInterface $context)
{
    $products = $this->service->getList($numbers, $context);
    $media = $this->mediaService->getProductsMedia($products, $context);

    /**@var $product Struct\ListProduct */
    foreach ($numbers as $number) {
        $product = $products[$number];

        if (isset($media[$number])) {

            $image_array = null;

            foreach ($media[$number] as $key => $image) {
                $image_array[$key] = Shopware()->Container()->get('legacy_struct_converter')->convertMediaStruct(
                    $image
                );
            }

            $attribute = new Struct\Attribute(['images' => $image_array]);
            $product->addAttribute('images', $attribute);
        }
    }

    return $products;
}

```

&nbsp;
