Anzeige
Anzeige
Software & Entwicklung
Artikel merken

Neue Extension verbindet Open-Source-Shop-System mit TYPO3: Magento-Shop in TYPO3 integrieren

Mit Magento gibt es seit Ende März 2008 ein hoffnungsvolles E-Commerce-System, das derzeit dabei ist, die etwas in die Jahre gekommenen Platzhirsche osCommerce und xt:commerce abzulösen. Magento verbindet eine moderne, auf dem Zend Framework aufbauende Architektur mit einer extrem großen Funktionsvielfalt. Dieser Artikel zeigt auf, wie eine mögliche Integration des Shop-Systems in TYPO3 funktionieren kann und stellt die dazu entwickelten Erweiterungen vor.

11 Min. Lesezeit
Anzeige
Anzeige

Im Internet wird kontrovers über Magento [1] diskutiert. Das System unterscheidet sich von anderer Online-Shop-Software durch eine zeitgemäße Architektur, wohldefinierte Schnittstellen und sehr hohe Funktionsvielfalt. Darüber hinaus schafft es Magento, bei den Punkten Erweiterbarkeit, Wartbarkeit, Skalierbarkeit und Flexibilität zu punkten.

Anzeige
Anzeige

Diese positiven Eigenschaften werden jedoch mit hohen Anforderungen an die Betriebsumgebung erkauft, sodass Magento de facto nicht auf einem Standard-Shared-Hosting-Paket zum Laufen gebracht werden kann. Außerdem ist die Dokumentation des Systems bisher noch mangelhaft, sodass Expertenrat oft die einzige, manchmal teure Alternative darstellt. Dass sich dies in naher Zukunft ändern wird, scheint derzeit eher fraglich.

In der Vergangenheit wurde darüber hinaus die Performance von Magento kritisiert. Diese hat sich jedoch seit Version 1.1 deutlich verbessert. Prinzipiell sollte man Magento nie ohne Aktivierung der Caching-Mechanismen betreiben, da die Interpretation der Konfiguration (XML) mit hohem Rechenaufwand verbunden ist.

Anzeige
Anzeige

Insgesamt lassen sich durchaus Parallelen zwischen Magento und TYPO3 finden: Beide setzen auf hohe Flexibilität, Funktionalität und Qualität und beide stellen dementsprechende Anforderungen an das System und an diejenigen, die das System konfigurieren oder erweitern. Die Kopplung von TYPO3 und Magento führt aus Sicht der Autoren die besten Open-Source-Lösungen für Enterprise-Content-Management und Enterprise-E-Commerce zusammen.

Anzeige
Anzeige

Technischer Überblick

Magento ist eine reine PHP5-Anwendung. Kapselung, Interface- und Klassenvererbung, der Gebrauch von statischen Funktionen und diversen Design-Patterns machen die Anwendung nachvollziehbar und erweiterbar. Die Architektur von Magento wurde hierbei an drei maßgeblichen Zielen ausgerichtet:

  • Flexibilität: Die Anwendung muss sich problemlos an alle unternehmensspezifischen Anforderungen anpassen lassen.
  • Aktualisierbarkeit: Trotz Anpassungen müssen Aktualisierungen des Kerns stets möglich bleiben.
  • Geschwindigkeit und Sicherheit: Es werden höchste Ansprüche an Performance und Sicherheit des Codes gestellt.

Um nicht komplett bei Null beginnen zu müssen, baut die Applikation auf dem Open-Source-PHP-Framework Zend Framework [2] auf. Dieses stellt eine relativ lose Sammlung von PHP-Komponenten und Klassen zur Verfügung. Magento nutzt hierbei die Komponenten Acl (Rechteverwaltung), Cache, Currency, Date, Db, Feed, Http, Locale, Log, Mail, PDF, Translate, Validate sowie Service. Für die Zukunft ist der Einbau weiterer Komponenten geplant, die zum Release-Zeitpunkt von Magento noch keine Marktreife erlangt hatten. Die Verwendung standardisierter Klassen für verschiedenste Anwendungsgebiete garantiert hohe Verlässlichkeit und ständige Weiterentwicklung. Außerdem kann ein Entwickler, der selbst mit dem Framework arbeitet, relativ schnell die Funktionsweise von Magento nachvollziehen.

Anzeige
Anzeige

Ebenfalls vom Zend Framework übernommen wurde die Flusskontrolle, die einen HTTP-Request nach einem vorgegebenen Schema verarbeitet und dabei spezifischen Router-, Dispatcher- und Controller-Klassen übergibt. Insgesamt entspricht dieses Vorgehen dem Model-View-Controller-Pattern [3], wobei Magento folgende Objektklassen unterscheidet:

  • Models übernehmen die Manipulation von Daten, wobei diese vom System flexibel in Datengruppen eingeteilt und untereinander verlinkt werden.
  • Die Controller enthalten die Geschäftslogik, mit der sie die Benutzeranfrage auswerten und anschließend die Verarbeitung anstoßen.
  • Die Ausgabe wird bei Magento von so genannten Blocks übernommen. Hierbei handelt es sich um eine verschachtelte Menge von Objekten, welche die Ausgaben koordinieren. Ein Block kontrolliert hierbei jeweils ein Template-File.

Die Trennung erhöht die Übersichtlichkeit der einzelnen Komponenten und die Flexibilität bezüglich zukünftiger Änderungen.

Magento verfügt darüber hinaus über zwei verschiedene Bootstrap-Modi: Während der app()-Modus ausschließlich die Konfiguration lädt, werden im run()-Modus darüber hinaus alle Eingabedaten verarbeitet und entsprechende Ausgaben generiert. Der app()-Modus eignet sich also sehr gut, um das Framework zu initialisieren und anschließend die Verarbeitung nach eigener Maßgabe ablaufen zu lassen.

Anzeige
Anzeige

Magento-Module

Extensions heißen in der Magento-Welt Module. Diese haben einen relativ strikt vorgegebenen Aufbau, der sich bereits an der Ordnerstruktur ablesen lässt:

  • Block (Rendering-Objekte)
  • Helper (Hilfsobjekte)
  • Model (Datenbank-Modelle)
  • controllers (Action-Controller)
  • etc (Konfiguration)
  • sql (Datenbank-Schemata)

Aus Entwicklersicht ist diese vorgegebene Struktur durchaus zu begrüßen, da durch die Verbesserung der Ordnung auch fremde Extensions einfacher analysiert werden können. Einzig notwendiger Ordner ist „etc“, der das Konfigurations-XML enthält, das eigene und fremde Funktionalitäten aktivieren, einstellen und ändern kann. Denkbar wäre also auch ein kundenspezifisches Modul, das ausschließlich alle anderen Module an die Gegebenheiten des Projekts anpasst.

Eine weitere Einteilung nimmt Magento zwischen den Modulen vor:

Anzeige
Anzeige
  • Core-Module stammen von Varien selbst, sodass für die Funktionalität gebürgt wird. Alle Core-Module befinden sich im Namensraum „Mage“. Für Entwickler sollte eine Änderung oder Verwendung des Namensraums ebenso tabu sein wie die Änderung von System-Extensions in TYPO3 (Ein Namensraum geht hierbei noch nicht so weit wie in PHP Version 5.3 – viel mehr geht es hier um Namen von Ordnern und Klassen!).
  • Local- oder Community-Module stellen Erweiterungen des Systems dar, die von Magento-Partnern oder sonstigen Entwicklern erstellt wurden, um das System Shop-spezifisch zu erweitern. Namensräume sollten dem jeweiligen Firmennamen oder einem sonstigen eindeutigen Alias entsprechen, um Namensduplikate zu vermeiden. Alle Erweiterungen, die im Rahmen des Projekts an Magento durchgeführt werden, verwenden demnach den Namensraum „Flagbit“.

Vorüberlegungen zur Integration

Im Rahmen der Vorüberlegungen kamen mehrere Möglichkeiten in Betracht, Magento mit TYPO3 zu verbinden. Als Grundlage für die Entscheidung diente folgende Ausgangslage: Es wird bereits eine TYPO3-Seite mit einem Kundenstamm für einen Login-Bereich betrieben. Diese Kunden sollen nun, ohne die Seite verlassen oder sich erneut anmelden zu müssen, in der Lage sein, Produkte zu bestellen. Dies soll jedoch nicht ausschließen, dass sich neue Benutzer auf einer autarken Webshop-Seite (keine Ausgabe via TYPO3) an demselben System registrieren und anmelden können, falls dies vom Betreiber gewünscht wird.

Zunächst schien eine Anbindung an die Magento API [4] naheliegend. Hierbei handelt es sich um eine SOAP- oder XML/RPC-Schnittstelle für Zugriffe auf den Produktkatalog, Bestellungen und Kundendaten. Diese eignet sich beispielsweise perfekt, um Warenwirtschafts- oder Customer-Relationship-Management-Systeme an das Shopsystem anzubinden. Aus Sicherheitsgründen gibt es in der API jedoch keine Möglichkeit, Bestellungen aufzugeben, sodass spätestens beim „In den Warenkorb legen“ ein Wechsel in den Shop nötig wäre.

Darüber hinaus müsste man den Aufwand der zusätzlichen Implementierung der Anzeigelogik und die doppelte HTML-Pflege in Kauf nehmen, da Magento auf PHP-basierte Templates mit Rekursion und TYPO3 auf Marker und verschachtelte Subparts setzt. Hinzu kommt noch die störende Verzögerung, die durch Warten auf die HTTP-Requests via SOAP erzeugt wird.

Anzeige
Anzeige

Wenn man zudem eine echte Trennung zwischen Shop und Webseite
aufrechterhielte, wäre es notwendig, verschiedene
Seitenelemente zwischen den Systemen auszutauschen. Prominenteste
Beispiele wären Menüs, die in TYPO3 dynamisch erweitert und angepasst
werden können. Im schlimmsten Fall würde man die Links zu allen
TYPO3-Seiten statisch im Template hinterlegen.

Aus diesen Gründen hat sich das Entwicklerteam im Vorfeld gegen diese Variante entschieden. Darüber hinaus arbeitet bereits ein Team um Georg Ringer und Steffen Kamper an einer derartigen Anbindung [5].

Technische Idee der Integration

Die erwähnten Punkte haben das Entwicklerteam im Projekt „TypoGento“ dazu bewogen, eine andere Integrationsvariante in Betracht zu ziehen: Magento nativ über PHP in eine TYPO3-Extension einzubinden. Dies funktioniert nur, wenn beide Systeme in einer gemeinsamen, entsprechend potenten Systemumgebung laufen, da beide Systeme nicht zu sparsam mit Ressourcen umgehen.

Anzeige
Anzeige

Über ein Frontend-Plugin mit verschiedenen Konfigurationsmöglichkeiten können so verschiedene Elemente (Produktlisten, Warenkorb, Mini-Warenkorb, Checkout etc.) des Shops in eine beliebige Seite einer TYPO3-Instanz eingefügt und mit anderen TYPO3-Inhaltselementen gemischt werden. Das Rendering der Elemente übernimmt hierbei Magento, sodass die Pflege der Ausgabe in Magento selbst stattfinden kann – im Gegensatz zu TYPO3 ist Magento hierfür ausgelegt und optimiert. Für den Benutzer des Shops erscheint die Ausgabe wie die eines herkömmlichen TYPO3-Plugins; alle Parameter werden zwischen TYPO3 und Magento übersetzt und können so über RealURL zu entsprechenden Adressen umgewandelt werden.

Um dem TYPO3-Admin die Arbeit zu vereinfachen, wird der Katalog via Magento-API an das TYPO3-Backend angebunden, um dort auf alle verfügbaren Artikel oder Kategorien zugreifen zu können. Er kann dann aus der Liste der im Shop verfügbaren Produkte und Kategorien direkt die anzuzeigenden Informationen auswählen. Auch dem TYPO3-Admin wird somit nicht direkt klar, dass es sich nicht um eine TYPO3-interne Extension handelt. Alle für die Anzeige der Produkte notwendigen Einstellungen kann der Redakteur in TYPO3 steuern. Die Pflege von Produkten, Preisen und Ähnlichem wurde bewusst nicht in das TYPO3-Backend übernommen, da das Shop-Backend von Magento dies bereits optimal löst und ein Nachbau mit einem hohen zusätzlichen Aufwand verbunden gewesen wäre, der sich an keiner Stelle rechnet.

Die beschriebenen Vorgänge funktionieren nur, wenn man sowohl auf Magento- als auch auf TYPO3-Seite jeweils Erweiterungen vornimmt. Um die Schnittstellen auch in weiteren Systemen (nicht zuletzt auch TYPO3 5.0) einsetzen zu können, wird ein Großteil der Funktionalität auf Magento-Seite realisiert. Bei der Realisierung aller Erweiterungen sollten prinzipiell drei Regeln eingehalten werden:

Anzeige
Anzeige
  • Es sollte so wenig wie nur möglich an den Systemen angepasst werden.
  • Sowohl TYPO3 als auch Magento sollten in jedem Fall aktualisierbar bleiben.
  • Magento sollte nach Möglichkeit weiter als Standalone-Lösung außerhalb von TYPO3 funktionieren.

Die TYPO3-Extension

Auf TYPO3-Seite wurde ein Frontend-Plugin mit dazugehörigem Backend-Interface eingefügt. Das Backend-Interface ist via Magento-API an das E-Commerce-System angebunden und kann dem Redakteur so flexibel und intuitiv Produkte und Kategorien zur Ansicht anbieten. Auf das Backend soll im Rahmen dieses Artikels jedoch nicht näher eingegangen werden.

Interessanter ist da schon das Frontend-Plugin. Dieses baut die Verbindung zu Magento auf, indem es die „Mage“-Klasse und ein eigenes Core-Model auf Magento-Seite initialisiert. Diesem übergibt es, je nach Situation, die Parameter aus der Benutzerinteraktion oder die Einstellungen, die der Redakteur im Backend getätigt hat, an den dispatch-Vorgang.

Aus Performance-Gründen wird der Verarbeitungsprozess in Magento prinzipiell nur einmal durchgeführt. Dies muss in zwei Situationen beachtet werden. Auf einer Seite kann prinzipiell nur ein Shop-Element hinterlegt werden, dessen Verarbeitungsparameter über TYPO3 gesteuert werden sollen. Dies verhindert die gleichzeitige Anzeige von zwei Produkt-Detailseiten, da hier zwei Parameter an Magento übergeben werden müssten. Auch eine Produktanzeige und die gleichzeitige Verarbeitung einer Benutzereingabe sind nicht möglich.

Es gibt jedoch auch Elemente in Magento, die keine separaten Parameter benötigen. Prominente Beispiele sind der Mini-Warenkorb sowie in Magento definierte Produkt-Teaser. Insgesamt stellt dies nur bedingt eine Einschränkung dar, da die gleichzeitige Anzeige zweier zentraler Shopinhalte die Besucher einer Seite eher verwirren würde.

Wenn mehrere Plugins per Plugin oder TypoScript in einer Seite eingebunden sind, muss unter Umständen auf die Reihenfolge der Bearbeitung geachtet werden. Das ist wichtig, um etwa zu verhindern, dass der dispatch-Vorgang durch das erste Plugin ohne Parameter gestartet wird, um beispielsweise den Mini-Warenkorb anzuzeigen, während innerhalb der Seite ursprünglich noch eine Kategorie-Übersicht angezeigt werden sollte. Hierfür durchsucht das Plugin die aktuelle Seite nach weiteren Shop-Content-Elementen, um potenziell deren Parameter zu übernehmen.

Zu beachten ist hierbei, dass das erstgefundene Content-Element mit Parametern genutzt wird und darüber hinaus keine TypoScript-Elemente des Plugins beachtet werden. In Zukunft wäre eine intelligentere Prüfung mit Priorisierung erstrebenswert.

Damit die Verarbeitung von Magento an die Anzeige von TYPO3 angepasst werden kann, wird dem Magento-Modul ein TYPO3-Content-Objekt übergeben, um zum Beispiel alle Links an den TYPO3-Stil anzupassen und über RealURL rendern zu können.

Das Magento-Modul

Auf Magento-Seite wurde ein neues Modul eingeführt. Dieses trägt den Titel „Flagbit TYPO3connect“ und hat die Aufgabe, die Anfragen von TYPO3 entgegenzunehmen und die gewünschte Ausgabe zurückzugeben. Um die Vorgehensweise der Extension zu verdeutlichen, soll stark vereinfacht vorgestellt werden, wie ein normaler Aufruf in Magento in den verschiedenen Klassen verarbeitet wird:

  1. Ähnlich der Vorgehensweise bei TYPO3 existiert auch bei Magento eine zentrale „index.php“, die so genannte Bootstrap-Datei, die die zentrale Klasse „Mage“ einbindet und anschließend die run()-Methode aufruft.
  2. Diese lädt zunächst die Grundkonfiguration der Applikation über die eigene Methode „app()“.
  3. Anschließend beauftragt „Mage“ das Core-Model und den Front-Controller, nach einem passenden Router für die Anfrage zu suchen.
  4. Ein Router wertet die gegebenen Parameter aus, um zunächst einen passenden Action-Controller zu finden und diesem die passenden Werte zu übergeben.
  5. Der Action-Controller führt nun die eigentliche Arbeit aus, indem er zunächst alle Routinen für Datenspeicherung über Models und Layout-Objekte veranlasst und anschließend die Ausgabe über die passenden Blocks anweist.

Das Modul ändert den Verarbeitungsprozess nun an mehreren Stellen, um ausschließlich die von TYPO3 angeforderte Ausgabe zu übergeben, dabei jedoch alle notwendigen Funktionalitäten zu erhalten. Die Herausforderung besteht darin, dass die zentralen Klassen relativ fest miteinander verbunden sind. Erschwerend kommt hinzu, dass die Mage-Klasse final ausgewiesen wird und somit nicht erweitert werden darf.

Die Anpassungen am oben beschriebenen Prozess lassen sich wie folgt kurz zusammenfassen:

  • Um prinzipiell auf die Funktionalitäten und Daten von Magento zugreifen zu können, wird wie im Original auf die Mage-Klasse und deren app()-Methode zugegriffen.
  • Front-Controller und Core-Model wurden angepasst, der Router ausgetauscht und so erweitert, dass eine Kommunikation der Parameter zwischen TYPO3 und Magento möglich wird. Der Router wurde hier derart verändert, dass er piVars-Parameter aus dem Frontend-Plugin verarbeiten und daraus den korrekten Action-Controller ableiten kann.
  • Alle Layout-Objekte erzeugen keine direkten Ausgaben zum Browser mehr, sondern legen diese im Core-Model ab, um dort später vom Plugin ausgelesen zu werden.
  • Alle Verlinkungsmechanismen werden angewiesen, die TYPO3-Link-Methoden des Content-Objekts zu nutzen, das von TYPO3 übergeben wurde.

Außerdem mussten noch verschiedene Vorkehrungen getroffen werden, um eine gemeinsame Benutzer- und Session-Verwaltung realisieren zu können. Die Models für Kunden wurden hierfür um die Möglichkeit erweitert, Daten in der TYPO3-Datenbank abzulegen. Für Login- und Logout-Vorgänge sind relativ einfache Helper-Klassen verantwortlich.

Alle genannten Änderungen lassen sich darüber hinaus vom TYPO3-Plugin aus einschalten, sodass der veränderte Anwendungsfluss bei Ausführung von Magento in einer Stand-Alone-Website nicht aktiviert wird.

Beurteilung und Grenzen dieser Lösung

Für das genannte Szenario stellt diese Vorgehensweise eine akkurate Lösung dar. Da sowohl auf TYPO3- als auch auf Magento-Seite Cache-Mechanismen zum Einsatz kommen, sollte auch die Performance der Lösung jederzeit gute Ergebnisse erzielen. Des Weiteren bleibt die gesamte Funktionalität des Web-Shops neben TYPO3 bestehen und kann parallel genutzt werden.

Dennoch gibt es noch einige offene Punkte in der beschriebenen Lösung: Sowohl im TYPO3- als auch im Magento-Backend sollten dem Redakteur noch weitere Optionen angeboten werden, um eine durchgehend intuitive Bedienung zu garantieren. Darüber hinaus sind noch einige Aufräumarbeiten zu tätigen, um TYPO3- und Standalone-Ausgaben unabhängig voneinander zu cachen und die jeweiligen Sprachversionen von TYPO3 und Magento korrekt miteinander zu verbinden.

Insgesamt bleibt festzuhalten, dass die integrierte Variante zum jetzigen Zeitpunkt sicherlich noch nicht die Qualität der spezialisierten Einzelanwendung Magento bietet. Dies wird sich durch die weiteren Entwicklungen an den Systemen und der Schnittstelle hoffentlich weiter verbessern.

Fazit

Mit Magento und TYPO3 konnten zwei mächtige Systeme verbunden werden. So steht in absehbarer Zeit eine Alternative zu den aktuellen Shop-Extensions für TYPO3 zur Verfügung. Die resultierenden Extensions „fb_magento“ (TYPO3) und „Flagbit_TYPO3_Connector“ (Magento) stehen für jeden zum freien Download und zum Testen zur Verfügung [6]. Produktiv sollten die Extensions jedoch erst nach eingängigem Test zum Einsatz kommen.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Schreib den ersten Kommentar!
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige