osCommerce vs. xtCommerce

Vergleich zwischen dem Original und seinen Abkömmlingen

osCommerce

osCommerce ist einer der bekanntesten freien Online-Shops. Besonders beliebt ist er auf Grund der vielfältigen Erweiterungsmodule und der großen Community. Weiterhin haben sicherlich auch die zahlreichen Dienstleister zum Erfolg beigetragen, die mittlerweile zahlreiche Dienstleistungen rund um osCommerce anbieten.

Trotz der vielfältigen integrierten Funktionen und der vielen Anwender gibt es aber in osCommerce auch sehr deutliche Schwächen:

  • Die derzeit (Juni 2006) aktuelle Version 2.2 Milestone 2 erfüllt (z.T. auf Grund veränderter Gesetze und Verordnungen) in der Standardinstallation nicht die gesetzlichen Voraussetzungen für den Betrieb eines Onlineshops in Deutschland (z.B. explizite Bestätigung der AGB vor dem Kauf). An sich wäre dies nicht weiter tragisch, gibt es doch genug contributions, jedoch kommt hier der zweite Punkt dazu.
  • Die Code-Qualität und Modularisierung von osCommerce ist absolut unzureichend. Der Code ist zu großen Teilen unstrukturiert, es gibt keine automatisierten Tests und contributions müssen manuell in den Code eingebaut werden, was zeitraubend und v.a. fehleranfällig ist. Es gibt keine Erweiterungsmechanismus, über den zumindest gut abgrenzbare Module hinzugefügt werden könnten (z.B. Versandkostenberechnung, spez. Rabatte...). Das führt dazu, dass bei Sicherheitsupdates und Versionswechseln entweder alle Anpassungen erneut vorgenommen oder die Änderungen manuell in den bestehenden Shop eingebaut werden müssen. Da schon der Shop selbst als schlechtes Vorbild fungiert, verwundert es wenig, dass auch die meisten contributions grauenhaften Code enthalten.
  • Erschwerend kommt hinzu, dass in osCommerce kein Template-System verwendet, also die eigentliche Programmlogik und die HTML-Ausgabe nicht klar voneinander getrennt sind. Manchmal sind die beiden Aufgaben zumindest innerhalb der Datei sehr klar räumlich voneinander abgegrenzt, z.T. aber auch einfach wild miteinander vermengt. Jede gestalterische Anpassung macht daher die spätere Erweiterung und Aktualisierung schwer. Das nicht vorhandene Template-System ist ein Kardinalfehler, der erst in der neuen Version 3.0 beseitigt sein wird.
  • Die über über lange Zeit aktuelle Version 2.2 Milestone 2 beinhaltete einige Sicherheitslücken und war insbesondere offen für Cross-Site-Scripting.
  • Vielleicht könnte man über die obigen Schwächen noch hinwegsehen, wenn gerade eine stürmische Weiterentwicklung stattfinden würde. Allerdings ist das letzte echte Release im Juli 2003 erschienen (osCommerce 2.2 Milestone 2), nur mit einem Sicherheitsupdate im November 2005. Der Projektfortschritt lahmt also sichtbar. Auch hinter den Kulissen sieht es nicht besser aus:

In den letzten 30 Tagen (20. Mai bis 20. Juni 2006) gab es gerade ganze neun Änderungen im Repository, die allesamt sehr klein waren und auch nur die Übersetzungen betrafen. Es wurden in dieser Zeit also keinerlei Fehler behoben oder neue Funktionen hinzugefügt. Ich mache für die aktuellen Probleme bei der Entwicklung auch die schlechte Code-Qualität verantwortlich, die dafür sorgt, dass Bugfixes Nebenwirkungen haben, es viele Abhängigkeiten gibt und das manuelle Testen einfach Zeit kostet.

  • Die Übersicht über die letzten drei Monate immerhin etwas besser aus (an 18/90 Tagen wurde etwas geändert), bedenklich ist aber, dass sämtliche Änderungen nur durch hpdl (aka Harald Ponce de Leon, den Projektgründer) gemacht wurden. Das Projekt ist also im Kern offensichtlich inzwischen eine Ein-Mann-Show. Natürlich gibt es die heroischen Heldengeschichten, in denen ein begnadeter Programmiergott eine tolle Software erschaffen hat. In der Realität sind aber eigentlich alle großen Open-Source-Projekte nur durch die Zusammenarbeit sehr vieler Einzelpersonen so erfolgreich.
  • Auch die technische Basis ist angestaubt: Ein Beispiel dafür ist, dass schon REGISTER_GLOBALS=off nicht so ohne weiteres unterstützt wird.
  • Als letztes ist die mangelnde Integration der Community in den Entwicklungsprozess zu kritisieren. Auf der Homepage werden 9.551 registrierte live stores, 3.439 contributions und 101.170 Community-Mitglieder genannt (Stand 20. Juni 2006). Dies ist ein riesiges Potenzial, das aber kaum genutzt wurde. Zum Teil gab es Nutzer, die bereits ihre osCommerce-Installation auf Smarty (ein Template-System) umgestellt hatten und auch bereit waren, die Änderungen an das Projekt zurückzugeben. Dies wurde damals aber von den Core-Entwicklern nicht aufgenommen, weil sie ein eigenes Template-System verwenden wollten.

xtCommerce

Soviel zum Original: Macht xtCommerce es aber besser?

xtCommerce ist eine Abspaltung von osCommerce: Die Macher von xtCommerce haben Mitte 2003 eine Version von osCommerce genommen und selbst weiterentwickelt. Insbesondere sind diverse Erweiterungen von osCommerce direkt im Code integriert, es gibt ein brauchbares Template-System (Smarty) und das System wurde entsprechend den geltenden gesetzlichen Vorschriften umgestaltet.

xtCommerce wird von der xt:Commerce GbR weiterentwickelt, deren Geschäftsmodell insbesondere daraus besteht, dass die aktuelle Version 3.x nur für "Sponsoren" zum Download bereitgestellt wird. Das Sponsor-Dasein kostet dann 98 Euro pro Jahr. Neben dem Download gibt es auch noch spezielle Unterforen, die nur von Sponsoren betreten werden können und in denen angeblich auch die Entwickler Support gewähren.

Technisch gesehen ist xtCommerce auf jeden Fall deutlich weiter als osCommerce in der Standardinstallation. Doch sehe ich auch einige Nachteile:

  • Allgemein ist das gesamte xtCommerce-Projekt meinem Empfinden nach stark kommerzialisiert. Ich habe kein Problem damit, dass für Support Geld verlangt wird und ich kann auch verstehen, dass sich das Projekt inkl. der Bezahlung von Mitarbeitern nicht trägt, wenn es nur ein Spendenmodell gibt. Allerdings werden Fragen zur GPL immer ohne wirkliche Erklärung sehr schnell geschlossen (Beispiel 1, 2). Gleichzeitig wird Support durch die Community für 3.x aktiv unterbunden. Die Kommerzialisierung wirkt sich meinem Empfinden nach auch auf sämtliche Erweiterungen rund um xtCommerce aus - so gibt es kaum wirkliche freie Templates oder Erweiterungen, die so verteilt werden, wie das bei osCommerce üblich ist. Von den ursprünglich in osCommerce enthaltenen Übersetzungen muss jetzt Spanisch zusätzlich gekauft werden.
  • Es gibt kein allgemeines Verzeichnis für Erweiterungen, in dem die Community einfach contributions bereitstellen kann. Ab und an gibt es Kundenaufträge, bei denen ein allgemeiner verwendbares Modul herausfällt, aber keine Zeit da ist, das Modul wirklich abzurunden und auch für Support zu sorgen. So ein Modul könnte man gerne freigeben und wenn jemand daran weiter arbeiten will, kann er oder sie das gerne tun. Damit aber solche Module zuverlässig gefunden werden, braucht es ein allgemeines Repository.
  • Es gibt keine Lösung für die schlechte Code-Qualität: Zwar wurde durch das Template-System ein wesentlicher Fortschritt erzielt, aber die anderen Probleme (Übernehmen von Anpassungen bei neuen Versionen) wurden nicht gelöst. Auch die Updates (so z.B. das SP1 für 3.0.4) kommen ohne größere Erläuterungen und eigene Erweiterungen müssen nach wie vor von Hand nachgepflegt werden.
  • Durch den sehr geschlossenen Entwicklungsansatz kann die xt:Commerce GbR nicht von der Community direkt bei der Entwicklung profitieren: Wenn der Code öffentlich zugänglich wäre, würden sich viele wohl gegen den Sponsorstatus entscheiden. Entsprechend skaliert das Entwicklungsmodell aber auch viel schlechter als in einem klassischen Open-Source-Produkt: Wenn die GbR keine neuen Mitglieder einstellt, kann die Entwicklung kaum durch neue Entwickler beschleunigt werden. Natürlich könnte man Erweiterungen extern pflegen, was aber wegen der schlechten Code-Qualität und der fehlenden zentralen Anlaufstelle für Erweiterungen sehr aufwändig ist.
  • Durch das Geschäftsmodell der xt:Commerce GbR wird die Community effektiv gespalten, nämlich in Sponsoren und Nichtsponsoren. Meiner Meinung nach liegt aber der Erfolg vieler Open-Source-Software darin begründet, dass es eine große Community gibt und die Einstiegshürden besonders niedrig liegen: So kann ein technisch versierter Programmierer mit wenig Geld trotzdem wertvolle Beiträge liefern.
  • Besonders erstaunt haben mich die technischen Unsauberheiten in der Archivdatei: So sind z.B. Changelog und erläuternde Dateien ausschließlich auf Deutsch, die Umlaute sind nicht richtig kodiert, es gibt noch ein funktionsloses MACOSX-Verzeichnis und .DS_STORE-Dateien. Ich musste in 3.04 SP1 erst mal den Installer patchen, um den Shop überhaupt installieren zu können.
  • In den xtCommerce-Foren wird zum Ausprobieren auf die kostenlos erhältliche xt:Commerce 2.x verwiesen. Allerdings gibt es dem Vernehmen nach einige Sicherheitslücken in der alten Version, die auch nicht mehr gestopft werden.
  • Die Entwicklung ist durch xt:Commerce GbR quasi monopolisiert. Dabei finde ich das Erscheinungsbild in einigen Punkten semi-professionell. Ein Beispiel dafür ist http://www.xt-commerce.com/de/news/index.php?item=24 (Stand 20. Juni 2006):
    Absofort ist ein polnisches Sprachmodul für xt:Commerce 3.0.4 SP1 verfügbar.
    Die Übersetzung des Shops/Admininterfaces wurde in unserem Auftrag durch unseren Partner
    DialogTicket.com durchgeführt.
    (Qualitativ Hochwertige Übersetzung durch Muttersprachler).
    Das Modul ist gegen eine kleine Gebür erhältlich, um weiterhin neue und professionelle
    Übersetzungen zu finanzieren.
    

Die zahlreichen Rechtschreibfehler finde ich sehr peinlich ("Absofort", "Hochwertige", "Gebür"), ähnliche Fehler sind mir auch auf weiteren Seiten aufgefallen.

  • Kein ausreichendes Verständnis der Sicherheitsaspekte: Nach der Installation wurde ich erst mal gewarnt, dass einige Dateien vom Server beschreibbar seien. Aus Sicherheitsgründen sollte ich diese auf den Modus 0444 setzen (super - Konfigurationsdateien mit MySQL-Passwort für alle lesbar!). Allerdings ist die Sicherheitslogik falsch implementiert, so dass auch bei strikteren Einstellungen 0440 gewarnt wird. Auch der Betrieb unter suPHP wurde offensichtlich nicht berücksichtigt: Viele Warnungen ergeben unter Verwendung suPHP einfach keinen Sinn, weil der Benutzer logischerweise seine eigenen Dateien beschreiben kann.
  • Sehr schlechte Rechtschreibung. Ich hatte das schon weiter oben für die allg. Webseiten bemängelt, aber im Shop ist es noch viel schlimmer - als Beispiel mal die USt-ID-Konfiguration. Im Titel steht "Vat ID", darunter tauchen folgende Textfelder auf "UST ID des Shopbetreibers", "Umsatzsteuer ID Überprüfen", "Durch einschalten dieser Option werden nur geprüfte und richtige UstIDs eingetragen". Man beachte die vielen Schreibweisen für USt-ID. auf einer Seite (inkl. der restlichen Rechtschreibfehler).

Fazit

Technisch gesehen ist xtCommerce deutlich fortschrittlicher. Insbesondere das Templatesystem und die bereits integrierten contributions sorgen dafür, dass Aktualisierungen wenigstens etwas einfacher durchzuführen sind.

Rechtlich gesehen lässt sich die xt:Commerce GbR meiner Meinung nach nichts zu Schulden kommen. Allerdings bleibt auf Grund des rüden Vorgehens in den Foren mehr als nur ein kleiner Nachgeschmack, zumal die Weiterverbreitung der Software auf Grund der GPL möglich ist und es auch Seiten gibt, auf denen die Dateien zum Download angeboten werden.

Zudem betreibt die xt:Commerce GbR im Wesentlichen einen Closed-Source-Entwicklungsprozess, kann also von den klassischen Open-Source-Vorteilen nicht profitieren. Die durchgehende Kommerzialisierung von Templates, Contributions und Sprachdateien erhöht die Eintrittsbarriere weiter.

Michael Zanier weist in den Foren auch darauf hin, dass die Entwicklung auch finanziell honoriert werden müsse und inzwischen 80% des Katalog-Codes sich von osCommerce unterscheiden. Ich glaube gerne, dass alle Dateien inzwischen mehrfach verändert wurden (schon die Einführung eines Template-Systems sorgt für sehr viele Änderungen), allerdings sind viele wesentliche Teile nach einer kurzen Recherche meinerseits immernoch die selben. Als Beispiel findet sich hier im Anhang ein Vergleich der Datei checkout_shipping.php. Wie man sieht, hat sich dort wenig geändert. An vielen Stellen hat xtCommerce gleiche bzw. ähnliche Bugs wie osCommerce. Viele der eingebauten contributions existieren auch für osCommerce und wurden ursprünglich von Community-Mitgliedern unentgeltlich unter der GPL zur Verfügung gestellt.

Ich glaube nicht, dass osCommerce in den nächsten 1-2 Jahren xtCommerce ernsthaft herausfordern kann - dafür ist der technische Rückstand schon zu groß. Allerdings gebührt den osCommerce-Autoren wirklich Respekt dafür, dass sie über viele Jahre das System mit großem Einsatz weit gebracht haben. Die von ihnen gewählte GPL sorgt dafür, dass auch kein Unternehmen herkommen und das Produkt vollständig monopolisieren kann.

Andererseits sehe ich durchaus Chancen für einen xtCommerce-Community-Projekt, bei dem die Quellen des jetzigen xt:Commerce verwendet werden. Um marken- und wettbewerbsrechtlichen Problemen zu entgehen, sollte ein eigenes Template entwickelt werden und natürlich müssen auch alle Logos von xtCommerce entfernt werden. Unter einer kompetenten Projektleitung sehe ich dann aber durchaus Chancen für eine gesündere und langfristig profitablere Entwicklung.

Anhang

checkout_shipping.php

Links die osCommerce Version (2.2 Milestone 2), rechts xtCommerce 3.0.4.

 // if there is nothing in the customers cart, redirect them t   // if there is nothing in the customers cart, redirect them t
   if ($cart->count_contents() < 1) {                          | if ($_SESSION['cart']->count_contents() < 1) {
     tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));      |         xtc_redirect(xtc_href_link(FILENAME_SHOPPING_CART));
   }                                                             }
 // if no shipping destination address was selected, use the c   // if no shipping destination address was selected, use the c
   if (!tep_session_is_registered('sendto')) {                 | if (!isset ($_SESSION['sendto'])) {
     tep_session_register('sendto');                           |         $_SESSION['sendto'] = $_SESSION['customer_default_add
     $sendto = $customer_default_address_id;                   <
   } else {                                                      } else {
 // verify the selected shipping address                                 // verify the selected shipping address
     $check_address_query = tep_db_query("select count(*) as t |         $check_address_query = xtc_db_query("select count(*)
     $check_address = tep_db_fetch_array($check_address_query) |         $check_address = xtc_db_fetch_array($check_address_qu
     if ($check_address['total'] != '1') {                               if ($check_address['total'] != '1') {
       $sendto = $customer_default_address_id;                 |                 $_SESSION['sendto'] = $_SESSION['customer_def
       if (tep_session_is_registered('shipping')) tep_session_ |                 if (isset ($_SESSION['shipping']))
                                                               >                         unset ($_SESSION['shipping']);
     }                                                                   }
   }                                                             }
   require(DIR_WS_CLASSES . 'order.php');                        require (DIR_WS_CLASSES.'order.php');
   $order = new order;                                         | $order = new order();
 // register a random ID in the session to check throughout th   // register a random ID in the session to check throughout th
 // against alterations in the shopping cart contents            // against alterations in the shopping cart contents
   if (!tep_session_is_registered('cartID')) tep_session_regis | $_SESSION['cartID'] = $_SESSION['cart']->cartID;
   $cartID = $cart->cartID;                                    <
 // if the order contains only virtual products, forward the c   // if the order contains only virtual products, forward the c
 // a shipping address is not needed                             // a shipping address is not needed
   if ($order->content_type == 'virtual') {                    | if ($order->content_type == 'virtual' || ($order->content_typ
     if (!tep_session_is_registered('shipping')) tep_session_r |         $_SESSION['shipping'] = false;
     $shipping = false;                                        |         $_SESSION['sendto'] = false;
     $sendto = false;                                          |         xtc_redirect(xtc_href_link(FILENAME_CHECKOUT_PAYMENT,