Link zur Seite: The ICONIST, obwohl was ich gemacht habe nicht direkt online gesehen werden kann.
Das Programm sammelt Produktdaten von vielen verschiedenen Anbietern. Dabei kommt ein Adapter-Konzept zum Einsatz, welches aus den unterschiedlichen Anbieterformaten eine einheitliche Repräsentation in der Datenbank ablegt. Es werden hunderttausende verschiedene Produkte importiert und aktuell gehalten. Der Import wird via Cron-Job automatisch angestoßen, kann aber auch über das Webinterface gestartet werden.
Durch einen Locking-Mechanismus wird verhindert, dass die gleiche Quelle zur selben Zeit mehrfach importiert werden kann. Der Importstatus lässt sich jederzeit, auch während des laufenden Imports, ermitteln. Er kann über das Webinterface und für den Administrator mit dem Terminal abgefragt werden. Der Importer erkennt Änderungen an den einzelnen Produkten, sowie die Löschung von Produkten durch den Anbieter.
Die Redakteure wählen Produkte zur weiteren Auswahl und zur Anreicherung der Daten aus. Das Webinterface bietet zahlreiche Filter, um der großen Datenmenge Herr zu werden. Neben sehr einfachen Filteroptionen wie »Shop« oder »Preisspanne« steht eine Stichwortsuche und ein Filter für Kategorien zur Verfügung. Die von Anbieter zu Anbieter verschiedenen Kategorien können auf einem einheitlichen Kategoriebaum im Kurationsmodul abgebildet werden. Der Kategoriebaum kann im Webinterface erstellt werden, die Zuordnung von fremden Kategorien auf eigene Kategorien wird von einem Redakteur durchgeführt.
In der Datenbank kommen zwei Konzepte zum Darstellen des Kategoriebaums gleichzeitig zum Einsatz: eine Adjazenzliste, das heisst jede Kategorie kennt ihre Elternkategorie. Damit ist die Verwaltung des Baumes recht einfach umsetzbar. Ausserdem werden auch die Informationen des Nested-Set Models mit den Kategorien abgelegt. Damit ist die Abfrage des Baumes sehr performant und einfach möglich.
Für den Kurationsprozess habe ich eine kleine JavaScript Anwendung geschrieben, die, durch die Verwendung von AJAX, Ladezeiten deutlich verkürzt und die Serverprogrammierung stark vereinfacht hat. Beispielsweise erfolgt die Verwaltung des Anwendungsstatus im Client und musste daher nicht mit serverseitigen Sessions umgesetzt werden.
Der Servercode ist mit PHP 5 geschrieben. Ich habe Composer mit Symphony 2 als Framework verwendet und habe einiges selbst geschrieben. Im Webinterface kommen RequireJS und jQuery zum Einsatz, und auch eine ganze Hand voll eigener Module.