Eigenschaften / Properties im Template ausgeben

HI,

wie kann man einzelne Eigenschaften im Twig Template ausgeben?

Mit ZUsatzfeldern klappt das easy. Aber die Eigenschftaen/Properties sind in nem Array verwurstet das ich nicht ganz durchblicke.

Und ich möchte ungern für jeden einzelne Eigenschaft jedes Mal das sortedProperties Arry mit ner Schleife durchlaufen nur um eine simple Eigenschaft anzuzeigen.

Also das muss auch einfacher gehen?
In der RIchtung: {{ „sortedProperties.elements.0.name“ }} {{ „sortedProperties.elements.0.value“ }}

{{ dump(page.product.sortedProperties) }}

liefet folgendes

jemand ne Idee? Wie komme ich an Label = Antriebart und Value = Front ???

Hallo, gibt es hierzu mittlerweile Lösungsvorschläge? Stehe vor dem selben Problem.

Moin!

Die Variablen in Twig bilden nicht nur Arrays, sondern sogar die ganzen Objekte aus dem Core ab. Das hat den unfassbar praktischen Nutzen, dass wir im Template selbst auf die Objekt-Methoden zugreifen können, also auch die getter-Funktionen.

Das bedeutet, praktisch angewandt, dass so etwas hier möglich ist:

{{ (page.product.sortedProperties.getElements|first).getName }}

Vor allem getElements oder getEntities bringen meistens das gewünschte Objekt.
Bei dem oberen Code aber bitte beachten, dass dies lediglich die erste PropertyGroup ausgibt! Um alle Gruppen aufzulisten, müsste das von einem Foreach umschlossen werden, in etwa so (vereinfacht):

{% for group in page.product.sortedProperties %}
  <strong>{{ group.getName }}</strong>

  <ul>
    {% for groupOption in group.getOptions %}
      <li>{{ groupOption.getName }}</li>
    {% endfor %}
  </ul>
{% endfor %}

Der obere Code erzeugt folgende Ausgabe (aus einer lokalen Dev-Installation):

Um zu erfahren, welche Methoden du alles zur Verfügung hast, beachte bitte die Ausgabe von dump() im Frontend - Dort ist in blauer Farbe zu sehen, welches Objekt auf die jeweiligen Variablen zugewiesen ist. Verfolge den Pfad parallel bei Shopware auf Github, um die Objekt-Klassen aufzurufen; Anhand des Beispiels:
/Core/Content/Property/PropertyGroupEntity.php und
/Core/Content/Property/Aggregate/PropertyGroupOption/PropertyGroupOptionEntity.php

Am Ende muss man wahrscheinlich trotzdem noch ein bisschen probieren. Ergänzend kann ich euch noch die Twig-Dokumentation ans Herz legen:
Twig - for („loop.index“ hier besonders interessant)
Twig - first (Erstes Kind eines Arrays)
Twig - last (Letztes Kind eines Arrays)
… Es gibt noch mehr Möglichkeiten, wie slice oder split, aber da würde ich jetzt erstmal nicht weiter drauf eingehen. In der Doku ist aber alles zu finden :slight_smile:

Hoffe, es hilft!

LG;LA

Edit: Kleiner Hinweis noch. Die getName Methode von oben ist nicht ganz richtig, soll aber erstmal nur zur Veranschaulichung dienen. Im Live-System bitte beachten, dass meistens noch translated.name verfügbar ist, welches die richtige Sprachvariable für die Kundensprache beinhaltet…

@littleAmused Wow, herzlichen Dank für die ausführliche Antwort. Du hast mir enorm weitergeholfen. So einen Einsatz sieht man selten. Danke!

1 „Gefällt mir“

Hallo, wir suchen grad noch nach einer Möglichkeit bei genau diesem Beispiel auch die Mediendaten der jeweiligen Eigenschaft anzuzeigen? Wüsstest du heir vlt auch weiter?

Moin!

Wenn eine Eigenschaft ein Bild besitzt, sollte zumindest die mediaId im ausgegebenen Objekt vorhanden sein. Mit der searchMedia Funktion solltet Ihr an das gesamte Media Objekt kommen:

Ich habe hier mein Beispiel von oben mit dem Code aus der Doku erweitert:

{# initial ID array #}
{%- set arrOptionMediaIds = [] -%}

{%- for group in page.product.sortedProperties -%}
  {%- for groupOption in group.getOptions|filter(groupOption => groupOption.mediaId) -%}
    {# merge IDs to a single array #}
    {%- set arrOptionMediaIds = arrOptionMediaIds|merge([groupOption.mediaId]) -%}
  {%- endfor -%}
{%- endfor -%}

{# do a single fetch from database #}
{% set mediaCollection = searchMedia(arrOptionMediaIds, context.context) %}

{% for group in page.product.sortedProperties %}
  <strong>{{ group.getName }}</strong>

  <ul>
    {% for groupOption in group.getOptions %}
      <li>
        <span>{{ groupOption.getName }}</span>

        {# get access to media of option #}
        {% set optionMedia = mediaCollection.get(groupOption.mediaId) %}

        <pre>
          {{ dump(optionMedia) }}
        </pre>
      </li>
    {% endfor %}
  </ul>
{% endfor %}

Der erste Loop holt die vorhandenen Media-IDs aus allen Eigenschaften des Produkts, während der zweite Loop lediglich für die Ausgabe verantwortlich ist. Dazwischen werden die Media-Daten aus der Datenbank geholt, anhand des Arrays, dass wir im ersten Loop gebildet haben.

Falls jemand eine elegantere Lösung kennt, als zwei mal das selbe Array zu durchlaufen, möge meine Antwort gerne ergänzen :slight_smile:

LG;LA

2 „Gefällt mir“

Danke das hat geklappt! Außerhalb des Loops ist die Lösung.

1 „Gefällt mir“