Advanced Artikelsuche

Benötigte Lesezeit: 14 Minuten


Einleitung

Einführung

Die Advanced Artikelsuche ist ein PepperShop Modul, welches dynamisch verschiedene Einschränkungskriterien verwenden kann und Informationen selbstständig in Dropdowns abgefüllt zur Auswahl präsentiert.

Modulstruktur

[shop/config.inc.php] (Aktivierung)
 shop/advancedsuche.php
 shop/suchresultat_modul.def.php
 shop/language/html_templates/advancedsuche.tpl.html

Darstellung: Das zugehörige Template findet man in der Datei advancedsuche.tpl.html bei den HTML-Templates.

Logik: Die Implementierung der Advanced Suche findet man in der Datei advancedsuche.php. Diese Datei hier wird in USER_ARTIKEL_HANDLING_AUFRUF.php included. Die Datei suchresultat_modul.def.php ermöglicht diverse Zusatzoperationen auf der Suchresultatanzeige (Sortierung, …). Diese Datei muss nicht konfiguriert werden. Aktivierung: Die Advanced Suche wird erst dann benutzt, wenn man sie in der config.inc.php adäquat aktiviert. Genaueres siehe im Kapitel Aktivierung.

Welche Advanced Suche Modulversion für welche PepperShop Version kompatibel ist, findet man ganz unten in der History-Anzeige.

Definition und Benutzung der Advanced Artikelsuche

Man definiert in der Datei shop/advancedsuche.php in der Funktion get_advanced_suche_config() die Felder, nach welchen man die Suche einschränken können soll. Dabei gibt es zwei Kategorien von Feldern: Kategorie-DB-Felder und Artikel-DB-Felder. Die Kategorie-DB-Felder sollte nach Möglichkeit zu Beginn angeordnet werden, direkt nach den Kategorienbaum Feldern (Hauptkat. / Unterkat.). Das erste Feld listet alle Möglichkeiten inkl. Kommentaren zu den einzelnen Feldbestandteilen. Je nach Feld-Typ (Dropdown, String, …) können im Feldbestandteil ‘options’ noch spezifische Daten angegeben werden.

Lokalisierung

Damit die Bezeichner vor den Feldern lokalisiert dargestellt werden können, werden Labels eingesetzt. Diese Labels muss man nun in den entsprechenden Uebersetzungsdateien (shop/language/xy/localetext.inc.php) einfügen und den jeweils übersetzten Begriff dazu definieren. Wenn der Shop keinen übersetzten Begriff findet, zeigt er stattdessen den hier im Label angegebenen Begriff ein.

Installation / Aktivierung

Um die Advanced Artikelsuche zu aktivieren, muss man in der Datei shop/config.inc.php (Konstantendefinitionen) der Konstante mit der Bezeichnung FILENAME_ADVANCED_SEARCH als Wert den Namen dieser Datei zuweisen (Default: advancedsuche.php). Diese Datei muss man ins {shop_root}/shop - Verzeichnis kopieren und das Template-File advancedsuche.tpl.html ins Verzeichnis shop/language/html_templates. Erst jetzt wird die Advanced Artikelsuche vom Shop erkannt und benutzt. Die Standard PepperShop Artikelsuche wird nun nicht mehr benutzt. Im Administrationsbereich -> ‘Shop Konfiguration ansehen’ sieht man nun nach den Konstantendefinitionen das eingebundene Suchmodul inkl. Versionsanzeige.

Technische Einbindung

  • Aktivierung via Konstante in config.inc.php (genaueres, siehe Kapitel Aktivierung)
  • Suchabfragemaske: Logik -> advancedsuche.php, Darstellung: advancedsuche.tpl.php
  • Einbindung der Advancedsuche: shop/USER_ARTIKEL_HANDLING_AUFRUF.php, darstellen == 3 und darstellen == 30 (Suchmaske / Suchlauf + Suchresultateanzeige)
  • Die Advanced Artikelsuche durchläuft die gleichen USER_ARTIKEL_HANDLING_AUFRUF.php darstellen-Bereich und wird dort je nach Bedarf included und benutzt, selbst die Resultatepräsentation ist die selbe wie bei der Standard Artikelsuche

Customizing

Die Anpassungen für einen jeweiligen Kunden erfolgen ausschliesslich in der Datei advancedsuche.php. Hier editiert man die anzuzeigenden Elemente der Suchmaske in der ersten Funktion: get_advanced_suche_config(). Es gibt in dieser Funktion globale Einstellungen, die von einzelnen dargestellten Elementen unabhängig sind und es gibt die einzeln beschriebenen Elemente der Suchmaske. Um die Umsetzung zu vereinfachen, sollte man unbedingt unten das Tipps-Kapitel gelesen haben (siehe weiter unten, nach den Beispielen).

Eigentlich ist es ganz einfach. Man stellt im vorhandenen Array $adv_config['adv_felder'] einfach die benötigten Elemente ein, die in der Advanced Suchemaske angezeigt werden sollen und gibt für jedes Element an, was seine Datenbasis ist, wie es aussehen soll und wie es heissen soll - dies ist grob der Überblick, was zu tun ist. Änderungen dieser Art sollten 80%-90% aller Anforderungen befriedigen können.

Auf das Customizing der globalen Parameter $adv_config['adv_global'] wird hier nicht weiter eingegangen. Im Quelltext steht dazu jeweils ein Infokommentar.

Zusatzfeld als Dropdown darstellen (Einfaches Beispiel)

Meistens wird nur ein Artikelzusatzfeld als Dropdown dargestellt benötigt. Eine mögliche Realisierung sieht man in folgendem kleinen Beispiel aus einem existierenden Projekt:

$adv_config['adv_felder'][0] = array('label'    => 'artikel_zusatzfeld1',// in jeder localetext.inc.php übersetzen
                                      'var_name'  => 'weintyp',// Name der Variable, die ueber POST uebertragen wird
                                      'feldnamen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1', // Name des Datenbankfeldes (fuer Einschraenkung)
                                     'tabelle'   => 'artikel', // Name der Tabelle wo das DB-Feld vorkommt
                                     'typ'       => 'dropdown',// Darstellungsart = dropdown
                                     'options'   => array('dropdown_parent' => -1, // Parent-Dropdown bei verschachtelten Dropdown-Typen (-1 = deaktiviert)
                                                          'feldnamen_auslesen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1',// Feldname in der Tabelle, welche als Option-Tag Label angezeigt werden
                                                          'feldnamen_einschraenkung' => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1', // Feldname der bei den Einschränkungen als Vergleich benutzt wird
                                                          'einschraenkungen'=>LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1 != \'\''// SQL-Einschraenkungen, hier damit keine Leereinträge zur Auswahl angezeigt werden
                                                         ),
                                    );

Darstellungstypen

Es existieren folgende Darstellungstypen (Elemente), welche in Form einer Feldkonfiguration als ein Sucheingabeparameter eines Shopkunden abgefragt und verarbeitet werden kann.

  • Texteingabe (string)
  • Boolscher Operator (boolean)
  • Intervallangaben (von_bis)
  • Nicht älter als (datetime)
  • Sortierung (order)
  • Dropdownauswahl (dropdown)

Möglichkeiten (Demoeintrag)

Was ist alles möglich? -> Es gibt in der Funktion get_advanced_suche_config() am Anfang einen auskommentieren Arrayeintrag ($adv_config['adv_felder'][0]). Dieser Eintrag erläutert alle Möglichkeiten, die es in der aktuell benutzten Advanced Suche Version gibt:

    // Demofeld -> Nach Auskommentieren unbedingt die Nummerierung des adv_felder-Keys korrigieren
    $adv_config['adv_felder'][0] = array('label' => 'neues_feld', // Label, das angezeigt wird, sollte in jeder localetext.inc.php übersetzen worden sein (hier angegebener Wert = key im Array in localetext.inc.php)
                                         'var_name' => 'neues_feld', // Name der Variable, die ueber POST übertragen wird, damit man beim Debugging weiss, um was es sich handelt
                                         'feldnamen' => 'neues_feld', // Name des Datenbankfeldes (Datenbasis eines Dropdowns und /oder Vergleichskriterium bei Suchdurchfuehrung), ACHTUNG: Bei LANGUAGE_DB_FIELD_MODE Mehrsprachigkeit, muss man hier die Konstante LANGUAGE_DB_FIELD_MODE_PREFIX vor dem Feldnamen anfuegen!
                                         'tabelle' => 'artikel', // Name der Tabelle wo das DB-Feld vorkommt (artikel oder kategorien)
                                         'typ' => 'string', // string | dropdown | boolean | von_bis | von_bis_felder | datetime | order (-> Art der Darstellung eines Suchmaskenelements)
                                         'options'   => array('value' => '',// string: Vorausgefuellter Wert eines String-Typs
                                                              'size' => 20, // string:   Laenge des Texteingabefelds
                                                              'maxlength' => 255, // string:   Max. Textlaenge der Kundeneingaben (Texteingabefeld)
                                                              'boolean_checked' => true, // boolean:  Def. ob die Boolean-Checkbox vorausgewaehlt sein soll
                                                              'boolean_true' => '= \'Y\'',  // boolean:  Defaultwert von true bei Boolean-Typen (Operator plus Wert)
                                                              'label_danach' => 'Zusatzinfos...', // boolean:  Text, der rechts neben der Checkbox dargestellt wird. Falls es ein Label in der aktuellen Uebersetzungsdatei gibt, welches strtolower() dem angegebenen Text entspricht, wird der uebersetzte Text angezeigt. Es wird html_coding::htmlentities() angewendet.
                                                              'von' => 150, // von_bis:  Beim Typ von_bis, ab welchem Wert (Voreinstellung)
                                                              'bis' => 990, // von_bis:  Beim Typ von_bis, bis zu welchem Wert (Voreinstellung)
                                                              'datetime_values' => array('1 Woche' => 7), // datetime: Hier wird dem Shopkunden ein Dropdown mit den hier angegebenen Werten als Sucheinschraenkung angeboten. Die Werte werden als Array key=>value Paerchen uebergeben. Dabei wird als Key jeweils ein Label uebergeben, z.B. 1 Woche und als value der Wert in Tagen (7) als Integerwert. Das angegebene Label wird in der Uebersetzungsdatei gesucht, falls nicht vorhanden wird der hier angegebene Wert angezeigt. Fuer Werte: Siehe auch Beispiel weiter unten...
                                                              'order_values' => array('label'=>LANGUAGE_DB_FIELD_MODE_PREFIX.'feldname'), // order:    Hierbei werden zwei Dropdowns erstellt. Im ersten werden mit Labels angezeigt, nach welchen Feldern die Suchausgabe sortiert ausgegeben werden kann. Die Feldangaben sollten immer einen Tabellennamenprefix haben: a. fuer Tabelle artikel, ak. fuer Tabelle artikel_kategorie, k. fuer Tabelle kategorie, da es sonst unter Umstaenden zu einem ambigues field SQL-Fehler kommen kann. Im zweiten Dropdown kann man auf- oder absteigend waehlen. (Bei Feldnamen LANGUAGE_DB_FIELD_MODE_PREFIX nicht vergessen!)
                                                              'dropdown_parent'  => -1,                                                   // dropdown: Parent-Dropdown bei verschachtelten Dropdown-Typen (-1, wenn es keine Abhängigkeiten gibt, ansonsten wird hier die Feld-Nr. des Suchelements angegeben, von dessen Werten dieses Dropdown abhängt)
                                                              'dropdown_reload'  => true,                                                 // dropdown: Wenn Dropdowns miteinander verknuepft sind (dropdown_parent), so ist es oft sinnvoll, wenn nach dem Aendern eines Wertes gleich ein Reload geschieht, so dass die abhaengigen Dropdowns gleich mit weiteren Einschraenkungskriterien neu geladen werden. Hier kann man dieses Verhalten steuern: true = sofort nach jeder Aenderung neu nachladen, false = nicht nachladen (Default ist true). Diese Einstellung kann auch fuer den Typ datetime verwendet werden.
                                                              'dropdown_order'   => LANGUAGE_DB_FIELD_MODE_PREFIX.'neues_feld ASC',       // dropdown: Feldnamen fuer die Sortierung der Werte im Dropdown, die den globalen Wert dropdown_order und das Sortierfeld neues_fled ueberschreibt
                                                              'feldnamen_auslesen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1',       // dropdown: Feldname in der Tabelle, welche als Option-Tag Label angezeigt werden
                                                              'feldnamen_einschraenkung' => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1', // dropdown: Feldname der bei den Einschraenkungen als Vergleich benutzt wird (String) oder als Array (Key: Feld-Nr, Value: Name des Einschraenkungsfeldes (pro Dropdown einstellbar)). Wenn der Wert '*none*' angegeben wird, so wird die Einschraenkung fuer das Dropdown mit der angegebenen Feld-Nr. nicht mehr verwendet!
                                                              'einschraenkungen' =>'',                                                    // dropdown: Ev. gibt es noch SQL-Einschraenkungen... (Beispiel: Siehe Demo-Implemenentierungen Felder 0-2), Achtung: Werte hier muessen schon geaddslashed angegeben werden.
                                                              'dropdown_ignore_if_parent_value_set' => false,                             // dropdown: Moegliche Werte: true|false: Wenn dieses Flag auf true gesetzt wird, ignoriert dieses Feld, ob der Parent zuvor in der Suchmaske ausgewaehlt worden ist. Das Dropdown wird dann somit nicht disabled.
                                                              'dropdown_decode_values'=>'',                                               // dropdown: Wenn pro ausgelesenes Feld mehrere zu decodierende Werte enhalten sind, so wird hier die Methode der Dekodierung angegeben oder ein Zeichen, welches als Wertedelimiter gilt. ACHTUNG: Wenn dieses Element benutzt wird, generiert die Suche SQL-Elemente mit LIKE '%string%'
                                                              'dropdown_sort_decode_values'=>'',                                          // dropdown: Wenn pro ausgelesenes Feld mehrere zu decodierende Werte enhalten sind, kann hier eine PHP-Arraysortierungsfunktion angegeben werden um die neu erfassten Daten zu sortieren. Diese Einstellung macht nur in Zusammenhang mit dropdown_decode_values Sinn. Beispielfunktionen: natsort, natcasesort, sort, rsort
                                                              'dropdown_filters' =>'',                                                    // dropdown: Wenn die Dropdown-Werte vor der Verwendung und Anzeige gefiltert werden sollen, kann man hier Komma-separiert die Filter-Funktionsnamen angeben (z.B. trim,strtoupper - bitte kein Komma am Ende stehen lassen!). ACHTUNG: Wenn dieses Element benutzt wird, generiert die Suche SQL-Elemente mit LIKE '%string%'
                                                              'dropdown_width'   =>'800px',                                               // dropdown: Angabe der fixen Breite eines Dropdowns. Der Wert wird als CSS-Styleangabe verarbeitet
                                                              'dropdown_additional_values'=> array(array('label'=>'label1','value'=>'value1'),array('label'=>'label2','value'=>'value2'),array('label'=>'label_n','value'=>'value_n')), // dropdown: Vordefinierte, zusaeztliche Werte (je ein Label und ein Wert) definieren. Diese ergaenzen das Set der ausgelesenen Werte und koennen mit SQL-Like Operationen zusaetzliche Auswahlmoeglichkeiten erschaffen, welche mit direkten Werten nicht so einfach moeglich sind, z.B. alle Werte mit Zeichenfolge xyz => %xyz%. Wenn das Label als key eines Uebersetzten Wertes in localetext.inc.php vorhanden ist, wird der uebersetzte Wert angezeigt.
                                                              'feldnamen_bis'    => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1',         // von_bis_felder: Feldnamen fuer den Maximalwert auf den die Abfrage geprueft wird
                                                              'string_cmp_op'    => 'LIKE',                                                // string:   Welcher Vergleichsoperator soll verwendet werden? LIKE oder der = Operator?
                                                              'string_like_pattern'=> '%{string}%',                                        // string:   Falls der string_cmp_op = LIKE ist, kann man hier noch optional ein Pattern definieren, welches eine unscharfe Suche erlaubt. Das %-Zeichen steht fuer alle moeglichen Zeichen vor / nach dem Suchtstring ({string}).
                                                             ), // Optionen
                                        );

Einige Optionseinstellungen gelten nur im Zusammenhang des gewählten Typs (typ). Man muss immer den Kommentar hinter der Option lesen, um deren Bedeutung korrekt zu verstehen.

Demo Implementierungen / fertige Beispiele

Weiter helfen folgende Beispiele um komplexere Zusammenhänge zu visualisieren.

  • Die ersten Felder zeigen voneinander abhängige Dropdowns (siehe auch Option dropdown_parent):

    • Felder 0 bis 2: Hauptkategorien -> Unterkategorien -> Gruppierungen
  • Das Feld Nr 3 zeigt, wie einfach eine einschränkende Preissuche realisierbar ist (Preis von-bis)

  • Die Felder 4,5 und 6 zeigen die Anzeige von Boolschen Checkboxen inkl. Definition des Zustandes true

  • Im Feld 7 sehen wir ein Dropdownmenü, welches auf den Datenbestand eines Artikelzusatzfeldes zugreift und dort Komma separierte Werte decodiert und zur Auswahl anzeigt

  • Im Feld 8 steht ein Beispiel für eine ‘Artikel ist im Shop seit’-Abfrage

  • Im Feld 9 sieht man eine Sortierungsanzeige. Zusätzlich zur Anzeige in der Eingabemaske kann via globalem Steuerungsparameter order_in_results angegeben werden, ob man auch in der Suchresultateanzeige die Sortierung verändern kann (empfohlen)

    $adv_config['adv_felder'][0] = array('label'    => 'Hauptkategorie',
                                        'var_name'  => 'hkat_Name',
                                        'feldnamen' => 'Kategorie_ID',
                                        'tabelle'   => 'kategorien',
                                        'typ'       => 'dropdown',
                                        'options'   => array('value'           => '',
                                                             'dropdown_parent' => -1, // Parent-Dropdown bei verschachtelten Dropdown-Typen
                                                             'feldnamen_auslesen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'name', // Feldname in der Tabelle, welche als Option-Tag Label angezeigt werden
                                                             'feldnamen_einschraenkung' => array(1=>'Parent_ID',2=>'*none*'), // Feld-Nr -> Name des Einschraenkungsfeldes (pro Dropdown einstellbar)
                                                             'einschraenkungen'=>'kategorien.Parent_ID = 0' // Bei Dropdown: Ev. gibt es noch SQL-Einschraenkungen...
                                                            ),
                                       );

    $adv_config['adv_felder'][1] = array('label'    => 'Unterkategorie 1',
                                        'var_name'  => 'ukat1_Name',
                                        'feldnamen' => 'Kategorie_ID',
                                        'tabelle'   => 'kategorien',
                                        'typ'       => 'dropdown',
                                        'options'   => array('value'           => '',
                                                             'dropdown_parent' => 0,   // Parent-Dropdown bei verschachtelten Dropdown-Typen
                                                             'feldnamen_auslesen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'name', // Feldname in der Tabelle, welche als Option-Tag Label angezeigt werden
                                                             'feldnamen_einschraenkung' => array(2=>'Parent_ID'), // Feld-Nr -> Name des Einschraenkungsfeldes (pro Dropdown einstellbar)
                                                             'einschraenkungen'=>'kategorien.Parent_ID > 0', // Bei Dropdown: Ev. gibt es noch SQL-Einschraenkungen...
                                                            ),
                                       );

    $adv_config['adv_felder'][2] = array('label'    => 'Unterkategorie 2',
                                        'var_name'  => 'ukat2_Name',
                                        'feldnamen' => 'Kategorie_ID',
                                        'tabelle'   => 'kategorien',
                                        'typ'       => 'dropdown',
                                        'options'   => array('value'           => '',
                                                             'dropdown_parent' => 1,   // Parent-Dropdown bei verschachtelten Dropdown-Typen
                                                             'feldnamen_auslesen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'name', // Feldname in der Tabelle, welche als Option-Tag Label angezeigt werden
                                                             'einschraenkungen'=>'kategorien.Parent_ID > 0', // Bei Dropdown: Ev. gibt es noch SQL-Einschraenkungen...
                                                            ),
                                       );

    $adv_config['adv_felder'][3] = array('label'    => 'preis',
                                        'var_name'  => 'preis',
                                        'feldnamen' => 'Preis',
                                        'tabelle'   => 'artikel',
                                        'typ'       => 'von_bis',
                                        'options'   => array('value'           => '',
                                                             'von'             => 0, // Beim Typ von_bis, ab welchem Wert
                                                             'bis'             => 0, // Beim Typ von_bis, bis zu welchem Wert
                                                             'size'            => 9, // Laenge des Texteingabefelds
                                                             'maxlength'       => 9, // Max. Textlaenge der Kundeneingaben (Texteingabefeld)
                                                            ),
                                       );

    $adv_config['adv_felder'][4] = array('label'    => 'promo',
                                        'var_name'  => 'promo',
                                        'feldnamen' => 'promo',
                                        'tabelle'   => 'artikel',
                                        'typ'       => 'boolean',
                                        'options'   => array('value'           => '',
                                                             'boolean_checked' => false,     // Def. ob die Boolean-Checkbox vorausgewaehlt sein soll
                                                             'boolean_true'    => '= \'Y\'', // Def. von true bei Boolean-Typen
                                                            ),
                                       );

    $adv_config['adv_felder'][5] = array('label'    => 'knallerangebot',
                                        'var_name'  => 'knallerangebot',
                                        'feldnamen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_4',
                                        'tabelle'   => 'artikel',
                                        'typ'       => 'string',
                                        'options'   => array('value'     => '',
                                                             'size'      => 16,
                                                             'maxlength' => 255
                                                            ),
                                       );

    $adv_config['adv_felder'][6] = array('label'    => 'ab_lager_lieferbar',
                                        'var_name'  => 'ab_lager_lieferbar',
                                        'feldnamen' => 'Lagerbestand',
                                        'tabelle'   => 'artikel',
                                        'typ'       => 'boolean',
                                        'options'   => array('value'           => '',
                                                             'boolean_checked' => false, // Def. ob die Boolean-Checkbox vorausgewaehlt sein soll
                                                             'boolean_true'    => '> 0',  // Def. von true bei Boolean-Typen
                                                            ),
                                       );

    $adv_config['adv_felder'][7] = array('label'    => 'farbe',
                                        'var_name'  => 'farbe',
                                        'feldnamen' => LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_8',
                                        'tabelle'   => 'artikel',
                                        'typ'       => 'dropdown',
                                        'options'   => array('value'           => '',
                                                             'dropdown_parent' => -1, // Parent-Dropdown bei verschachtelten Dropdown-Typen
                                                             'dropdown_reload' => false, // Nicht nach jeder Aenderung der Auswahl im Dropdown durch den Shopkunden sofort die Suchmaske neu nachladen
                                                             'einschraenkungen'=> LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_8 <> \'\'',
                                                             'dropdown_decode_values'=>',',
                                                             'dropdown_sort_decode_values'=>'sort',
                                                             'dropdown_filters'=> 'trim'
                                                            ),
                                       );

    $adv_config['adv_felder'][8] = array('label'    => 'Im Shop seit',
                                        'var_name'  => 'datum',
                                        'feldnamen' => 'erstellt',
                                        'tabelle'   => 'artikel',
                                        'typ'       => 'datetime',
                                        'options'   => array('value'           => '', // Vorausgewaehltes Element
                                                             'datetime_values' => array('egal'=>-1,'heute'=>0,'gestern'=>1,'1 '.£('woche')=>7,'2 '.£('wochen')=>14,'3 '.£('wochen')=>21,'1 '.£('monat')=>30,'6 '.£('monate')=>180,'1 '.£('jahr')=>365), // Label (wird uebersetzt) und Anzahl Tage in der Vergangenheit
                                                             'dropdown_reload' => false, // Nicht nach jeder Aenderung der Auswahl im Dropdown durch den Shopkunden sofort die Suchmaske neu nachladen
                                                            ),
                                       );

    $adv_config['adv_felder'][9] = array('label'    => 'sortierung',
                                        'var_name'  => 'order',
                                        'typ'       => 'order',
                                        'options'   => array('value'           => '', // Vorausgewaehltes Element
                                                             'order_values'    => array('artikelname'=>'a.'.LANGUAGE_DB_FIELD_MODE_PREFIX.'Name','preis'=>'a.Preis','artikel_zusatzfeld1'=>'a.'.LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1'), // Label (wird uebersetzt) und Feldname inkl. Tabellenreferenz (a. = artikel, ak. = artikel_kategorie, k. = kategorien), Lokalisierte Feldnamen mit LANGUAGE_DB_FIELD_MODE_PREFIX. versehen.
                                                             'dropdown_reload' => false, // Nicht nach jeder Aenderung der Auswahl im Dropdown durch den Shopkunden sofort die Suchmaske neu nachladen
                                                            ),
                                       );

    $adv_config['adv_felder'][10] = array('label'    => 'Hersteller Artikel-Nr.',
                                        'var_name'  => 'hersteller_artikel_nr',
                                        'feldnamen' => 'hersteller_artikel_nr',
                                        'tabelle'   => 'artikel',
                                        'typ'       => 'dropdown',
                                        'options'   => array('value'           => '',
                                                             'dropdown_parent' => 1, // Parent-Dropdown bei verschachtelten Dropdown-Typen
                                                             'einschraenkungen'=>LANGUAGE_DB_FIELD_MODE_PREFIX.'zusatzfeld_1 <> \'\'', // Einschraenkungen selbst addslashen
                                                             'dropdown_ignore_if_parent_value_set'=>true, // Dropdown nicht disablen, bloss weil noch keine Hauptkategorie gewaehlt worden ist..
                                                            ),
                                       );

//     $adv_config['adv_felder'][11] = array('label'    => 'Alter',
//                                         'var_name'  => 'alter',
//                                         'feldnamen' => 'zusatzfeld_2',
//                                         'tabelle'   => 'artikel',
//                                         'typ'       => 'von_bis_felder',
//                                         'options'   => array('von'              => 0,
//                                                              'bis'              => 99,
//                                                              'size'             => 2,
//                                                              'maxlength'        => 2,
//                                                              'feldnamen_bis' => 'zusatzfeld_3',
//                                                             ),
//                                        );

    global $my_session;
    if (intval($my_session->get_session_var('kat_aktiv')) > 0) {
        $adv_config['adv_felder'][]  = array('label'    => 'Nur in aktueller Kategorie suchen',
                                            'var_name'  => 'nur_aktuelle_kategorie',
                                            'feldnamen' => 'Kategorie_ID',
                                            'tabelle'   => 'kategorien',
                                            'typ'       => 'boolean',
                                            'options'   => array('value'           => '',
                                                                 'boolean_checked' => false,     // Def. ob die Boolean-Checkbox vorausgewaehlt sein soll
                                                                 'boolean_true'    => '= '.intval($my_session->get_session_var('kat_aktiv')), // Def. von true bei Boolean-Typen
                                                                 'label_danach'    => ' (es werden keine Unterkategorien berücksichtigt)'
                                                                ),
                                           );
    }

Tipps

  • Als var_name sollte man nicht die Datenbankfeldnamen der Artikelzusatzfelder verwenden (zusatzfeld_1 bis zusatzfeld_n).
  • Die Nummerierung in $adv_config['adv_felder'] muss das Inkrement 1 haben und darf keine Lücken besitzen. Vor allem nach dem Verschieben von Elementen ein Fehler der gerne passiert…
  • Wenn man die spezialisierten Suchfelder der Advanced Artikelsuche lieber unterhalb des normalen Suchfeldes (oder der Zusatzfelder + Schlagworte-Suchfeld) angezeigt haben möchte, so kann man dies, indem man im Template shop/language/html_templates/advancedsuche.tpl.html den Block Suchelement entweder vor oder nach die Blocks der spezialisierten Elemente ablegt.
  • memory allocation Fehler tritt auf: Ev. wurden Dropdown-Felder verschoben (andere Position) aber die Optionsfelder dropdown_parent wurden vergessen zu aktualisieren…
  • Artikelzusatzfelder werden in der Suchmaske nicht angezeigt. Im Array $adv_config['adv_global']['zusatzfelder_nicht_verwenden'] die gewünschten Felder auskommentieren.
  • Wenn man die Darstellungsreihenfolge umgeändert hat, so werden in einem untergeordneten Dropdown die Werte nicht mehr angezeigt / abgefüllt: Dies kann daran liegen, dass man beim übergeordneten Dropdown bei der Option feldnamen_einschraenkung die Feld-Nr. des referenzierten Dropdowns vergessen hat ebenfalls zu aktualisieren und die Advancedsuche deshalb dieses Feld im Query-Generator nicht berücksichtigt.

Mehrsprachigkeit

  • Seit der Advanced Suche Modulversion 1.1 werden mehrsprachige Artikel unterstützt (seit v.1.2 ohne Bugs einsetzbar). Die Suche zeigt dann in Dropdowns nur Werte von Artikeln an, welche der vom Shopkunden gewählten, aktuell aktiven Sprache entsprechen. Da viele Operationen nur auf Artikel-Feldern basieren, kommt dies einem grossen Einschnitt in der Performance gleich, da jetzt zusätzlich zu jedem Artikel noch geprüft werden muss, welcher Sprache er zugeordnet ist. Diese Zuordnung (Artikel_ID, Sprachcode_iso_639_1) läuft über die folgenden Tabellen: artikel -> artikel_kategorie -> kategorien -> kategorie_locale -> locale was die SQLs natürlich einiges komplexer und langsamer macht.
  • Die Labels, die übersetzt werden, haben darauf keinen Einfluss.
  • Normale Mehrsprachigkeit: Eine Optimierung der Zugriffe wäre die zusätzliche Speicherung der ISO-639-1 Sprachcodes in der Artikeltabelle (wie damals beim Architronic Sprachpatch).
  • Der Mehrsprachigkeitsmodus LANGUAGE_DB_FIELD_MODE (ab Shopversion 3.0 der Standardmodus, vorher in shop/config.inc.php einschaltbar) aktivierbar wird ab der Advancedsuche Version 1.3 erstmals unterstützt. Beim Customizing muss man aufpassen, dass an den richtigen Orten nicht die Sprachkonstante (LANGUAGE_DB_FIELD_MODE_PREFIX) vergessen wird.
🌶️
🔥
🌶️