CustomFieldSets auf Produktdetailseite ausgeben

Hey in die Runde,

ich möchte gerne mehrere CustomFieldSets anlegen die unterschiedliche Informationen abfragen (i. d. R. Technische Daten die sich je nach Produktkategorie unterscheiden). Beim Anlegen eines neuen Produktes kann ich die für das Produkt benötigten CustomFieldsSets auswählen und befüllen. Auf der Produktdetailseite sollen dann nur die im Produkt angewählten CustomFieldsSets auch ausgegeben werden.

Ich hab z. B. insgesamt fünf verschiedenen CustomFieldsSets angelegt. Im Produkt habe ich zwei davon ausgewählt und die Inhalte befüllt. Auf der Produktdetailseite sollen jetzt nur die Infos aus den beiden ausgewählten CustomFieldSets ausgegeben werden.

Ich hoffe ihr könnt mir helfen, Danke im Vorraus.
Gruß Robby

D.h. du möchtest wissen, wie du die Werte aus den Custom Fields der Produkte in deinem Template ausgeben kannst?

Hey AlexBS;

wie ich die Werte ausgeben kann weiß ich, mir geht es darum wie ich abfragen kann welches CustomFieldSet in dem darzustellenden Produkt ausgewählt wurde um nur die Informationen auszugeben.

Bei mir wird die Variable #customFieldSets: null ausgegeben, somit kann ich darüber keine if-abfrage durchführen. Ich hatte gehofft das in der Variable die ausgewählten Sets gespeichert sind.

Gruß Robby

Ok, du willst abfragen, in welchem der CustomFieldSets Inhalte gesetzt wurden?

Willst du das in irgendeiner Weise dynamisch machen, sprich du gehst davon aus, dass sich diese Sets ändern und du keine absoluten technischen Bezeichnungen in deinem Template aufrufen willst?

Hey AlexBS,

die technischen Geräte haben je nach Kategorie verschiedenen technische Parameter.
Zum Beispiel benötigen die Nachtsichtgeräte andere technische Angaben als die Wärmebildkameras.

Um die Informationen zu Strukturieren möchte ich in einem CustomFieldSet alle technische Angabe die für Nachtsichtgeräte benötigt und angezeigt werden sollen pflegen und in einem weiteren CustomFieldSets die für Wärmebildkameras.

Beim Anlegen eines Produkte kann ich ja auswählen welches CustomFieldSet angezeigt werden soll, je nach Produktkategorie wähle ich hier also Nachtsichtgeräte oder Wärmebildkameras und fülle die Felder aus.

Auf der Produktdetailseite sollen jetzt nur die im Produkt angewählten CustomFieldSets ausgegeben werden.

Meine bisherige Ausgabe der Tabelle für die technischen Daten sieht so aus, hier werden allerdings alle CustomFields ausgegeben. Meiner Meinung nach wäre es am saubersten, wenn ich zunächst das Feld CustomFieldSets abfrage und dann auch nur die dort eingetragenen Werte abfrage.

  <table class="table table-striped product-detail-properties-table">
                <thead>
                    <tr>
                        <th>Eigenschaft</th>
                        <th>Wert</th>
                    </tr>
                </thead>
                <tbody>
		          {% for key, item in page.product.translated.customFields %}
                    {% set transName = "customFields." ~ key %}
			     <tr class="properties-row">
				    <th class="properties-label"><span>{{ transName|trans|sw_sanitize }}:</span></th>
				    <td class="properties-value"><span>{{ item }}</span></td>
			     </tr>
			{% endfor %}
                </tbody>
            </table>

Und sowas funktioniert nicht?

{% if item %}
  <tr class="properties-row">
    <th class="properties-label"><span>{{ transName|trans|sw_sanitize }}:</span></th>
    <td class="properties-value"><span>{{ item }}</span></td>
   </tr>
{% endif %}

Hey f.mertens,

die Werte und Labels werden ja ausgegeben, mir geht es um die korrekte if-Abfrage die abfragt, ob dem Produkt ein CustomFieldSet zugewiesen wurden und wenn ja auch nur die Werte innerhalb des Sets ausgegeben werden.

Gruß Robby

Ich habe jetzt nicht alles durchgelesen, je nachdem wie du das Custom Field angelegt hast, wird es immer zugewiesen, ob null, leer oder mit Wert.

In twig kannst du defined und empty nutzen.
Einfach in der twig Dokumentation nachsehen.

Jetzt habe ich es glaube verstanden.
Das ist aber keine Standardfunktion, oder?

Die Sets kann man doch nur den ganzen Bereich Produkt zuweisen und dann sind die in jedem Produkt drin, eine Auswahl pro Produkt habe ich noch nicht gesehen.
Am Produkt selber hängt ja auch nicht das Set sondern nur die einzelnen Felder, wenn ich mich jetzt nicht täusche.

Hey f.mertens,

wir nutzen Shopware 6, dort ist unter Produkte > Spezifikationen der Bereich Zusatzfelder.
Dort kann ich über einen Button »Zusatzfeld-Sets auswählen« aktivieren und anschließend die für das Produkt benötigten Sets auswählen.

Daher war ich der Meinung, dass ich das auch abfragen könnte, aber anscheinend geht es wohl leider nicht.

Du hast recht, das war mir nicht bewusst, das ich die Produkte eigentlich immer Api pflege.

Habe es gerade mal getestet, es macht bei mir keinen Unterschied ob ich Sets auswähle oder nicht, wenn die Variablen gefüllt sind kommen diese auch im Twig an, unabhängig von der Auswahl.

Ist scheinbar bisher nur dafür gedacht um die Pflege im Backend zu vereinfachen

Mhmm ok, scheint komplizierter als erwartet.

Machen wir es doch mal am konkreten Beispiel, ich hab mehrere CustomFieldSets angelegt, je nach Produktkategorie weise ich das Set dem Produkt zu und fülle dann die Felder aus. Somit ist im Backend die Befüllung der Produkte einheitlich und übersichtlich, nicht benötigte Felder werden ausgeblendet. Zusätzlich gibt es noch allgemeine CustomFieldsSets die CustomFields beinhalten zum Eintragen von allgemeinen Informationen wie z. B. den Lieferumfangs etc.

Mit der dumb Funktion werden mir jetzt folgende Felder ausgegeben:

    #customFields: array:17 [▼
      "custom_property_nst_typ" => "Analog"
      "custom_property_nst_generation" => "Generation 2+"
      "custom_property_nst_qualitaet" => "Commercial Grade"
      "custom_property_nst_roehrenhersteller" => "Photonis"
      "custom_property_nst_phosphor" => "Grün"
      "custom_property_nst_manuelle_helligkeitsverstellung" => "Nein"
      "custom_property_nst_vergroesserung" => "1x"
      "custom_property_nst_moegliche_vergroesserung" => "1-15x"
      "custom_property_nst_empfohlene_vergroesserung" => "2-7x"
      "custom_property_nst_sichtfeld" => "70 m (40°)"
      "custom_property_nst_objektiv" => "26 mm f/1.2"
      "custom_property_nst_lichtempfindlichkeit" => "> 1800 μA/lm"
      "custom_property_nst_aufloesung" => ">64 lp/mm"
      "custom_property_nst_akkulaufzeit" => "60 Std."
      "custom_property_nst_strom" => "1x CR123"
      "custom_property_nst_arbeitstemperatur" => "-40°C bis +50°C"
      "custom_lieferumfang_text" => "<ul><li>Dedal 370</li><li>Objektivdeckel</li><li>Stofftasche</li></ul>"

Das Produkt ist ein Nachtsichtgerät, wäre es ein Wärmebildkamera benötige ich andere Eigenschaften die das Produkt spezifizieren (hierfür hab ich ja wiederum ein eigenes CustomFieldSet „custom_property_wbk_ …“) angelegt.

Wie schaff ich es das innerhalb der Produktbeschreibung die gefüllten Felder die mit »custom_property_nst_« beginnen ausgegeben werden. Das Feld „custom_lieferumfang_text“ soll beispielsweise in einem eigenen Tab »Lieferumfang« ausgegeben werden, nicht aber in der Tabelle für die Technischen Daten.

customFields ist ein Array. Jetzt nimmst du ein zweites Array, zulassen oder ausschließen ist deine Entscheidung, und per Schleife fragst du ab, ob key in Array.

Hey Max_Shop,

ich kann dir leider nicht ganz folgen.
customFields ist ein Array in dem alle CustomFields gespeichert werden die befüllt sind – hab ich verstanden. Was mache ich mit dem zweiten Array, wo kommt das her?

Mit Zulassen/Ausschliessen meinst du, dass ich das customFields Array mit einer Schleife durchlaufen lasse und bei jedem Array-Eintrag abfrage, ob der Eintrag einem der von mir »ausgeschlossenen« Werte entspricht und nicht ausgegeben wird, richtig?

Als grobes Beispiel:

{% for key, item in page.product.translated.customFields %}
    {% set transName = "customFields." ~ key %}
        {% if (key == "custom_lieferumfang_text") or  (key == "custom_allgemeine_infos % …}
            // nichts ausgeben
        {% else %}
	      <tr class="properties-row">
			<th class="properties-label"><span>{{ transName|trans|sw_sanitize }}:</span></th>
			<td class="properties-value"><span>{{ item }}</span></td>
		</tr>
	{% endfor %}

Ja.

In das zweite Array packst du die Keys rein, die angezeigt werden sollen bzw. die nicht angezeigt werden sollen. Je nachdem wie du die Logik umsetzt.

Aber deine Lösung geht natürlich auch mit dem OR