Synchronisations-Tool

Benötigte Lesezeit: 9 Minuten


Einleitung

Viele Shopsysteme arbeiten mit einem Mandanten Konzept um weitere (Sub-)Shops zu verwalten. Das Mandantenkonzept hat aber seine Grenzen, vor allem, wenn es in geografisch verteilte Systeme mit unterschiedlichen Anforderungen geht.

PpepperShop bietet mit dem Synchronisationstool eine Umsetzung auf Basis eines zentral verwalteten, synchronisierten Shop-Netzwerks an. Hierbei behalten die Shops im Netzwerk alle Freiheiten eines einzelnen, selbstständigen Webshops:

  • Betrieb auf eigener Rechner Infrastruktur
  • rechtlich völlig unabhängig agieren, z.B. mit eigenen Trust-Konzepten, rechtlichen Dokumenten und anderen Anforderungen für spezifische Einsatzzwecke in der jeweiligen geografischen Region
  • Eigene Anbindungen verwenden und aktivieren
  • komplett eigene Designumsetzungen, Module und Programmierungen
  • ein eigenes Artikelsortiment mit Kundenstamm pro Shop pflegen

Zusammen mit den Vorteilen der Synchronisation:

  • Stammartikel und deren Kategorien werden übermittelt und automatisch aktualisiert
  • Lagerbestandsänderungen werden im Shop-Netzwerk untereinander ausgetauscht (z.B. Verkäufe)

Abbildung 1: Änderungen von Lagerbeständen

Abbildung 2: Artikel und Kategorien

Konfiguration

Konfigurationsdatei bearbeiten

Verwenden Sie zum Bearbeiten der Konfigurationsdatei bitte einen Editor, der UTF-8 encodierte PHP-Dateien mit UNIX Zeilenumbrüchen bearbeiten kann, z.B. Notepad++ auf Windows.

Öffnen Sie folgende Datei zur Bearbeitung

{shopdir}/shop/Admin/synctool/shop_sync_config.php

Slave-Shops erfassen / verwalten

Vor der ersten Inbetriebnahme gibt es einen auskommentierten Block mit Beispielanweisungen für Slave-Shop Konfigurationen (unterhalb des Titels ‘Setup der Slave-Shops’). Pro Shop muss man die MySQL Datenbankconnection bereitstellen:

$conn = array(
    'label'    => 'slave1',
    'host'     => 'localhost',
    'db-name'  => 'slave1_db',
    'db-user'  => 'slave1_usr',
    'db-passw' => 'slave1_pwd'
);
$dbs->add_connection($conn);

Die in roter Farbe hervorghobenen Elemente stellen die anzupassenden Bereiche dar. Bitte auch sicherstellen, dass der Block keine zwei Slashes am Zeilenanfang mehr hat (//).

Nachdem die Blocks für die Slave-Shops erstellt worden sind, gibt man in folgender Zeile die Labels an. Diese Shops referenzieren das Feld ‘label’ der einzelnen Slave-Shop-Konfigurationsblocks und stehen für aktive Shops im Shop-Netzwerk:

// Aktivierung der Slave-Shops
$slaveshops = array('slave1', 'slave2', 'slave3');

Globale Konfigurationsparameter

Das Synchronisationstool bietet in derselben Datei unterhalb der Slave-Shops Konfiguration noch weitere Steuerungsparameter.

Konfigurationsparameter Beschreibung
output Soll die Ausgabe bei einem Synchronisationsvorgang in Plain/Text oder in HTML erfolgen. Standard = html
produktebilder_pfad Dateipfad zu den lokal vorhandenen Produktebildern
logpath + logfile Pfad und Dateiname zur Logdatei für die Operationen
debug_show + debug_email Debugmeldungen aktivieren und/oder emailen
`email_senden email_to
lager_sync_nach_bestellung Lagerbestände nach Bestelleingang / -storno in alle Shops on-the-fly synchronisieren

Log Viewer Modul

Es empfiehlt sich, die Logdateien des Synctools zu prüfen. Dazu kann man das kostenlose und immer mitgelieferte PepperShop Modul ‘Log Viewer’ installieren und benutzen: Shop-Administration → Module → Module verwalten → Log Viewer wählen + installieren.

Filter

Konfiguration

Ein wichtiger Bestandteil des Synchronisationstools sind die programmierbaren Filter, welche zwischen der Synchronisation der Stammdaten vom Master-Shop zum jeweiligen Slave-Shop greifen. Hierzu definiert man Filter.

Filter werden mittels Ausprogrammierung von vorgegebenen Synchronisationstool PHP-Funktionen umgesetzt. Hierzu öffnet man die Datei {shopdir}/shop/Admin/synctool/shop_sync_func.php und findet darin vier Funktionen vor:

  • sync_artikel_insert_filter: Filterdefinition, welche unmittelbar vor dem Anlegen eines neuen Artikels in einem Slave-Shop aufgerufen wird
  • sync_artikel_update_filter: Filterdefinition, welche unmittelbar vor dem Aktualisieren eines bestehenden Artikels in einem Slave-Shop aufgerufen wird
  • sync_kategorie_insert_filter: Filterdefinition, welche unmittelbar vor dem Anlegen einer neuen Kategorie in einem Slave-Shop aufgerufen wird
  • sync_kategorie_update_filter: Filterdefinition, welche unmittelbar vor dem Aktualisieren einer bestehenden Kategorie in einem Slave-Shop aufgerufen wird

In jeder Funktion können Filter realisiert werden, die Daten auf dem Weg vom Master-Shop zum jeweiligen Slave-Shop auf Basis von PHP-Logik verändern, löschen oder hinzufügen können.

Nur gewisse Artikel synchronisieren

Falls gewisse Artikel in einigen Slave-Shops nicht aktiv sein sollen, kann man folgende Insert-Filter Programmierung verwenden. Die Idee dahinter ist, dass die Artikel sehr wohl synchronisiert werden, aber mit einem inaktiven Zustand (aktiv_von, aktiv_bis), siehe rot hervorgehobener Bereich:

// -------------------------------------------------------------------
// Funktion : sync_artikel_insert_filter
// Zweck    : Filterfunktion fuer Artikel, die in den Slaveshops neu eingefuegt werden.
//            Manipulationen (z.B. Preis ueberschreiben) koennen direkt im Artikelobjekt
//            durchgefuehrt werden.
// Gruppe   : synctool
// Argumente: $artikel_obj -> Pointer auf Artikelobjekt
//            $slave_shop  -> Label vom Slaveshop, in den der Artikel eingefuegt werden soll
//            $artikel_lang_arr -> Pointer auf assoziativen Array mit lokalisierten Feldern des Artikel vom Master
// Rueckgabe: keine
function sync_artikel_insert_filter(&$artikel_obj, $slave_shop, &$artikel_lang_arr){
    // Bildlinks aufbereiten
    global $shop_sh_obj; // Shopsync-Objekt sichtbar machen
    $shop_sh_obj->getBildlinks_sync($artikel_obj);

    // DB-Language-Field-Spalten, die im Slave-Shop nicht existieren, aus $artikel_lang_arr entfernen
    $shop_sh_obj->prepare_artikel_lang_arr($artikel_lang_arr,$slave_shop);

    // Datenmanipulation hier einfuegen
// XXX> BEGIN synctool_filter_funktionen: Gewisse Artikel als inaktiv markieren, hier mittels ZF1+2 Steuerung
    switch($slave_shop) {
        case 'slave1':
            // Zusatzfeld_1: Dieser Artikel ist in slave1 verfuegbar
            // Falls Zusatzfeld_1 != 'Y': Artikel in slave1 als deaktiviert markieren
            if (strtoupper($artikel_obj→Zusatzfeld_1) != 'Y') {
                // Artikel in slave1 deaktivieren
                $artikel_obj->aktiv_von = '0000-00-00 00:00:00';
                $artikel_obj->aktiv_bis = '0000-00-00 00:00:00';
            }
            break;
        case 'slave2':
            // Zusatzfeld_2: Dieser Artikel ist in slave2 verfuegbar
            // Falls Zusatzfeld_2 != 'Y': Artikel in slave2 als deaktiviert markieren
            if (strtoupper($artikel_obj→Zusatzfeld_2) != 'Y') {
                // Artikel in slave2 deaktivieren
                $artikel_obj->aktiv_von = '0000-00-00 00:00:00';
                $artikel_obj->aktiv_bis = '0000-00-00 00:00:00';
            }
            break;
        default;
            // Nichts tun bei unbekannten Slave-Shops
    }// End switch
// <XXX

} // end function sync_artikel_insert_filter

Erklärung: In den cases werden die Synchronisationstool Slave-Shop Setup Labels der jeweiligen Shops eingegeben. In diesem Beispiel werden zwei Slave-Shops (slave1 und slave2) synchronisiert. Im Artikelzusatzfeld 1 wird für den Slave-Shop slave1 gesteuert, ob dieser aktiv synchronisiert wird oder nicht – analoges gilt für den slave2-Shop und das Artikelzusatzfeld 2.

Preisdaten nicht überschreiben bei Update

Der folgende Update-Filter verhindert, dass bei einer Artikel-Aktualisierung neue Preisangaben vom Mastershop übernommen werden. Dies ermöglicht eine initiale Übermittlung des Preises und gewährt den jeweiligen Slave-Shops eine Preisfreiheit, so dass selbst Preise festgelegt werden können.

Die Artikelsynchronisation erfolgt in zwei Schritten:

  1. Erst-Synchronisation: Ein (neuer) Artikel wird zum ersten Mal in einen Slave-Shop übermittelt, wo er zuvor nicht existiert hat. Hierbei wird ein Datenbank-Insert verwendet und der Artikel mit seinen Komponenten wird dort neu angelegt.
  2. Aktualisierung des Artikel Datensatzes: Hierbei geht es um Artikel, welche bereits im Slave-Shop existieren und nur aktualisiert werden sollen.

    // -------------------------------------------------------------------
    // Funktion : sync_artikel_update_filter
    // Zweck    : Filterfunktion fuer Artikel, die in den Slaveshops aktualisiert (update) werden.
    //            Manipulationen (z.B. Preis ueberschreiben) koennen direkt im Artikelobjekt
    //            durchgefuehrt werden. Im zweiten Argument ($slave_artikel_obj) befindet sich
    //            das mit den aktuellen Werten des Slaveshops abgefuellte Artikelobjekt.
    // Gruppe   : synctool
    // Argumente: $artikel_obj -> Pointer auf Artikelobjekt
    //            $slave_artikel_obj -> Artikelobjekt mit Daten des Artikels vom Slaveshop
    //            $slave_shop  -> Label vom Slaveshop, in den der Artikel eingefuegt werden soll
    //            $artikel_lang_arr -> Pointer auf assoziativen Array mit lokalisierten Feldern des Artikel im Master
    //            $slave_artikel_lang_arr -> Array mit lokalisierten Felder des Artikel vom Slaveshop
    // Rueckgabe: keine
    function sync_artikel_update_filter(&$artikel_obj,$slave_artikel_obj,$slave_shop,&$artikel_lang_arr,$slave_arti­kel_lang_arr){
    // Bildlinks aufbereiten
    global $shop_sh_obj; // Shopsync-Objekt sichtbar machen
    $shop_sh_obj->getBildlinks_sync($artikel_obj);
    
    // DB-Language-Field-Spalten, die im Slave-Shop nicht existieren, aus $artikel_lang_arr entfernen
    $shop_sh_obj->prepare_artikel_lang_arr($artikel_lang_arr,$slave_shop);
    
    // folgende Codesequenzen zeigen, wie einzelne Daten im Artikel-Objekt ($artikel_obj)
    // mit den aktuellen Werten des Artikels im Slaveshop ueberschrieben werden koennen.
    // Dies bewirkt, dass die Artikeldaten bei einem Update des Artikels nicht mit den Werten
    // aus dem Mastershop ueberschrieben werden (z.B. wenn die Preise im Slaveshop manuell
    // bearbeitet werden).
    //XXX> BEGIN synctool_filter_funktionen Preise nicht ueberschreiben
    // Artikelpreis nicht ueberschreiben
    // ---------------------------------
    $artikel_obj->preis = $slave_artikel_obj->preis;
    
    // Aktionspreis nicht ueberschreiben
    // ---------------------------------
    $artikel_obj->aktionspreis = $slave_artikel_obj->aktionspreis;
    
    // Staffelpreise nicht ueberschreiben
    // ----------------------------------
    $artikel_obj->staffelpreise = $slave_artikel_obj->staffelpreise;
    
    // Variantenpreise nicht ueberschreiben
    // ------------------------------------
    foreach($artikel_obj->variationen as $key => $value){
        $artikel_obj->variationen[$key] = $slave_artikel_obj->variationen[$key];
    }
    
    // Optionspreise nicht ueberschreiben
    // ----------------------------------
    foreach($artikel_obj->optionen as $key => $value){
        $artikel_obj->optionen[$key] = $slave_artikel_obj->optionen[$key];
    }
    //<XXX
    
    // Datenmanipulation hier einfuegen
    
    } // end function sync_artikel_update_filter

Erklärung: Im rot hervorgehobenen Bereich der angepassten Update-Funktion, sieht man, dass die jeweiligen Preisangaben vor der Update-Operation mit den Daten des Slave-Shops populiert werden. Somit kommt es nicht zu einer Anpassung mit neuen Masterdaten.

Synchronisation

Arten der Synchronisation

  1. Artikel- und Kategorien vom Master-Shop zu den Slave-Shops synchronisieren:
    Mit Klick auf Import / Export → Shop-Synchronisation → Synchronisation starten, mit anschliessender Bestätigung wird diese Art der Synchronisation gestartet. Dabei werden die hinterlegten Filter für Artikel und Kategorien angewendet.
  2. Lagerbestandsänderung von Artikeln im Shop-Netzwerk verteilen:
    Wenn in der Konfiguration des Synchronisationstools die Einstellung lager_sync_nach_bestellung = true hat, werden bei Bestellungseingängen, -stornos und Wareneingängen1 in allen Shops Meldungen via Master-Shop an alle anderen Instanzen im Shop-Netzwerk propagiert. Die Lagerbestände bleiben somit aktuell.

Lagerbestand Synchronisation

Damit diese Synchronisation aktiv ist muss mindestens einmal via Import / Export → Shop-Synchronisation → Synchronisation starten und anschliessender Bestätigung ein Synchronisationslauf der Artikel und Kategorien im Shop-Netzwerk stattfinden. Bei diesem Anlass wird die Steuerungseinstellung lager_sync_nach_bestellung = true ausgewertet und in jedem am Shop-Netzwerk teilnehmenden Shop werden in der Datenbank Steuerungsinformationen für die Lagerbestand Synchronisation hinterlegt.

Nach dem Initialen Datenaustausch ist diese Art der Synchronisation aktiv und wird von jedem Shop mit installiertem Synchronisationstool entsprechend berücksichtigt. Die Kommunikation der Shops folgt dem Schema:

Lagerbestandsänderung in Kommunikationsweg
Master-Shop Master-Shop→ Master-Shop→ Slave1
Master-Shop→ Master-Shop→ Slave2
Master-Shop→ Master-Shop→ Slaven
Slave1-Shop Slave 1 → Master-Shop
Master-Shop→ Slave2
Master-Shop→ Slaven
Slave2-Shop Slave 2 → Master-Shop
Master-Shop→ Slave1
Master-Shop→ Slaven

Wie man obiger Tabelle entnehmen kann, wird immer zuerst der Master-Shop kontaktiert und aktualisiert. Danach propagiert der Master-Shop die Änderung an alle anderen Slave-Shops. Ist der Master-Shop ausgehender Punkt der Kommunikation aktualisiert er ebenfalls zuerst sich selbst, denselben Mechanismus verwendend (HTTP(S)-POST / JSON / Hash-Secured). Sobald die Aktualisierung im Master-Shop via

HTTP angekommen ist, geschieht die weitere Verteilung im Shop-Netzwerk mittels hinterlegter MySQL-Datenbank-Connection.

Automatisch on-the-fly synchronisiert:

  • Bestelleingänge
  • Bestellungsstornos
  • Wareneingänge über die Wareneingangsmaske

Manuell synchronisiert

  • Neu angelegte Artikel
  • Gelöschte Artikel
  • Via Import-/Export-Tool importierte/aktualisierte Artikel
  • Via Business Connector/Caller importierte/aktualisierte Artikel
  • Kategorienbaumänderungen
  • Manuelle Anpassungen via Arti kelbearbeitungsmaske

Installation

Systemanforderungen

Um das PepperShop Synchronisationstool in der hier beschriebenen Form einsetzen zu können wird ein PepperShop Professional oder Enterprise ab Version 5.0.0.34 mit installiertem Synchronisationstool (optionales Modul) benötigt. Die Installation und Konfiguration erfordert u. U. PHP-Kenntnisse.

Modulinstallation: Dateien kopieren und hochladen

Abbildung 3: Shop-Synchronisation Menüpunkt

Das Synchronisationstool besteht je kundenseitig und in der Administration aus einem Modul-Verzeichnis, welches man in seinen installierten PepperShop kopieren muss. Dazu entpackt man zuerst das mitgelieferte ZIP-Archiv und kopiert diese in das nachfolgend dargestellte Zielverzeichnis:

{shopdir}/shop/module/synctool
{shopdir}/shop/Admin/synctool

Die Dateien lassen sich einfach via (S)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 der Datei README.txt zu finden ist.

Je nach Shop-Typ werden verschiedene Dateien benötigt:

Master-Shop

Der Master-Shop verwaltet die Stammartikel, synchronisiert diese mit allen Slave-Shops und ist primärer Ansprechpartner der Shops für alle Lagerbestandsanpassungen während des Betriebs. Folgende Verzeichnisse müssen in diesen Shop hochgeladen werden:

{shopdir}/shop/module/synctool
{shopdir}/shop/Admin/synctool

Slave-Shops

Folgende Verzeichnisse müssen in jeden Slave-Shop hochgeladen werden:

{shopdir}/shop/module/synctool

Modulinstallation bestätigen

Nach dem Kopieren der Dateien kann man in die Shop-Administration gehen und dort ins Menü ‘Import / Export’ wechseln. Der Menüpunkt „Shop-Synchronisation” wird neu angezeigt. Ein Klick auf diesen Menüpunkt wird mit einer Infomeldung quittiert, dass das Synchronisationstool noch nicht konfiguriert worden ist.

Screenshots

Abbildung 4: Screenshot nach aufgerufener Artikel- und Kategorien-Synchronisation

Abbildung 5: Synchronisationstool Verwaltungsmenü

Hersteller Daten

Wenn im synchronisierten Shop-Netzwerk Hersteller-Daten2 verwendet werden, so werden diese Angaben pro Artikel ab PepperShop v.5.0.0.38 synchronisiert (Artikel-Code, Lieferanten-ID und Hersteller-ID). Damit eine korrekte Zuweisung in den synchronisierten Slave-Shops funktioniert, ist es aber zwingend erforderlich, dass die Hersteller-Angaben in der entsprechenden Verwaltungsmaske über alle Shops hinweg gleich sind. Dies ist eine manuelle Aufgabe, da die Herstellerdaten selbst bislang nicht synchronisiert werden.


  1. Wareneingänge werden nur via Artikel → Lagerverwaltung → Wareneingänge manuell erfassen synchronisiert. Importe (Caller oder Import-Tool, sowie manuelle Artikelbearbeitungen) führen nicht zu einer Synchronisierung.
  2. Modul: Herstellerangaben zum Artikel: http://www.peppershop.com/webshop/hersteller-zmfunk4.html
🌶️
🔥
🌶️