Auflistungsfilter, bei dem die Verfügbarkeit von Eigenschaftswerten von anderen ausgewählten Eigenschaftswerten abhängt

Weiß jemand, wie ich die Loop {% for property in properties.entities %} durchlaufen kann, die nur einige bestimmte Eigenschaften und Optionen ausgibt?

Ich werde auch eine Kondition wie diese einrichten:

Wenn Value A 02 in currentFilter für Property A ist, dann sind Value B 01 und Value B 03 zur Auswahl für Property B verfügbar.

{% sw_extends '@Storefront/storefront/component/listing/filter-panel.html.twig' %}

{% block component_filter_panel_items %}

    {% block component_filter_panel_item_properties %}
        {% set properties = listing.aggregations.get('properties') %}

        {% if not properties.entities is empty %}
            {% for property in properties.entities %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } %}

            {% endfor %}
        {% endif %}
	{% endblock %}

{% endblock %}

Ich versuche, den Filter nach Bedingung in der Twig-Vorlage zu ändern. Aber kann nicht machen es funktionieren, kann jemand Tipp vielleicht, was ich falsch mache? Hier der Code, den ich habe:

{% sw_extends '@Storefront/storefront/component/listing/filter-panel.html.twig' %}

{% block component_filter_panel_items %}

    {% block component_filter_panel_item_properties %}
        {% set properties = listing.aggregations.get('properties') %}
        {% set currentoptions = slot.data.listing.currentFilters.get('properties') %}        

        {% if not properties.entities is empty %}
            {% for property in properties.entities %}

                {% if currentoptions.entities == "c0d02d1738fd4293a489695787e06b5c" %}
                    test1 
                {% else %}

                    {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                        elements: property.options,
                        sidebar: sidebar,
                        name: 'properties',
                        displayName: property.translated.name,
                        displayType: property.displayType,
                        pluginSelector: 'filter-property-select',
                        propertyName: property.translated.name
                    } %}

                {% endif %}

            {% endfor %}
        {% endif %}
	{% endblock %}
    {{ dump(slot.data.listing.currentFilters) }}

{% endblock %}

Oder sollte ich diese Logik in Subscriber.php integrieren?

Falls currentoptions ein array ist, dann iteriert man nicht mit currentoptions.entities du das array.

1 „Gefällt mir“

Danke Max_Shop! Es funktioniert jetzt, aber wenn ich ‚without‘ twig filter benutze, dann bricht es mit einem Fehler ab: ‚Unknown „without“ filter.‘

Hier der Code, vielleicht kann jemand einen Tipp geben? Ich werde einige Optionen in Abhängigkeit von anderen Optionen mit ihm zu deaktivieren.

{% sw_extends '@Storefront/storefront/component/listing/filter-panel.html.twig' %}

{% block component_filter_panel_items %}
    {{ dump(listing.aggregations) }}

    {% block component_filter_panel_item_properties %}
        {% set properties = listing.aggregations.get('properties') %}

        {% if ( not properties.entities is empty ) and ( 'c0d02d1738fd4293a489695787e06b5c' ) in slot.data.listing.currentFilters.properties %}
            {% for property in properties.entities|without('a', 'b') %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } %}

            {% endfor %}

        {% else %}

            {% for property in properties.entities %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } %}

            {% endfor %}
        {% endif %}
	{% endblock %}

{% endblock %}

Es gibt keinen without filter in twig: Documentation - Twig - The flexible, fast, and secure PHP template engine

1 „Gefällt mir“

Entschuldigung, dieser Filter ist von Drupal twig.

Vielleicht kennt jemand eine Möglichkeit, dies in Shopware zu implementieren? :nerd_face:

Hier ein Update, aber es funktioniert nicht. Kann jemand einen Tipp für die Verwendung von „optionid“ im Loop |filter geben?

{% sw_extends '@Storefront/storefront/component/listing/filter-panel.html.twig' %}

{% block component_filter_panel_items %}
    {{ dump(listing.aggregations) }}
    {{ dump(listing.aggregations.elements.properties.entities.elements[0].options.elements) }}

    {% block component_filter_panel_item_properties %}
        {% set properties = listing.aggregations.get('properties') %}
        {% set optionid = listing.aggregations.elements.properties.entities.elements[0].options.elements('_uniqueIdentifier') %}

        {% if ( not properties.entities is empty ) and ( 'c0d02d1738fd4293a489695787e06b5c' ) in slot.data.listing.currentFilters.properties %}
            TEST
            {% for property in properties.entities|filter (optionid => optionid == "6189b900a31f436885e3210d1a19abe8") %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } %}

            {% endfor %}

        {% else %}

            {% for property in properties.entities %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } %}

            {% endfor %}
        {% endif %}
	{% endblock %}

{% endblock %}

oder ist es vielleicht möglich, hier Optionen auszuschließen, weiß das jemand?

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    ...

Kann mir auch jemand einen Tipp geben, wie ich es implementieren sollte, damit die Kondition akzeptiert wird. Jetzt muss ich die Seite manuell neu laden, damit dies funktioniert:

{% if ( not properties.entities is empty ) and ( 'c0d02d1738fd4293a489695787e06b5c' in slot.data.listing.currentFilters.properties ) %}

Ich machte es funktionieren (obwohl der Code Optimierung benötigen, aber es funktioniert). Das einzige Frage, die ich jetzt habe, ist ich brauche, um die Seite (Im Webbrowser) manuell nach der Anwendung benutzerdefinierte Filterung (Ausblenden property.options abhängig von anderen property.options ausgewählt) neu zu laden.

Kann mir jemand einen Tipp zum Neuladen des Filters geben? Hier der Code:

{% sw_extends '@Storefront/storefront/component/listing/filter-panel.html.twig' %}

{% block component_filter_panel_items %}
    {#
    {{ dump(listing.aggregations.elements.properties.entities.elements[0].options.elements) }}
    #}

    {% block component_filter_panel_item_properties %}
        {% set properties = listing.aggregations.get('properties') %}

        {# Checking, if Prop A is selected #}

        {% if ( not properties.entities is empty ) and ( 'c0d02d1738fd4293a489695787e06b5c' in slot.data.listing.currentFilters.properties ) %}

            <p>CUSTOM FILTER ON</p>

            {% for property in properties.entities %}

                {# Filtering Props B #}

                {% set propertyoptionsA = property.options|filter((v, k) => k != "6189b900a31f436885e3210d1a19abe8" and k != "03ef7f5772924e5980a30c041dc92494" and k != "1ead635c607d47d8a3b59720b84be6e8" and k != "73f357184eba4c03a6c89a92990357a7" and k != "a7a3d5a4bad5463f92070b83b09df6eb" and k != "1a9c286cbeef4c16a782355fba2757b7" and k != "ca3b626c25ca4cd68289360bf405f7b2" and k != "478ed551d8d94fd38efc5cefdb1ade88" and k != "8133c4d61b1c40c4b8713b0fe2095fac" and k != "a499309dff6b48c7a15c022d709d8ac5" and k != "16b8a946e19b474d9f9c2242ea271d0c" and k != "dfeee618e74645759aa6c5b4184c24d8" and k != "4d895d3c9cea423dbd10c2adbf9260e8") %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: propertyoptionsA,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } only %}

            {% endfor %}

        {% else %}

            <p>CUSTOM FILTER OFF</p>
            
            {% for property in properties.entities %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } %}

            {% endfor %}
        {% endif %}
	{% endblock %}

{% endblock %}

Ich denke, dass dieses custom twig Filter update über AJAX durchgeführt werden könnte. Kann jemand einen Tipp für Shopware 6 Lösung geben?

Für Filtermanipulationen möchte ich die verfügbaren Eigenschaften an Twig übergeben. Ich mache das über Subscriber. Ich konnte Products als Beispiel dafür in den Context setzen. Aber wie kann ich das mit Properties machen, kann mir jemand einen Tipp geben?

Sollte ich die Listing Aggreggations Extension dafür verwenden?

Hier der Code, den ich habe:

public function handleResult(ProductListingResultEvent $event)
{
    $array1 = $event->getResult()->getElements();

    $event->getContext()->assign($array1);

    $event->getContext()->addExtension('ContextExtension1', new ArrayEntity($array1));
}

Ich habe die Logik bisher in PHP erstellt und kann nun keine Eigenschaftsoptionen an die Twig übergeben.

{{ dump( context.context.extensions.Properties1ContextExtension ) }} result:

Shopware\Core\Framework\Struct\ArrayEntity {#16334 ▼
  #data: array:1105 [▼
    "001695276a734b7c9f4b60171e1de25f" => Shopware\Core\Content\Property\Aggregate\PropertyGroupOption\PropertyGroupOptionEntity {#9458 ▶}
    "0046b0fe5bde48b2b1a3d3ff6126bb10" => Shopware\Core\Content\Property\Aggregate\PropertyGroupOption\PropertyGroupOptionEntity {#9454 ▶}
etc..

Aber wie kann ich auf die Optionen zugreifen, damit ich sie (propertyoptionsA) im Filter verwenden kann?

{% block component_filter_panel_items %}
    {% block component_filter_panel_item_properties %}

        {% set properties = listing.aggregations.get('properties') %}

        {% if ( conditions ) %}

            {% for property in properties.entities %}

                {# Excluded in Subscriber Properties via extension #}
                {% set propertyoptionsA = context.context.extensions.Properties1ContextExtension.**???** %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: propertyoptionsA,
                    sidebar: sidebar,
                    name: 'properties',
                    displayName: property.translated.name,
                    displayType: property.displayType,
                    pluginSelector: 'filter-property-select',
                    propertyName: property.translated.name
                } %}

            {% endfor %}

        {% else %}
            
            {% for property in properties.entities %}

                {% sw_include '@Storefront/storefront/component/listing/filter/filter-property-select.html.twig' with {
                    elements: property.options,
                    sidebar: sidebar,
                    ..
                } %}

            {% endfor %}

        {% endif %}

    {% endblock %}
{% endblock %}

Vielleicht kann jemand aus dem Forum mit Optionen helfen?

OK, ich probiere jetzt, die neue Eigenschaftserweiterung von subscriber an twig zu übergeben:

$propertiesA = $aggregations->get('poperties');
$event->getCnotext()->addExtension('PropertiesAExtension', $propertiesA);

Kann mir bitte jemand einen Rat geben, wie ich mit einem Filter die Optionen ausschließen kann?

$criteria->addFilter(
    new NotFilter(
        NotFilter::CONNECTION_OR,
        [
            new ContainsFilter('name', 'Name1'),
            new ContainsFilter('name', 'Name2')
        ]
    )
);

Weiß jemand, wie man Filter zu getAggregations() in diesem Fall hinzufügen?

@Max_Shop Können Sie vielleicht einen Tipp geben, wo ich die PHP-Logik des Eigenschaftsfilters zum Kopieren und Anpassen finden kann?