Shopware Knowledgebase

Technical Preview Shopware 4.0 - Teil 1 (Achtung, richtet sich ausschließlich an Technik-Freaks ;-)

Allgemein

In dieser mehrteiligen Wiki-Serie stellen wir Ihnen die voraussichtlichen technischen Neuerungen von Shopware 4 vor. Neben vielen direkt sichtbaren neuen Funktionen und Erweiterungen werden auch unter der Haube viele Verbesserungen vorgenommen, die die Entwicklung von Shopware Plugins noch einfacher machen und viele neue Möglichkeiten bieten.

Der erste Akt

Im ersten Teil der Serie schauen wir uns an, welche Verbesserungen das hauseigene Framework Enlight mit sich bringen wird und wie sich diese auf Shopware auswirken.

Was ist Enlight ?

Zunächst einmal ein paar einführende Worte. Enlight ist ein PHP-Framework, welches aus technischer Sicht auf dem Zend-Framework und Symfony 2 aufbaut und sich vor allem durch den Fokus auf das Thema eCommerce von anderen Systemen abhebt.

In zukünftigen Versionen soll Enlight als "eCommerce-Betriebssystem" zur Implementierung von individuellen eCommerce-Lösungen dienen, die Teile von Shopware als Grundlage verwenden können.

Während die erste Version von Enlight noch recht stark an Shopware gebunden war, ist das neue Release als komplett eigenständiges Framework konzipiert worden. Enlight schließt die jahrelange Erfahrung im Bereich eCommerce in ein Framework ein, welches nicht nur die Entwicklung von eCommerce-Anwendungen oder anderen Web-Anwendungen beschleunigen kann, sondern darüber hinaus diese Entwicklungen auf ein besonders festes und robustes Fundament stellt.

Um nicht nur auf den eCommerce-Bereich festgelegt zu sein, wird ständig darauf geachtet, dass alle Komponenten locker miteinander verbunden sind (lose Kopplung). Dieses Verfahren erleichtert die Entwicklung, schont die Ressourcen und macht das Erstellen von automatisierten Tests sehr einfach möglich.

Ab dem 31.01.2012 verfügbar

Noch im Januar 2012 wird die erste Version von Enlight unter der "New BSD license" auf Github freigegeben, damit unser Framework bzw. die Basis von Shopware für jede beliebige, eigene Applikation verwendet werden kann.

Parallel dazu portieren wir Shopware im Augenblick auf die neue Enlight-Version.

Alles frisch ...

Grundlegende Änderungen

Mit dem neuen Release wird es eine komplette Refaktorierung der einzelnen Backend Komponenten und Module mitsamt einem neugestalteten User Interface und einem vollständig multilingualen Backend geben. User werden nun von einem erweiterten Textbaustein-Management inklusive dateibasierter Snippet-Dateien profitieren. Ebenfalls neu wird die Verwendung von ExtJS 4.1 als standardmäßige ExtJS Version für Shopware sein. Für das Styling des Backends gibt es die Unterstützung von SASS und Compass. Shopware 4 wird sich außerdem durch eine komplette Anpassbarkeit der einzelnen Backend-Module auszeichnen.

Cache-Strategie

Die verschiedenen, bisher eingesetzten Cache-Lösungen werden vollständig entfernt und durch einen modernen Block-Cache auf Basis von ESI ersetzt. Dieser lässt sich in den kommerziellen Shopware Editionen durch einen Varnish-Cache weiter beschleunigen. Im Standard kommt ein Reverse HTTP Proxy Cache als Fallback zum Einsatz. So lassen sich komplette Seiten oder auch Seitenfragmente individuell cachen.

Routing

Die Routing-Komponente basiert auf Routing von Symphony 2. Damit ist es nun möglich, suchmaschinenfreundliche URLs für die eigenen Komponenten und Erweiterungen zu erstellen und eine benutzerfreundlichere Konfiguration und Verwaltung der SEO-Links über ein Backend-Modul vorzunehmen.

Template / Smarty 3.1

Durch das Update auf Smarty 3.1 wird die Template-Engine deutlich beschleunigt. Darüber hinaus gibt es diverse neue Möglichkeiten in der Template-Programmierung. Zur direkten Einbindung der Rückgabe einer Controller-Action in das Template, gibt es nun ein "Action-Plugin".

{action name="menu" controller="index"}

Templates lassen sich nun einfacher vererben, so dass sich nun auch Templates modifizieren lassen, die durch Plugins in das System eingebunden werden. Dazu gibt es die Parent-Ressource. Beispiel mit der frontend/index/index.tpl:

{extends file="parent:frontend/index/index.tpl"}
{block name="frontend/index/inner_container"}
 
Hello world
 
{/block}

Bei der Registrierung neuer Template-Ressourcen / Verzeichnisse, können diese nun einen eindeutigen Namen bzw. Namespace erhalten, so dass bei Includes innerhalb der Template-Basis genau definiert werden kann, aus welchem Scope ein Template geladen werden soll. Als Beispiele sollen hier die Template-Verzeichnisse "default" und "plugin_test" dienen:

{extends file="[default]frontend/index/index.tpl"}
{block name="frontend/index/inner_container"}
 
{include file="[plugin_test]frontend/index/test.tpl"}
 
{/block}

Die neue Template-Basis bietet eine vollständige UTF-8 Unterstützung, so dass die Übersetzung in fremde Sprachen einfacher wird. Auch bei der Variablen-Definition kann optional ein Gültigkeitsbereich definiert werden, so dass diese entweder global oder nur in bestimmten Templates zur Verfügung stehen.

// Setz den Standard-Scope auf Global:
$this->View()->setScope(Enlight_Template_Manager::SCOPE_GLOBAL);
// Registriert die Site-Instance global im Template
$this->View()->Site = Enlight_Application::Instance()->Site();
// Die $menu-Variable wird im Template mit einem lokalen Scope registriert
$this->View()->assign('menu', $menu, null, Enlight_Template_Manager::SCOPE_LOCAL);
 

Plugins

Plugins können nun beliebig oft innerhalb der Applikation instantiiert werden und dabei mit abweichenden Konfigurationen gestartet werden. Beispiel:

 
// Holt ein vorhandenes Plugin-Namespace
$namespace = $this->getResource('FrontendPlugins');
// Neue Plugin-Instance erzeugen
$plugin = new MyTopSellerPlugin_Bootstrap(
   'TopSellerHome', array('category' => 1)
);
// Eine weitere Plugin-Instance mit anderem Namen erzeugen
$namespace->registerPlugin($plugin);
$plugin = new MyTopSellerPlugin_Bootstrap(
   'TopSellerBook', array('category' => 23)
);
$namespace->registerPlugin($plugin);
// Plugins im Namespace speichern
$namespace->write();
 

Plugins lassen sich nun einfacher modifizieren bzw. ableiten, da für Events und Hooks keine statische Methoden-Deklaration mehr notwendig ist. Auch lässt sich der Plugin-Namespace nun beliebig tief verschachteln, um die Erweiterungen weiter gruppieren zu können. Anbei ein Beispiel, um den Plugin-Namespace "Plugins/Frontend/Widgets" zu erzeugen:

 
public function onRouteStartup(Enlight_Event_EventArgs $args)
{
    $request = $args->getSubject()->Request();
 
    // Einfacher Zugriff auf die Application-Instance um sich z.B. die Log-Instance  zu holen
    $log = $this->Application()->Log();
 
    // Einfacher und vererbungssicherer Zugriff auf die Plugin-Config über die neue Config-Methode
    if($this->Config()->logRemoteAddress) {
        // ...
    }
}
 

$plugins = $this->Application()->Plugins();
 
$frontend = new Enlight_Plugin_Namespace_Default('Frontend');
$plugins->registerNamespace($frontend);
$widgets = new Enlight_Plugin_Namespace_Loader('Widgets');
$widgets->addPrefixPath('Frontend_Widgets', 'Plugins/Frontend/Widgets');
$frontend->registerNamespace($widgets);
 
$topSellerPlugin = $plugins->Frontend()->Widgets()->TopSeller();

Viele Standard-Plugins wurden oder werden nach Enlight portiert und weiter abstrahiert um universell einsetzbar zu werden.

Textbausteine / Snippets

Auch hier steht dem User die UTF-8-Unterstützung zur Seite. Textbausteine können für die Entwicklung dateibasierend abgelegt werden, dort, wo auch gleichzeitig eine Übersetzung seitens des Entwicklers stattfinden kann. Außerdem gibt es ein Import-Skript für dateibasierende Textbausteine sowie ein Qualitätssicherungs-Skript, welches fehlende Textbausteine erkennt. Die Integration der Snippets als eigene Komponente ist genauso gewährleistet wie die Unterstützung von Snippet-Files für die direkte Übersetzung. Bei Bedarf können eigene Adapter für den Snippet-Manager geschrieben werden, außerdem wurde die Unterstützung von Snippet-Namespace und deren Konfigurationen verbessert.

ExtJS Loader / JSON

Jedes Backend-Modul spiegelt eine eigene ExtJS 4 Applikation wieder. Zum optimalen Zusammenspiel von ExtJS 4 und Shopware gibt es einen standardisierten Script-Renderer. Außerdem wird das Auto-Loading in den jeweiligen Backend-Modulen unterstützt.Für eine schnellere Ladegeschwindigkeit gibt es eine Bulk-Auslieferung der einzelnen Module. Zur einfachen Erzeugung von JSON-Daten im Controller wurde ein eigenes JSON-Plugin eingebaut. Die automatische Unterstütung von JSONP(with Padding)-Requests und somit ein Vermischung von HTTPS und HTTP ist außerdem möglich.

Testabdeckung / Unit-Tests

Zum effizienten Testen gibt es eine komplette Testabdeckung mit Unit- und UI-Tests auf Basis von PHPUnit und Selenium. Zur Sicherstellung der Code-Qualität erfolgt eien Integration in unseren Continuous Integration Server. Außerdem erfolgt ein Integrations- und Regressionstest für alle Komponenten und Bugs.

Form-Komponente

Die Form-Komponenten basieren auf Zend_Form. Es wird eine dynamische Erzeugung von Formularen samt optionaler Validierung der jeweiligen Felder gewährleistet. Sie zeichnen sich durch vollständige Konfigurierbarkeit zum einfacheren Anpassen aus. Somit können Formular-Elemente je nach Wunsch in HTML5 oder als ExtJS 4-Formular erstellt werden.

Auth-Komponente

Die Komponente ist bestimmt für die einfache Autorisierung über verschiedene Adapter. Über den Datenbank-Adapter ist die Autorisierung über die Datenbank möglich. Die Auth-Komponente hat einen eingebauten Schutz vor Brute-Force und kann überdies leicht in der eigenen Anwendung verwendet werden.

// Neue Auth-Instance erzeugen
$auth = new Enlight_Components_Auth();
// Einen Datenbank-Adapter für die Autorisierung erzeugen
$adapter = new Enlight_Components_Auth_Adapter_DbTable($db, 'auth', 'username', 'password');
// Den Username und das Passwort setzen:
$adapter->setIdentity('demo')->setCredential(md5('demo'));
 
// Die Autorisierung überprüfen
$authResponse = $auth->authenticate($adapter); 
if(!$authResponse->isValid()) {
    echo "fail";
}

Site-Komponente

Diese Komponente ermöglicht die einfache Verwaltung von sessionabhängigen Eigenschaften wie z.B. Lokalisierung, Währung und Template. Sie löst Abhängigkeiten zwischen diesen Eigenschaften automatisch auf. Je Seite/Subshop können eigene Standard-Konfigurationen hinterlegt werden, wobei die Auswahl/das Ändern der Konfigurationen über ein Post-Request oder automatisch über die Domain geschieht. Auszug aus dem Site-Plugin:

 
$session = $this->Application()->Session();
 
if(!isset($session->Site)) {
    /** @var $siteManager Enlight_Components_Site_Manager */
    $siteManager = new Enlight_Components_Site_Manager($this->Config());
    if(isset($_SERVER['HTTP_HOST'])) {
        $session->Site = $siteManager->findOneBy('host', $_SERVER['HTTP_HOST']);
    }
    if(!isset($session->Site)) {
        $session->Site = $siteManager->getDefault();
    }
}
if(($currency = $request->getParam('__currency')) !== null) {
    $site->setCurrency($currency);
}
return $session->Site;

Der zweite Akt

Im zweiten Teil der Serie werden wir uns exemplarisch eines der neuen Backend-Module anschauen, um die dortigen Neuerungen kennenzulernen.

Artikel-PDF erstellen

Artikel bewerten

Waren diese Informationen hilfreich? Ja Nein


Weitere interessante Artikel:

Bezeichnung:
Rating:
Klicks:
Datum:
7 Punkte
16338
13.07.2011

Kategorien:

Bestell-Nr.: SW1676

Lieferzeit ca. 5 Tage

€ 1,00

Preise inkl. gesetzlicher
MwSt. zzgl. Versandkosten*

€ 1,00

Preise inkl. gesetzlicher
MwSt. + Versandkosten*