Hallo zusammen,
gibt es eine Möglichkeit die Anzahl der gefunden Produkte, für eine Filteroption, in Klammern hinter der Filteroption auszugeben?
Ich habe mir die Datei filter-multi-select-list-item.html.twig vorgenommen. Dort wird die Checkbox und das Label der Filteroptionen gebildet. In einer Schleife können mit listing.entities.elements alle Produkte auf der aktuellen Seite durchlaufen werden. Wenn man die propertyIds mit element.id vergleicht, findet man bei einer Übereinstimmung Produkte, denen die Filteroption zugeordnet wurde. Um die Anzahl auszugeben, kann man einen Counter inkrementieren.
Allerdings gibt es 2 Probleme:
- Wie oben erwähnt bezieht sich listing.entities.elements nur auf Produkte der aktuellen Seite. Sobald es mehrere Seiten gibt, werden nicht alle Produkte berücksichtigt.
Gibt es eine Möglichkeit alle Eigenschaft IDs von allen Produkten der aktuellen Kategorie abzufragen?
- Sobald ein Filter gesetzt wurde, ändert sich die Anzahl der gezeigten Produkte, aber nicht die Anzahl der Produkte für die jeweilige Filteroption, die zuvor ermittelt wurde. Nach einem Reload der Seite (F5) allerdings schon.
Wie kann man den aktualisierten Wert ausgeben, ohne die gesamte Seite neu laden zu müssen?
Um das Vorhaben zu verdeutlichen, habe ich mal einen Screenshot angehängt. Es geht um die Zahlen hinter den Filteroptionen in Klammern.
Solange die Produkte nur auf einer Seite gelistet werden und kein Filter gesetzt wird, funktioniert die Ausgabe.
Aber wie werden alle Produkte der aktuellen Produktgruppe berücksichtigt und nicht nur die Produkte der aktuellen Seite? Ich habe den Dump untersucht, konnte aber lediglich die Produkte der aktuellen Seite finden.
Wie muss vorgegangen werden, damit die Zahlen aktualisiert werden, sobald ein Filter gesetzt wurde?
Mein aktueller Ansatz befindet sich in MeinTheme/src/Resources/views/storefront/component/listing/filter/filter-multi-select-list-item.html.twig.
Zuerst wird geprüft, ob es sich um einen Herstellerfilter oder eine Eigenschaft handelt. Danach werden alle Produkte durchlaufen. Im Falle eines Herstellerfilters werden die Hersteller ID mit der Filter ID verglichen. Bei einem Treffer wird ein Counter erhöht. Im Falle einer Eigenschaft werden von jedem Produkt alle Eigenschaften durchlaufen und ebenfalls die ID der Ausprägungen mit der ID des Filters verglichen. Bei einem Treffer wird wieder ein Counter erhöht.
{% block component_multi_select_list_item_label %}
{{ name }}
{% set count = 0 %}
{% if 'manufacturer' not in filterItemId %}
{% for products in listing.entities.elements %}
{% for optionids in products.propertyIds %}
{% if optionids == element.id %}
{% set count = count + 1 %}
{% endif %}
{% endfor %}
{% endfor %}
{% else %}
{% for products in listing.entities.elements %}
{% if products.manufacturerID == id %}
{% set count = count + 1 %}
{% endif %}
{% endfor %}
{% endif %}
({{ count }})
{% endblock %}
Allerdings erscheint mir dieser Ansatz alles andere als elegant oder performant. Das Problem ist aber auch, dass sich in listing.entities.elements nur die Produkte der aktuellen Seite befinden.
Es werden aber richtigerweise alle Filteroptionen der Produkte von einer Kategorie ausgegeben.
Irgendwo muss doch ermittelt werden, welche Ausprägungen das sind. Werden dafür nicht auch die Produkte der Kategorie geprüft? Könnte man an dieser Stelle einen Counter mitzählen lassen und das Ergebnis ausgeben?
Wo wird ermittelt, welche Ausprägungen ausgegeben werden?
Hat da vielleicht jemand einen Tipp für mich?
Hallo Laudenz, haben Sie eine Lösung für den 2-Punkt (Reload) gefunden?
Hallo shopware1638,
wir haben das jetzt anderes gelöst, indem wir oberhalb des Product Listing die gesamt Anzahl der Produkte in der aktuellen Kategorie ausgeben und die Anzahl der Produkte auf der aktuellen Seite.
Wenn eine Filter-Option gesetzt wird, ändern sich die Zahlen automatisch mit.
Grüße