Projekt

Allgemein

Profil

Neues Filtersystem

Das neue Filtersystem erleichtert die Auswahl der Filterwerte dadurch, dass Filterwerte, die in Kombination mit den bereits ausgewählten Filterwerten kein Ergebnis mehr liefern würden, ausgeblendet, bzw. deaktiviert werden (je nach Einstellung). Zudem gibt es nun zwei verschiedene Auswahlmodi: “Standard” und “Stufenweise”. Im Standardmodus sind jederzeit alle Filterkategorien sichtbar und auswählbar, die der Shopbetreiber für diesen Filter aktiviert hat, während der Stufenmodus zunächst nur die erste, der vom Shopbetreiber festgelegten Filterkategorien, anzeigt. Nachdem ein Wert der ersten Kategorie gewählt wurde, erscheint die nächste Filterkategorie, usw..
Eine weitere Neuerung ist der globale Startseitenfilter, der dafür sorgt, dass der eingestellte Startseitenfilter auch in allen Kategorien angezeigt wird, die keinen kategoriespezifischen Filter haben.
Für den globalen Startseitenfilter gibt es noch die Option des persistenten Startseitenfilters. Ist diese aktiviert, so wird die Filterselektion des Benutzers (weitestgehend) beibehalten, wenn dieser in eine andere Kategorie navigiert.

Beispiel:

Wenn der Benutzer sich in einem Shop für Autoteile befindet und Ersatzteile für seinen Mercedes sucht und dies auch als Marke in den Filter ausgewählt hat, behält er diese Auswahl bei auch wenn er von der Kategorie “Blinker” zu “Reifen” wechselt. Wenn er in der Kategorie “Reifen” nun zusätzlich nach einer Reifenprofiltiefe von 4cm filtert und anschließend wieder in die Kategorie “Blinker” wechselt, bleibt die Marke “Mercedes” als Selektion erhalten, da dieser Filter in beiden Kategorien existiert, jedoch wird die Reifenprofiltiefe von 4cm verworfen, da ein Blinker nicht über solch einen Filter verfügt. Wechselt der Benutzer nun in die Kategorie “Scheibenwischer” und es gibt in dem Shop keinen Scheibenwischer für einen Mercedes, so geht nun auch diese Selektion verloren.

Eine weitere Neuerung des Filtersystems sind die Feature-Sets. Durch diese lassen sich beliebige Kombinationen von Filterwerten miteinander verknüpfen. Während im alten Filtersystem lediglich die Definition eines einzelnen Feature-Sets möglich war, kann man nun beliebig viele je Artikel anlegen.

Anwendungsbeispiel:

Wir haben einen Shop für Autoteile und definieren die Filter “Marke” und “Modell” des Autos. Nun wollen wir einem Universalscheibenwischer Filterwerte zuweisen. Der Scheibenwischer passt in einen Mercedes der A- oder B-Klasse sowie in einen Audi A1 oder A2. Nach dem alten Filtersystem hätte man nun die Filterwerte “Mercedes”, “Audi” (Marke), “A-Klasse”, “B-Klasse”, “A1” und “A2” (Modell) ausgewählt. Das hatte zur Folge, dass nun z.B. auch “Mercedes” und “A1” miteinander verknüpft waren und somit unsinnige Filterauswahlen möglich waren.
Um das zu vermeiden, legen wir statt dessen ein Feature-Set mit den Werten “Mercedes” (Marke), “A-Klasse” und “B-Klasse” (Modell) und ein weiteres Feature-Set mit den Werten “Audi” (Marke), “A1” und “A2” (Modell) an.

Updatesichere Anpassungen am Filtersystem:

Das Filtersystem lässt sich updatesicher überladen. Aufgrund der dürftigen Code-Strukturierung, wie z.B. in der “FilterBoxContentView” (die gesamte Logik steckt in der get_html-Methode), kann es unter Umständen dazu führen, dass viel Code für eine kleine Änderung kopiert werden muss. Die “FilterBoxContentView” wird vermutlich ein häufiger Ansatzpunkt für individuelle Anpassungen sein, da diese für die Anzeige der Filter-Box im Frontend zuständig ist.

Codebeispiel:

Eine typische individuelle Anpassung ist die Anzeige der Anzahl der verfügbaren Artikel für die sichtbaren Filterwerte in der Filter-Box. Im Folgenden ist ein Codebeispiel für die Beschaffung der dafür nötigen Daten, mithilfe einer Überladung “FilterValueCountContentView”:

<?php
class FilterValueCountContentView extends FilterValueCountContentView_parent
{    
  public function prepare_data()
  {
    parent::prepare_data();
    if(strpos($this->v_content_template, 'filter_selection') !== false)
    {
      $t_categorie_id = $_SESSION['coo_filter_manager']->get_categories_id();

      for($i = 0, $count = count($this->content_array['FEATURE_VALUE_DATA']); $i < $count; $i++)
      {
        $t_query = 'SELECT
          COUNT(*) AS count
        FROM
          feature_index
        LEFT JOIN
          feature_set_to_products
          USING(feature_set_id)
        LEFT JOIN
          products_to_categories AS ptc
          USING(products_id)
        WHERE
          ptc.categories_id = "' . $t_categorie_id . '"
          AND feature_value_index LIKE "%-' . $this->content_array['FEATURE_VALUE_DATA'][$i]['ID'] . '-%"';
        $t_result = xtc_db_query($t_query);
        $t_row = xtc_db_fetch_array($t_result);
        $this->content_array['FEATURE_VALUE_DATA'][$i]['COUNT'] = $t_row['count'];
      }
    }
  }
}