Produkteigenschaften in Liste ausgeben

Hallo zusammen,

ich bin leider schier am verzweifeln. Ich möchte mir gerne bestimmte Eigenschaften eines Produkts bereits in der Listenansicht anzeigen lassen. Ich habe bereits in den Templates geschaut und ich kann mir irgendwie eigentlich alles ausgeben lassen, außer die Eigenschaften… selbst wenn ich 1:1 den gleichen Code verwende, wie er in der Detailansicht verwendet wird, wird mir nichts ausgegeben. Habs auch schon mit {{ dump() }} versucht, aber da ist leider auch nichts brauchbares dabei…

Ich danke bereits für eure Antworten.

das hat damit zu tun, dass das Datenobject „product“ im Listing nicht mit den von Dir gewünschten Daten angereichert ist. Insofern kann Dein twig (z.B. box-standard.html.twig) auch keine Eigenschaften darstellen. Entweder es gibt hierzu bereits Plugins, oder, Du musst Dir etwas passendes bauen - was auch nicht wirklich aufwändig ist. Zu beachten wäre hier nur, dass es grds. nicht nur Einzelprodukte geben kann, sondern auch solche, die Variationen mit abweichenden Eigenschaften enthalten

Danke erstmal, soweit bin ich mittlerweile auch schon. Ich hab auch prinzipell was passendes gefunden/geschrieben, allerdings funktioniert das unter v6.4 nicht mehr…

Ich hab ein Subscriber erstellt mit folgendem Inhalt:

public function onProductLoaded(EntityLoadedEvent $event): void
    {
        if ( !($event->getContext()->getSource() instanceof \Shopware\Core\Framework\Api\Context\SalesChannelApiSource) ) {
        return;
    }

        foreach ($event->getEntities() as $productEntity) {
        /** @var SalesChannelProductEntity $productEntity */
        $properties = $productEntity->getProperties();
        $grouped = $properties->groupByPropertyGroups();
        $grouped->sortByPositions();
        $grouped->sortByConfig();
        $productEntity->setSortedProperties( $grouped );
        }
    }

Nur habe ich mittlerweile herausgefunden, dass groupByPropertyGroups() nur bis v6.3 funktionert. Aber für 6.4 muss es doch dafür eine Alternative geben?

alos ich persönlich bevorzuge das „ProductListingResultEvent“. Dort gibt es auch die IDs der PropertyGroups mit denen Du jeweils neue Criteria erstellen kannst. Je nach Bedarf könntest Du dort zusätzliche Filter und Association einbauen.

Könntest du das vielleicht etwas genauer erklären? Ich kenn mich mit dieser ganzen Sache noch nicht so gut aus…

Ich funke mal kurz dazwischen, weil ich ein ähnliches Problem habe und ihr mir vielleicht weiterhelfen könnt.

Wir nutzen das Themeware Theme Strong und dort werden bei den Variantenartikeln die Eigenschaft „Farbe“ als farbige Kästchen angezeigt. Bei vielen Farben steht dann aber nur die Farbe in Testform („apricot“ da, weil die anscheinend noch nicht definiert ist. Wisst ihr wo man das einstellen kann bzw. ob es eine shopware oder themeware Einstellung ist?
Alternativ wäre eine Listenansicht mit ausschließlicher Textauswahl zu den Farben natürlich auch besser als das gegenwärtige Durcheinander.

Grüße aus Freiburg,

Eike

Antwort/ Lösungsansansatz hatte ich Dir in Deinen anderen Post geschrieben.

1 „Gefällt mir“

danke dir. Ich antworte im anderen Post.

dass genauer zu erklären wäre ziemlich umfangreich. Grundsätzlich ist der Subscriber der richtige Platz. Dort holst Du die einzelnen Entities. Aus diesen brauchst Du die PropertyCollection in der sich die GroupIds befinden. Die Groups kannst Du dann über das Repo abfragen. Oder aber, Du nimmst aus der resultList die prdouctID und fragst das Produkt erweitert ab. Z.B. (nur mal schnell zusammen geschrieben):

            $productCriteria->addFilter(
                new EqualsFilter('id', $productToShowId)
            );

       /** @var ProductCollection $productList */
        $productList = $this->productsRepository->search(
            $productCriteria
            ->addAssociation('properties')
            ->addAssociation('properties.group'),
            Context::createDefaultContext())->getEntities();
        /** @var ProductEntity $productItem */
        foreach($productList AS $productItem){
            $productStock = $productItem->getStock();
            /** @var PropertyGroupOptionCollection $itemProps */
            $itemProps = $productItem->getProperties();
            /** @var PropertyGroupOptionEntity $itemPropsEntity */
            foreach($itemProps AS $itemPropsEntity){
                #var_dump($itemPropsEntity);
                /** @var PropertyGroupEntity $itemPropyGroupEnity */
                $itemPropyGroupEnity    = $itemPropsEntity->getGroup();
                $itemPropValue          = $itemPropsEntity->getName();
                $itemPropyGroupName     = $itemPropyGroupEnity->getName();
                #echo $itemPropValue;

                if(!isset($stocksCollect[$itemPropyGroupName])){
                    $stocksCollect[$itemPropyGroupName] = array();
                }
                if(!isset($stocksCollect[$itemPropyGroupName][$itemPropValue])){
                    $stocksCollect[$itemPropyGroupName][$itemPropValue] = 0;
                }
                $stocksCollect[$itemPropyGroupName][$itemPropValue] += $productStock;
            }
        }

Am Ende musst Du Dein Listenproduct mit assign um die zusätzlichen Infos erweitern

Auch ich möchte hier kurz dazwischen gehen…

Ich habe eine Schnittstelle geschreiben, welche in der Lage „war“ Artikel inkl. Varianten und deren passenden Eigenschaften, mittels Rest API in Shopware anlegen konnte.

Seit dem letzten Update werden die Varianten Eigenschaften im Backend sicherlich korrekt angelegt, jedoch werden diese Varianten im Frontend nicht „mehr“ angezeigt.

Wenn ich nun hingehe und ein Dummy-Artikel, mit bereits bestehenden Eigenschaften anlegen möchte erhalte ich einen Translator Error.

Da ich leider nicht mehr weiter weiss, erhoffe ich mir von euch etwas Support zu erhalten.

Json POST Aufruf aus Postman heraus:

{{URL}}/product

JSON

{
	"productNumber": "Dummy_1",
	"name": "Dummy 1",
	"active": true,
	"taxId": "39b15312563944d5996a2c014ba04add",
	"cmsPageId": "bd0c841733c542bcb24af8bbf8f84b10",
	"price": [
		{
			"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
			"net": 211,
			"gross": 227.25,
			"linked": false,
			"listPrice": {
				"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
				"net": 0,
				"gross": 0,
				"linked": false,
				"listPrice": null
			}
		}
	],
	"stock": 10,
	"createdAt": "24.11.2021 15:52:42",
	"description": "Hiho 1",
	"manufacturerId": "39272bbad63543baac07c6794d9ebcbb",
	"restockTime": 0,
	"metaDescription": "",
	"metaTitle": "",
	"markAsTopseller": false,
	"deliveryTimeId": "611bac8a596843348ae029e8d64a9c96",
	"properties": [
		{
			"group": {
				"id": "44260f41d8d546cbad0976adfb9dd44e"
			}
		}
	],
	"categories": [
		{
			"id": "0a68989f621f4fe6b3785c1c84cf2307",
			"name": "Functional Training",
			"type": "page"
		},
		{
			"id": "c009d04109534c2584fd9ccd36433f09",
			"name": "Freie Gewichte",
			"type": "page"
		}
	],
	"media": [
		{
			"mediaId": "87be769a60ab4eebae075494d38178bd",
			"linked": false
		},
		{
			"mediaId": "94a05bf8916c463fb314f1788b681275",
			"linked": false
		}
	],
	"cover": {
		"mediaId": "87be769a60ab4eebae075494d38178bd",
		"position": 1
	}
}

Error

{
    "errors": [
        {
            "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3",
            "status": "400",
            "detail": "Dieser Wert sollte nicht leer sein.",
            "template": "This value should not be blank.",
            "meta": {
                "parameters": {
                    "{{ value }}": "null"
                }
            },
            "source": {
                "pointer": "/0/properties/0/option/translations/2fbb5fe2e29a4d70aa5854ce7ce3e20b/name"
            }
        }
    ]
}

erweitere mal Dein API-Object eine Translated-Object innerhalb des properties-Array. Offensichtlich hat SW keine Sprachdaten zu der Eigenschaft angelegt.

quick’ndirty sollte das so etwa klappen

	"properties": [
		{
			"group": {
				"id": "44260f41d8d546cbad0976adfb9dd44e"
			},
			"translated" :{
                        "en-GB":{
                            "name": 'Name in English'
                        },
                        "de-DE":{
                            'name'              => "Name in Deutsch"
                        ),
			}
		}
	],

Weshalb muss hier der name mitgegeben werden, wenn ich doch die eindeutige id als Verknüpfung mit gebe?

Ist die Tabelle „property_group_option_translation“ bei Dir gefüllt? Und, Deine Fehlermedlung sagt, dass keine Translation zu der option gefunden wurde. Entweder nicht vorhanden oder irgendwas ist bei den ID#s quer gelaufen, sodass die Zuordnung nicht passt

Das muss ich prüfen.
Wie kann diese property_group_option_translation über das Backend von Shopware eingesehen werden?

nicht in der Form, die für Dich hilfreich wäre. Für Dich wäre es, da Du ja schon ein Beispiel hast, wichtig zu prüfen, ob es zu der Gruppe ( ```
„id“: „44260f41d8d546cbad0976adfb9dd44e“

Ich habe nun nicht die Translation, sondern der Name zu der Eigenschaft mit übergeben.
Nun kann ich das Produkt wieder synchronisieren.

Das komplette Json mit einem Dummy Artikel

{
	"productNumber": "DUMMY1",
	"name": "Escape Core Momentum Trainer 1",
	"active": true,
	"taxId": "39b15312563944d5996a2c014ba04add",
	"cmsPageId": "bd0c841733c542bcb24af8bbf8f84b10",
	"price": [
		{
			"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
			"net": 211,
			"gross": 227.25,
			"linked": false,
			"listPrice": {
				"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
				"net": 0,
				"gross": 0,
				"linked": false,
				"listPrice": null
			}
		}
	],
	"stock": 0,
	"createdAt": "25.11.2021 16:52:17",
	"description": "",
	"manufacturerId": "39272bbad63543baac07c6794d9ebcbb",
	"restockTime": 0,
	"metaDescription": "",
	"metaTitle": "",
	"markAsTopseller": false,
	"deliveryTimeId": "611bac8a596843348ae029e8d64a9c96",
	"properties": [
		{
			"id": "6767307b8c694e0db8e8d81782b5576b",
			"name": "1 Kg",
			"group": {
				"id": "44260f41d8d546cbad0976adfb9dd44e",
				"name": "Gewicht"
			}
		}
	],
	"categories": [
		{
			"id": "0a68989f621f4fe6b3785c1c84cf2307",
			"name": "Functional Training",
			"type": "page"
		},
		{
			"id": "c009d04109534c2584fd9ccd36433f09",
			"name": "Freie Gewichte",
			"type": "page"
		}
	],
	"children": [
		{
			"parentId": "11560c5c093e4737bf61396e2358436f",
			"name": "Escape Core Momentum Trainer 1",
			"taxId": "39b15312563944d5996a2c014ba04add",
			"description": "Mein Dummy Artikel 1",
			"restockTime": 0,
			"stock": 0,
			"cmsPageId": "bd0c841733c542bcb24af8bbf8f84b10",
			"deliveryTimeId": "611bac8a596843348ae029e8d64a9c96",
			"price": [
				{
					"net": 211,
					"gross": 227.25,
					"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
					"linked": false,
					"listPrice": {
						"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
						"net": 0,
						"gross": 0,
						"linked": false,
						"listPrice": null
					}
				}
			],
			"manufacturerId": "39272bbad63543baac07c6794d9ebcbb",
			"metaDescription": "",
			"metaTitle": "",
			"productNumber": "ECMOM.DUMMY1",
			"properties": [
				{
					"id": "815cf6e907f94fe9af2d4daad787a9ae",
					"name": "1 Kg",
					"group": {
						"id": "44260f41d8d546cbad0976adfb9dd44e",
						"name": "Gewicht"
					}
				}
			],
			"options": [
				{
					"id": "6767307b8c694e0db8e8d81782b5576b",
					"group": {
						"id": "44260f41d8d546cbad0976adfb9dd44e"
					}
				}
			],
			"media": [
				{
					"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
					"linked": false
				},
				{
					"mediaId": "f0739dbada6f46409c7918824b861cb5",
					"linked": false
				},
				{
					"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
					"linked": false
				}
			]
		},
		{
			"parentId": "11560c5c093e4737bf61396e2358436f",
			"name": "Escape Core Momentum Trainer 2",
			"taxId": "39b15312563944d5996a2c014ba04add",
			"description": "Mein Dummy Artikel 2",
			"restockTime": 0,
			"stock": 0,
			"cmsPageId": "bd0c841733c542bcb24af8bbf8f84b10",
			"deliveryTimeId": "611bac8a596843348ae029e8d64a9c96",
			"price": [
				{
					"net": 226.5,
					"gross": 243.95,
					"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
					"linked": false,
					"listPrice": {
						"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
						"net": 0,
						"gross": 0,
						"linked": false,
						"listPrice": null
					}
				}
			],
			"manufacturerId": "39272bbad63543baac07c6794d9ebcbb",
			"metaDescription": "",
			"metaTitle": "",
			"productNumber": "ECMOM.DUMMY.2",
			"properties": [
				{
					"id": "5225662532a44d5586f5e27b2c3d1e12",
					"name": "2 Kg",
					"group": {
						"id": "44260f41d8d546cbad0976adfb9dd44e",
						"name": "Gewicht"
					}
				}
			],
			"options": [
				{
					"id": "5225662532a44d5586f5e27b2c3d1e12",
					"group": {
						"id": "44260f41d8d546cbad0976adfb9dd44e"
					}
				}
			],
			"media": [
				{
					"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
					"linked": false
				},
				{
					"mediaId": "f0739dbada6f46409c7918824b861cb5",
					"linked": false
				},
				{
					"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
					"linked": false
				}
			]
		},
		{
			"parentId": "11560c5c093e4737bf61396e2358436f",
			"name": "Escape Core Momentum Trainer 3",
			"taxId": "39b15312563944d5996a2c014ba04add",
			"description": "Mein Dummy Artikel 3",
			"restockTime": 0,
			"stock": 0,
			"cmsPageId": "bd0c841733c542bcb24af8bbf8f84b10",
			"deliveryTimeId": "611bac8a596843348ae029e8d64a9c96",
			"price": [
				{
					"net": 262.2,
					"gross": 282.4,
					"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
					"linked": false,
					"listPrice": {
						"currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",
						"net": 0,
						"gross": 0,
						"linked": false,
						"listPrice": null
					}
				}
			],
			"manufacturerId": "39272bbad63543baac07c6794d9ebcbb",
			"metaDescription": "",
			"metaTitle": "",
			"productNumber": "ECMOM.DUMMY.3",
			"properties": [
				{
					"id": "6767307b8c694e0db8e8d81782b5576b",
					"name": "4 Kg",
					"group": {
						"id": "44260f41d8d546cbad0976adfb9dd44e",
						"name": "Gewicht"
					}
				}
			],
			"options": [
				{
					"id": "815cf6e907f94fe9af2d4daad787a9ae",
					"group": {
						"id": "44260f41d8d546cbad0976adfb9dd44e"
					}
				}
			],
			"media": [
				{
					"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
					"linked": false
				},
				{
					"mediaId": "f0739dbada6f46409c7918824b861cb5",
					"linked": false
				},
				{
					"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
					"linked": false
				}
			]
		}
	],
	"media": [
		{
			"mediaId": "f0739dbada6f46409c7918824b861cb5",
			"linked": false
		},
		{
			"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
			"linked": false
		},
		{
			"mediaId": "60426ff7c8fb4775b0844aabd127ae14",
			"linked": false
		}
	],
	"cover": {
		"mediaId": "f0739dbada6f46409c7918824b861cb5",
		"position": 1
	}
}

Mit dem oben eingefügten Json bin ich nun in der Lage, einen Artikel mit drei Variantenartikeln anzulegen. Im Backend wird nun alles korrekt angelegt und wird auch als regulärer Artikel mit Varianten dargestellt. Auch die navigation im Backend, ist in meinem angelegten Dummy Artikel genau gleich bedienbar wie in einem Artikel, welcher im Backend selbst angelegt und mit Varianten versehen wurde.
nach dem Anlegen des Artikel-Bundels, setze ich noch die Sichtbarkeit des Produkts.

Im Frontend kann ich nun den Hauptartikel auswählen und öffnen. Wurde der Artikel geöffnet, werden KEINE Varianten möglichkeiten angezeigt (1 Kg / 2Kg / 4 Kg).
Wie bereits erwähnt, dies funktionierte in der Version 6.3.5.2 ausgezeichnet. In der jetzigen Version 6.4.4.1 geht das nicht mehr.

Ich habe mittels Postman bereits alle Rest API Json Requests, von manuell und automatisch abgeglichenen und kann keine unterschiede Feststellen.

PS: Die „property_group_option_translation“ ist bei mir gefüllt.

Hast Du mal den Cache refreshed und/oder den index neu erstellen lassen?

Ja mehrfach.

Anmerkung:
Das hinzufügen der Propertie Arrays (unten aufgeführt), führt dazu, das ein neues Propertie mit den übergebenen Werten anlegt wird. Das ist ebenfalls etwas was mir seit dem Versionswechsel aufgefallen ist. Es ist neu möglich innerhalb einer Eigenschaft, redundante Werte anzulegen. Sprich: Gewicht => „1Kg“; „1Kg“;„1 Kg“.

Meines erachtens nach ist dies absolut dämlich, ist nun mal aber so…

"properties": [
		{
			"id": "6767307b8c694e0db8e8d81782b5576b",
			"name": "1 Kg",
			"group": {
				"id": "44260f41d8d546cbad0976adfb9dd44e",
				"name": "Gewicht"
			}
		}
	]

Dein JSON sieht auf den ersten Blick ok aus. Was Du sicher nochmal versuchen kannst, ist das Object „productConfiguratorSettings“ zu füllen und übergeben . Für sieht das nach einer fehlenden Zuordnung aus. Oder aber: Haben alle Varianten einen Lagerbestand? Vielleicht hast Du Dein System so eingerichtet, dass nicht verfügbare ARtikel nicht angezeigt werden https://shopware.stoplight.io/docs/admin-api/c2NoOjE0MzUxMjgy-product