Kategoriensichtbarkeit
Einleitung
Mit diesem Modul wird die Sichtbarkeit der Kategorien und deren Artikel im Shop steuerbar. Auf diese Weise realisiert man die Anzeige von Teilsortimenten auf Basis einer selbst erstellten, in PHP programmierten Logik. Info: Es gibt auch ein Artikelsichtbarkeit Modul.
Der Einsatz des Moduls betrifft viele Subsysteme (u.a. Kategoriebaum, Artikelliste und -detailanzeige (Deeplinks), Artikelsuche, Quicksearch, Type-A-Head Suche, …) und beeinflusst auch die Performance und Skalierbarkeit. Es bietet dafür maximale Flexibilität bei der Umsetzung der Bedingungen zur Anzeige einer Kategorie und deren Artikel.
Programmierung / Anwendung
Art der Umsetzung / PepperShop Internals
Wo im PepperShop wurde diese Funktionalität umgesetzt?
Die Implementierung wurde auf der Stufe der Aggregatsfunktionen im Basis Model integriert, also in allen Funktionen / Methoden, welche Kategorie-Daten zusammenfassend kundenseitig auslesen oder auswerten. Zusätzlich wurde die minikat
Klasse erweitert, welche ja eigentlich nur auf einer einzelnen Kategorie operiert. Absichtlich NICHT angepasst worden ist die Funktion getKategorie
, welche immer dann verwendet wird, wenn via Kategoriesichtbarkeit weitere Daten nachgeladen werden müssen. Weiter wurde auch die katbaum
Klasse nicht angepasst, da dort ausschliesslich mit Kategorie-IDs in einem sehr Performance sensitiven Teil gearbeitet wird. Die Funktion get_leere_kategorien()
hat ebenfalls keine Integration erhalten, da diese sonst sehr stark verlangsamt wäre.
Überblick einer Umsetzung
Es gibt zwei Aspekte der Programmierung:
1.) Die Definition der Logik zur Steuerung der Sichtbarkeit / Verfügbarkeit der Kategorien
Datei: {shopdir}/shop/kategoriesichtbarkeit.def.php
In dieser PHP-Datei gibt es eine Klassendefinition und darin die Methode set_kategoriesichtbarkeit
. In dieser Methode wird die Logik zur Steuerung der Anzeige einer Kategorie ausprogrammiert.
Da diese Methode von sehr unterschiedlichen Orten im Shop angesteuert wird, steht die jeweilige Kategorie in völlig verschiedenen Containern zur Verfügung: Kategorie Objekt Unterkategorie Objekt, minikat
Objekt, assoziativer Array mit DB-Felddaten der kategorien
Tabelle.
Damit man ohne grossen Konvertierungsaufwand programmieren kann, stellt das Kategoriensichtbarkeit Modul innerhalb des kategoriesichtbarkeit
Objekts einige Membervariablen immer zur Verfügung, unabhängig davon, ob die Daten aus dem aufrufenden Bereich dies anliefern. Dies wird möglichst Performance sensitiv gemacht und kann zusätzlich via Methode set_kategorie_tabelle_felder
den eigenen Bedürfnissen angepasst werden.
Zur Programmierung der Logik wird weiter unten genauer eingegangen.
2.) Optionale Anwendung der Kategoriensichtbarkeitslogik an einem neuen Ort im Shop
Das Kategoriensichtbarkeitsmodul ist schon an sehr vielen Orten im Shop aktiv. Wenn man aber wegen Customizing an einem anderen Ort ebenfalls auf diese Funktionalität zurückgreifen möchte, so kann man dies einfach umsetzen. Wir haben folgende beiden Beispiele dazu erstellt:
Beispiel 1: Sichtbarkeit einer Kategorie überprüfen
<?php
// Sichtbarkeit einer Kategorie pruefen:
if (KATEGORIENSICHTBARKEIT_VERWENDEN && !defined('ADMIN_MODE') && modul_check('kategoriesichtbarkeit')){
$ks = static_kategoriesichtbarkeit(); // Singleton Instanz holen
if ($ks->set_kategoriesichtbarkeit($kategorie_data) == false) {
// Sichtbarkeitspruefung wurde NICHT bestanden, Kategorie soll NICHT angezeigt werden!
}
}
### Beispiel 2: Sichtbarkeit eines Artikels überprüfen
// Alternativ kann auch geprueft werden, ob ein zu pruefender Artikel (nur die Artikel-ID wird benoetigt)
// in mindestens einer sichtbaren Kategorie eingeteilt ist (aufpassen bei Performance sensitiven Bereichen!):
if (KATEGORIENSICHTBARKEIT_VERWENDEN && !defined('ADMIN_MODE') && modul_check('kategoriesichtbarkeit')){
$ks = static_kategoriesichtbarkeit(); // Singleton Instanz holen
$sichtbare_kat_des_art = $ks->get_sichtbare_kategorien_von_artikel($artikel_id,true,'',false);
if (!is_array($sichtbare_kat_des_art) || empty($sichtbare_kat_des_art)) {
// Sichtbarkeitspruefung wurde NICHT bestanden, dieser Artikel soll NICHT angezeigt werden! \...
}
}
Ausprogrammierung der Logik
Wie im Kapitel Überblick vorhin erwähnt, wird die Logik zur Sichtbarkeitssteuerung in der Datei {shopdir}/shop/kategoriesichtbarkeit.def.php
in den Methoden set_kategoriesichtbarkeit
und set_kategorie_tabelle_felder
umgesetzt.
Teil 1) Verfügbare Daten via set_kategorie_tabelle_felder(...)
immer bereithalten
Hier definiert man die in jedem Fall via SQL auszulesenden Felder der ‘kategorien’ Datenbanktabelle. Achtung: Es ist ideal, wenn für diese Felder ein Index existiert. Bitte auch bedenken, dass nicht an allen Orten alle Informationen bereitstehen. In diesem Fall muss immer zusätzlich noch die Datenbank bemüht werden… Beispieldefinition innerhalb der Methode:
<?php
return array('Kategorie_Nr','special');
Bitte lesen Sie zuerst auch noch Teil 2 und geben Sie hier nur an, was dort noch an Feldern für Ihre Umsetzung fehlt…
Teil 2) In set_kategoriesichtbarkeit(…) Sichtbarkeitslogik ausprogrammieren
In dieser Methode wird die eigentliche Logik programmiert. Der Rückgabewert entscheidet, ob der aktuelle Artikel sichtbar ist (true
) oder nicht (false
). Der Rückgabewert ist vom Typ Boolean.
Dazu schauen wir uns schrittweise genauer an, was diese Methode und das umliegende Kategoriensichtbarkeit Objekt für uns an Daten bereithält:
Als einziges Argument erhält man die Variable $kat_obj_arr
. Darin ist entweder ein assoz. Array oder ein Artikel spezifisches Objekt (siehe Kapitel 3.1, Teil 1), abhängig, von wo die Methode aufgerufen worden ist.
Folgende Membervariablen sind für die Kategoriensichtbarkeit abgefüllt verfügbar:
$this->eingeloggt
true
-> der Kunde ist eingeloggtfalse
-> der Kunde ist (noch) nicht eingeloggt$this->kunde_obj
- Kundenobjekt, wenn der Kunde eingeloggt ist, sonst
false
$this->kundengruppe_id
- Kundengruppen-ID (0 -> standard)
$this->kunden_nr
- Kunden-Nr, wenn der Kunde eingeloggt ist und eine Kundennummer hat, sonst Leerstring
$this->kunden_id
- Kunden-ID, wenn der Kunde eingeloggt ist, sonst Leerstring
“Pointer” auf vorhandene Kategoriedaten
Folgende Membervariablen sind an dieser Stelle abgefüllt verfügbar und repräsentieren Pointer auf die Kategoire, die direkt beschrieben werden können:
$this->kat_id
- Kategorie-ID
$this->kat_nr
- Kategorie-Nummer
$this->special
- special Zusatzfeld
Zugriff auf alle Kategoriedaten
Zugriff auf das vollständige Kategorie Objekt ist wie folgt möglich:
$this->kat_obj
- Kategorie-Objekt
Performance-Hinweis
Wenn Felder verwendet werden, welche nicht schon via bestehendem SQL ausgelesen werden, wird für jede Überprüfung eine getKategorie(...)
-Abfrage laufen lassen, was die Performance beeinflusst.
Info: Bei aktivierter Spalten basierter Mehrsprachigkeit (default seit PepperShop v.3.1) und aktiver Fremdsprache werden Kategoriedaten meistens (!) in der lokalisierten Sprache zurückgegeben, bitte vorsichtig auf diese Daten prüfen (Name
, Beschreibung
, Tab_text
- Details siehe util.php
Datei).
Advanced
Wichtig: Unterkategorien werden nicht automatisch auch unsichtbar, bloss, weil man die übergeordnete Kategorie im Baum entsprechend markiert hat.
Die Methode set_kategoriesichtbarkeit
wird von den verschiedensten Stellen aus im Shop aufgerufen, da die Kategoriensichtbarkeit dicht unterhalb des Präsentation-Layers implementiert worden ist. Da die verschiedensten Stellen auch jeweils verschiedene Daten eines zu prüfenden Artikels bieten, wird oft ein assoziativer Array mit Teildaten eines Artikels in $kat_obj_arr
übermittelt und nicht ein Kategorie Objekt. Da die Datenbankfelder anders lauten können als die Membervariablen im Kategorie Objekt ist es nicht möglich mit einem einheitlichen Zugriff auf vorhandene Daten des Artikels zuzugreifen, wenn es nicht speziell aufbereitete Daten via $this->kat_
sind. Wenn immer man dann via $this->kat_obj
auf Objektdaten zugreift wird das ganze Artikelobjekt mit der ‘teuren’ getKategorie(...)
Funktion eingelesen. Dies ist insbesondere in Schleifen mit einer grossen Anzahl an Kategorien nicht wünschenswert, vor allem, wenn die Daten doch schon in $kat_obj_arr
übermittelt worden sind.
Beispiel: Einfache Logik für Kategoriesichtbarkeitssteuerung
<?php
// Unterscheidung Kunde nicht eingeloggt / eingeloggt
if($this->kat_id == 14 && !$this->eingeloggt){
// Allen nicht eingeloggten Kunden die Kategorie mit Kategorie-ID=14 nicht anzeigen
return false;
}
Lookup
Klassendefinitionen
- Kategorie:
{shopdir}/shop/kategorie_def.php
- Unterkategorie:
{shopdir}/shop/kategorie_def.php
- minikat:
{shopdir}/shop/kategorie_vielstufig.def.php
Installation
Voraussetzungen
Um das Kategoriensichtbarkeit Modul einsetzen zu können, ist ein PepperShop ab Version 3.1 (Professional oder Connect) erforderlich.
Dateien kopieren und hochladen
Das Kategoriensichtbarkeit Modul besteht im Wesentlichen aus zwei Dateien, die man in seinen installierten PepperShop kopieren muss. Dazu entpackt man zuerst das mitgelieferte ZIP-Archiv. Es sind folgende Dateien enthalten, hier mit den Zielverzeichnissen dargestellt:
{shopdir}/shop/kategoriesichtbarkeit.def.php
{shopdir}/shop/kategoriesichtbarkeit\_helper.def.php
Die Dateien lassen sich einfach via FTP oder SCP zum Webserver hochladen. Der Platzhalter {shopdir}
steht dabei für das Shopverzeichnis auf dem Webserver, wo die Datei index.php
zusammen mit README.txt
zu finden ist.
Modulinstallation
Nach dem Kopieren der Dateien steht das Modul unmittelbar zur Anwendung bereit.
Aktivierung / Deaktivierung
Wie einleitend schon erwähnt, handelt es sich bei diesem Modul um eine headless Version. Es gibt keine Web basierte Maske zur Konfiguration oder Statusanzeige (abgesehen von der Aktivierungsanzeige in Shop-Einstellungen → Shop-Konfiguration → Module).
Es gibt eine zentrale Konfigurationssteuerung für die Aktivierung und Deaktivierung dieses Moduls:
Im Konfigurationseditor (Shop-Einstellungen - Shop-Konfiguration - Konfiguration - „Steuerungskonstanten dieses Shops ansehen und bearbeiten“ - Konfigurationseditor)
KATEGORIENSICHTBARKEIT_VERWENDEN
|false
- Wenn das Kategoriensichtbarkeit Modul installiert (und konfiguriert) ist, so kann man hier mit true steuern, ob es zur Anzeigesteuerung von Kategorien und deren Artikeln im Shop verwendet wird (nur kundenseitig)
Wenn bei der Konstantendefinition von KATEGORIENSICHTBARKEIT_VERWENDEN
ein false
steht, ist das Modul deaktiviert und alle Programmierungen werden nicht verwendet. Steht dort ein true
, ist das Modul aktiv.
Support
Glarotech GmbH kann Customizing Programmierungen für dieses Modul vornehmen, aber nicht für Auswirkungen selbst erstellter Programmierungen haften, resp. dafür kostenlose Supportdienstleistungen anbieten.
Weitere Hilfe
Benötigen Sie weitere Unterstützung? PepperShop stellt Ihnen unterschiedliche Möglichkeiten zur Verfügung.
- Oft hilft ein Klick in der Administration oben rechts auf das Fragezeichen Icon. Hier erhalten Sie direkt Hilfe zum betroffenen Thema.
- Diverse Antworten finden Sie in den FAQ. Diese sind ebenfalls in der Shopadministration über Hilfe&News -> Hilfearchiv aufrufbar. Oder über unsere Homepage https://www.peppershop.com/de/services/support/faq/
- In der PepperShop Academy https://www.peppershop.com/de/services/academy/ können Sie ganz einfach und bequem diverse kostenlose Video-Anleitungen finden.
- Gerne stehen wir Ihnen auch per Mail oder Telefon zur Verfügung (CHF 195./h) support@glarotech.ch oder +41 71 923 08 58