Kategoriensichtbarkeit

Benötigte Lesezeit: 7 Minuten


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 eingeloggt
false -> 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 Enterprise) 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:

Datei: {shopdir}/shop/config.inc.php

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.

🌶️
🔥
🌶️