Synchronisations-Tool
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.
PepperShop 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)
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 | email_from |
E-Mail Versand der Ergebnisse und Logfiles |
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 wirdsync_artikel_update_filter
: Filterdefinition, welche unmittelbar vor dem Aktualisieren eines bestehenden Artikels in einem Slave-Shop aufgerufen wirdsync_kategorie_insert_filter
: Filterdefinition, welche unmittelbar vor dem Anlegen einer neuen Kategorie in einem Slave-Shop aufgerufen wirdsync_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.
Mit Whitelist
Hinweis: Es werden NUR DIE ANGEGEBENEN ARTIKEL SYNCHRONISIERT!
- Neu kann man auch per Array eine Whitelist erstellen die dafür sorgt das nur diese Artikelnummern gesynced werden.
- Das Beispiel zeigt wie wir nur die Artikelnummern dvd003 und dvd004 synchronisieren.
- Anzupassende Datei:
- shop/Admin/synctool/shop_sync_config.php
// Array mit Artikelnummern, welche die einzigen sind, die synchronisiert werden sollen.
// Wichtig: Diese Einstellung sorgt dafür das alle anderen Artikel ignoriert werden und gilt für alle Slave-Shops.
$sync_conf['whitelist_artikel_sync'] = ['dvd003', 'dvd004'];
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:
- 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.
- 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_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);
// 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
- 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.
- 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 Standard oder Connect 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
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
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.
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 185./h) support@glarotech.ch oder +41 71 923 08 58
-
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. ↩︎
-
Modul: Herstellerangaben zum Artikel: https://www.peppershop.com/de/alle-funktionen/sortiment/herstellerangaben/ ↩︎