Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Produkt-Filteroption: Auswahl Artikel ohne jeweilige Artikeleigenschaft

    hypdwarf

    • Neu im Forum
    • Beiträge: 23
    Hallo zusammen,

    habe kürzlich auf die 2.0er Version umgestellt und bin begeistert! DANKE!

    Nun versuche ich auch die Filteroption, basierend auf den Artikeleigenschaften, einzusetzen. Gestaltet sich auch nicht weiter kompliziert, aber:
    In den Drop-Down-Feldern werden mir die Attribute der Produkte angezeigt und das Filtern ist auch ohne Problem möglich. Allerdings habe ich noch nicht herausgefunden, wie der "nicht übereinstimmende Rest" angezeigt werden kann?

    Erklärt sich vielleicht am besten mit einem Beispiel:
    Produkt: Servietten
    Artikeleigenschaft: "Dekor"
    Werte: Motiv/Streifen/Ornaments...

    Alle mit Werten hinterlegten Artikel kann ich mit dem Filter finden. Aber was ist mit den Artikeln "ohne Dekor"? Also einfach den Rest der Artikel aus der Suche/Kategorie ohne das jeweilige Merkmal/Eigenschaft. Natürlich könnte ich auch ein Dekor "ohne Dekor" anlegen, aber irgendwie widerstrebt mir das etwas.
    Gibt es dafür bereits eine Lösung und ich habe diese nur noch nicht gefunden?

    Also in den Drop-Down-Feldern neben dem "alle anzeigen" immer auch noch ein "ohne bzw. Rest bzw. n/a (oder was auch immer)" in jedem Filter-Feld.

    Falls es dafür noch keine Lösung gibt und auch nicht "mal eben" eine Idee da ist: Sofern mir jemand einen Stups in Richtung der für diese Filter bzw. die Produktabfrage entscheidende Datei gibt, dann versuch ich auch mal selber mein Glück...

    Danke vorab und viele Grüße,
    Christian

    Linkback: https://www.modified-shop.org/forum/index.php?topic=35519.0

    hypdwarf

    • Neu im Forum
    • Beiträge: 23
    Hallo zusammen,

    scheine es geschafft zu haben. Keine Ahnung, ob es wirklich 100%tig funktioniert und vielleicht auch einfacher/besser geht, aber es scheint zu funktionieren.

    Hier mein Lösungsweg, falls es einer von euch auch gebrauchen kann.
    Folgende Dateien müssen angepasst werden:
    • /specials.php
    • /products_new.php
    • /advanced_search_result.php
    • /includes/modules/default.php
    • /includes/modules/listing_filter.php

    /specials.php & /products_new.php & /advanced_search_result.php

    Ersetze jeweils:

    Code: PHP  [Auswählen]
    $filter_join .= "JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                                  ON pt"
    .$fi.".products_id = p.products_id
                                     AND pt"
    .$fi.".options_id = '".(int)$options_id."'
                                     AND pt"
    .$fi.".values_id = '".(int)$values_id."' ";

    Durch:

    Code: PHP  [Auswählen]
    if($values_id == "OHNE")
            {
                $where .= " AND NOT EXISTS (SELECT pt_temp.options_id FROM ".TABLE_PRODUCTS_TAGS." pt_temp WHERE pt_temp.products_id = p.products_id AND pt_temp.options_id = '".(int)$options_id."')";

                $filter_join .= "LEFT JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                           ON pt"
    .$fi.".products_id = p.products_id
                              AND pt"
    .$fi.".options_id = '".(int)$options_id."' ";
            }
            else
            {
                $filter_join .= "JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                           ON pt"
    .$fi.".products_id = p.products_id
                              AND pt"
    .$fi.".options_id = '".(int)$options_id."'
                              AND pt"
    .$fi.".values_id = '".(int)$values_id."' ";
            }

    Bei /advanced_search_result.php zusätzlich noch:

    Nach der Zeile :

    Code: PHP  [Auswählen]
    $filter_join = '';

    Einfügen:

    Code: PHP  [Auswählen]
    $where = "";

    /includes/modules/default.php

    Ersetze:

    Code: PHP  [Auswählen]
    $from .= "JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                           ON pt"
    .$fi.".products_id = p.products_id
                              AND pt"
    .$fi.".options_id = '".(int)$options_id."'
                              AND pt"
    .$fi.".values_id = '".(int)$values_id."' ";

    Durch:

    Code: PHP  [Auswählen]
    if($values_id == "OHNE")
            {
                $where .= " AND NOT EXISTS (SELECT pt_temp.options_id FROM ".TABLE_PRODUCTS_TAGS." pt_temp WHERE pt_temp.products_id = p.products_id AND pt_temp.options_id = '".(int)$options_id."')";
               
                $from .= "LEFT JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                           ON pt"
    .$fi.".products_id = p.products_id
                              AND pt"
    .$fi.".options_id = '".(int)$options_id."' ";
            }
            else
            {
                $from .= "JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                           ON pt"
    .$fi.".products_id = p.products_id
                              AND pt"
    .$fi.".options_id = '".(int)$options_id."'
                              AND pt"
    .$fi.".values_id = '".(int)$values_id."' ";
            }

    /includes/modules/listing_filter.php

    Nach der Zeile:

    Code: PHP  [Auswählen]
    $filter_join = '';

    Einfügen:

    Code: PHP  [Auswählen]
    $where = '';

    Ersetze:

    Code: PHP  [Auswählen]
    $filter_join .= "JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                                  ON pt"
    .$fi.".products_id = p.products_id
                                     AND pt"
    .$fi.".options_id = '".(int)$options_id."'
                                     AND pt"
    .$fi.".values_id = '".(int)$values_id."' ";

    Durch:

    Code: PHP  [Auswählen]
    if($values_id == "OHNE")
            {
                $where = " AND NOT EXISTS (SELECT pt_temp.options_id FROM ".TABLE_PRODUCTS_TAGS." pt_temp WHERE pt_temp.products_id = p.products_id AND pt_temp.options_id = '".(int)$options_id."')";
               
                $filter_join .= "LEFT JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                           ON pt"
    .$fi.".products_id = p.products_id
                              AND pt"
    .$fi.".options_id = '".(int)$options_id."' ";
            }
            else
            {
                $filter_join .= "JOIN ".TABLE_PRODUCTS_TAGS." pt".$fi."
                           ON pt"
    .$fi.".products_id = p.products_id
                              AND pt"
    .$fi.".options_id = '".(int)$options_id."'
                              AND pt"
    .$fi.".values_id = '".(int)$values_id."' ";
            }

    Ergänze nach:

    Code: PHP  [Auswählen]
    if (isset($_GET['filter'][$options_id]) && $_GET['filter'][$options_id] != '') {
            $options_array = array (array ('id' => '', 'text' => $values['NAME'] . TEXT_SHOW_ALL));
          } else {
            $options_array = array (array ('id' => '', 'text' => $values['NAME']));
          }

    Folgendes:

    Code: PHP  [Auswählen]
    $options_array[] = array ('id' => 'OHNE', 'text' => "Ohne ".$values['NAME']);

    Ändere:

    Code: PHP  [Auswählen]
    $filter_dropdown[$options_id] .= xtc_draw_pull_down_menu('filter['.$options_id.']', $options_array, isset($_GET['filter'][$options_id]) ? (int)$_GET['filter'][$options_id] : '', 'onchange="this.form.submit()"').PHP_EOL;

    In:

    Code: PHP  [Auswählen]
    $filter_dropdown[$options_id] .= xtc_draw_pull_down_menu('filter['.$options_id.']', $options_array, isset($_GET['filter'][$options_id]) ? $_GET['filter'][$options_id] : '', 'onchange="this.form.submit()"').PHP_EOL;

    Nun kann neben den üblichen Filtern auch immer "Ohne
    • " ausgewählt werden und es wird auf alle Artikel gefiltert, welche diese Eigenschaft gar nicht haben.


    Ergänzungen/Korrekturen/Verbesserungen liebend gerne, weil wirklich intensiv habe ich mich nicht mit dem Code des Shops befasst... war jetzt "try and error".  :-)

    Viele Grüße,
    Christian

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Danke für's teilen, auch wenn mir der Sinn dahinter noch nicht ganz klar ist, denn ein Filter soll ja eben genau nur die Artikel anzeigen, nach denen gefiltert wurde. ;-)

    Grüße

    Torsten

    hypdwarf

    • Neu im Forum
    • Beiträge: 23
    :-)

    Hab es versucht zu erklären, aber ist vielleicht nicht ganz logisch, wenn man es nicht vor sich sieht.

    Neuer Versuch:
    Du bist Kunde und suchst nach Servietten "ohne Dekor/Motiv/..." einfach nur einfarbige Servietten. Die Eigenschaft "Dekor = irgendwas" ist aber nur Servietten zugeteilt, welche auch ein Dekor haben. Diese Servietten mit Eigenschaft "Dekor = NULL" ist über den Filter nicht möglich.
    Umweg wäre gewesen allen Artikeln ohne Dekor ein Dekor "Ohne Dekor" zuzuweisen. Das wäre für mich bei der Vielzahl an Servietten in unterschiedlichsten Größen, Farben, Mustern etc. eine ganz schöne Aufgabe geworden.
    In dem Fall wird dem Kunden dann auch genau das angezeigt, wonach er gesucht hat. Servietten, bei denen es die Eigenschaft Dekor nicht gibt.  :-)

    Die Problemstellung lässt sich sicherlich auf weitere Artikel übertragen. Aber dabei ist es mir aufgefallen.

    Vielleicht jetzt verständlicher... ansonsten: Hey, bin ich halt exotisch.  :-PP

    Viele Grüße,
    Christian

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Hallo Christian,
    wenn ich das richtig verstehe, hätte man das recht einfach über die Datenbank lösen können.
    Einfach mit einem Datenbank-Befehl oder kleinem Script bei allen Servietten, die kein Dekor hinterlegt haben, das Tag "ohne Dekor" hinzufügen.

    Gruß, h-h-h
    Managed Server
    8 Antworten
    1892 Aufrufe
    27. September 2018, 17:08:43 von lehe
    1 Antworten
    1795 Aufrufe
    04. Oktober 2010, 16:14:43 von DokuMan
    8 Antworten
    4375 Aufrufe
    25. September 2011, 13:11:24 von Tomcraft
    1 Antworten
    1756 Aufrufe
    07. Juli 2014, 21:24:16 von Matt