Drupal in der Praxis: Sobio-Produktkatalog - Teil II

Bild des Benutzers Regina Oswald

Drupal in der Praxis: Sobio-Produktkatalog - Teil I
Drupal in der Praxis: Sobio-Produktkatalog - Teil III

Im Teil II wird der Datenimport mit diversen Modulen beschrieben.

Produktkatalog aus Daten-Feeds-Import

Herzstück ist der Produktdatenkatalog mit momentan 6000 Produkten.
Dieser Produktkatalog wird automatisch aus den Produktkdaten aktualisiert, die Händler in Affiliate-Netzwerken wie z.B. Affilinet oder Belboon zur Verfügung stellen.
Diese Daten werden in verschiedenen Formaten zur Verfügung gestellt.
Momentan werden .CSV- und .XML-Dateien importiert.

Der Aufruf der Daten geht über einen Link, der als Parameter verschlüsselte Anmeldedaten mitführt.

Die Daten haben immer wieder die gleichen Felder:

  • Artikelnummer

  • Name

  • Beschreibung

  • Deeplink in den Shop des Händlers

  • Link auf ein Produktbild beim Händler

  • Kategorie

In Drupal werden zur Verwaltung der Produktdaten drei Inhaltstypen und eine Taxonomie vorgehalten.

Inhaltstyp Händler

Hier wird der Name des Händlers eingetragen und die URL, unter der die Produktdaten für den Import bereit stehen.

Inhaltstyp Produkte

Dieser Inhaltstyp nimmt beim Daten-Feeds-Import die Daten entgegen:

  • Artikelnummer muß im System einheitlich sein. Daran wird fest gemacht, ob das Produkt neu angelegt oder aktualisiert wird

  • Name ->Titel des Nodes

  • Beschreibung -> Body des Nodes

  • Bild und Deeplink jeweils als Textfeld

  • Kategorie des Händlers

  • Kategorie als Referenz auf eigene Taxonomie Produktkategorie

Taxonomie Produktkategorie

Eine große Problematik solcher Schnittstellen in fremde Online-Shops ist die völlig unterschiedliche Verwaltung der Daten in Kategorien.
D.h. es ist notwendig, eine eigenes Kategorie-System zu schaffen und die Kategorien, die in den Händlerdaten geliefert werden, zu übersetzen.

Es wurde also eine eigenes Kategorie-System mit Unterkategorien in der Taxonomie angelegt und dieses wird bei Bedarf erweitert.

Inhaltstyp Kategorie-Übersetzung

Der Inhaltstyp hält im Titel den Kategoriebegriff eines Händlers vor, der häufig in diesem Format geliefert wird:
"Trockenfrüchte & Nüsse > Trockenfrüchte > Aprikose Neu"

Das zweite Feld enthält eine Referenz auf die eigene Produkt-Kategorie (Taxonomie).
Hinzu kommt noch eine Referenz auf den Inhaltstyp Händler.

Beim erstmaligen Import neuer Produktdaten werden die Produkte einer Kategorie "noch nicht angelegt" zugeordnet.
Diese Produkte mit dieser Kategorie werden mit einer Verwaltungs-View als CSV-Daten zur Verfügung gestellt. Extern werden diese Zuordnungen eingepflegt und die CSV-Daten danach per Feeds-import in die Kategorie-Übersetzung eingelesen.

Import-Schnittstelle konfigurieren 

Zum Import der Daten kommt das Modul Feeds in Einsatz.

Manche Produktdaten werden aus dem CSV-Format, andere aus XML importiert.
Beispielhaft sei ein CSV-Import näher dargestellt:

Basic Settings


Abrufer

Es wird HTTP Fetcher ohne weitere Einstellungen gewählt.

Parser


 

Node processor

Hier wird geregelt, daß vorhandene Einträge aktualisiert werden.
"Skip hash check" hat einen Haken, damit der Import auch gemacht wird, wenn die csv-Datei sich nach dem letzten Update nicht geändert hat.
In unserem Fall soll der Import gemacht werden, in den meisten Fällen wird es nicht nötig sein.

Unter Inhaltstyp wird geregelt, in welchen Inhaltstyp die Daten geschrieben werden.

Die Produkte sollen nie gelöscht werden.

Mapping

Hier wird die Zuordnung vorgenommen aus den Tabellen-Spalten der CSV-Datei in das gewünschte Feld des Inhaltstyps.

Entscheidend ist die Einstellung für product_id / Artikelnummer.
Diese wird zweimal importiert. Zum einen in das Feld Artikelnummer, zum anderen in ein Feld GUID, das der Feed mit liefert.

Bei letzterem Feld wird eingestellt, daß der Eintrag unique sein soll.

So wird verhindert, daß die gleiche Artikelnummer mehrfach angelegt wird.


Manipulation der Daten beim Import mit Feeds Tamper

Dieses Zusatzmodul erlaubt mit Hilfe verschiedener Plugins die Manipulation der Daten in vielfältiger Weise.

Für jedes Feld kann ein Plugin gewünscht werden.
Mehrere Plugins können kombiniert werden.

In unserem Fall gibt es verschiedene Anwendungsfälle:

Die CSV-Datei liegt beim Affilinet-Partner nicht im utf8- Format vor.
Unsere Datenbank erwartet aber utf8-Daten.

Deshalb manipulieren wir die Daten beim Einlesen mit Hilfe des PHP-Plugins.
Dieses ist nicht per Default mitgeliefert beim Tamper Modul.
Eine entsprechende Suche liefert aber mehrere freiverfügbare Plugins aus der Community.

Damit machen wir z.B. auf den Namen des Produkts eine Umwandlung mit PHP:

<?php

print utf8_encode('[name]');

?>

Tamper liefert für die Felder Ersetzungsmuster.
Wie die genau lauten, wird angezeigt, in unserem Fall [name].

Mit dem "Set-Default-Value"-Plugin von Tamper sorgen wir dafür, daß der Status des Produkts beim Import auf 1 gesetzt wird.
Ebenso wird die ID des Händlers per Default gesetzt.

Der entscheidende Einsatz von Tamper ist die Zuordnung der Kategorien.

Wir haben oben gesehen, daß es eine Übersetzung der Händler-Kategorien in Sobio-Kategorien gibt. Das PHP-Plugin von Tamper sucht mit dem gelieferten Kategorie-Begriff ob es in der Datenbank bereits eine Übersetzung gibt.
Falls ja, wird die Taxonomie-Id bei diesem Produkt als Referenz in die Datenbank geschrieben.

Falls nicht, bekommt das Produkt die Kategorie "Noch nicht angelegt" und diese Händler-Kategorie wird dann in der entsprechenden Verwaltungs-View angezeigt und bei nächster Gelegenheit übersetzt. Erst danach wird das Produkt auf der Oberfläche angezeigt.

Diese Kategorie-Übersetzung bietet also auch die Möglichkeit Produkte aus manchen Kategorien des Händlers nicht zu zeigen.

Importvorgang händisch

Da wir unter den Basic settings "Import on submission" angehakt haben, kann man den Import unter dem Menüpunkt http://www.sobio.de/import händisch importieren.
Der Link ist natürlich nur für berechtigte Rollen zugänglich.

Hier im Import-Formular kann das Trennzeichen für das CSV-Format noch mal ausgewählt werden und es wird der Link zum File eingetragen.

Automatischer Batch

Natürlich ist es das Ziel, diesen regelmäßigen Abgleich mit den Produktdaten des Händlers automatisch zu machen.

Bei entsprechender Konfiguration des Feeds könnte man das einfach über Cron regeln lassen.

Wir haben aber noch eine Anforderung, die ein kleines Modul erfordert.

Die Anforderung heißt: Alle Produktdaten sollen deaktiviert werden, wenn sie nicht im aktuellen Daten-Feed geliefert werden.
Wir wollen ja keine Produkte anzeigen, die beim Händler ausverkauft sind oder aus dem Sortiment genommen wurden.

Dazu haben wir ein kleines Modul geschrieben mit einem Cron-Hook.
Das Modul geht in einer Schleife durch unseren Inhaltstyp Händler und ermittelt die dort hinterlegten Importvorgänge mit Namen und File-Namen des jeweiligen Feeds.

Für jeden Feed wird eine feeds_batch-Operation generiert.
Diesem Batch kann eine Funktion mit gegeben werden, die beim Ereignis "Finished" aufgerufen wird.

Diese Funktion gibt success zurück, wenn der Importvorgang geklappt hat.

Eine erste Überlegung war, die Nodes für einen Händler kurz vor dem Import zu deaktivieren und nur die aktiven Nodes werden wieder mit Status=1 versehen.
Dieses Vorgehen ist jedoch fehleranfällig. Wenn der Import scheitert, wird kein Produkt mehr angezeigt.

Deshalb wird die Manipulation nun erst durchgeführt, wenn der Import erfolgreich ausgeführt wurde. Es wird festgestellt, welche Datensätze beim Import nicht angefasst wurden. Diese bekommen Status = 0.

Drupal in der Praxis: Sobio-Produktkatalog - Teil I
Drupal in der Praxis: Sobio-Produktkatalog - Teil III