Türchen 18: Im Code zwischen Stores wechseln

Im normalen Magento Programmieralltag steht man nicht allzu häufig vor der Frage, welches Template Area muss ich benutzen, welcher Storeview ist gewünscht und welche Sprache (Währung, Datumsformate,…) soll aktuell verwendet werden. Im Allgemeinen übernimmt diese Entscheidung Magento für einen. Es kommt eine Request und man liefert die Response.

Schaut man sich z.B. die Generierung einer Magento Rechnung an, so sieht man, dass hier einiges an den "globalen" Einstellungen hin und her geschaltet werden muss. So wird sich beim Anlegen jeder Bestellung gemerkt, in welchem Store diese angelegt wurde. Mit dieser Information hat man die Möglichkeit eine Rechnung zu generieren, die die gewünschte Sprache und die eingestellten Optionen des Stores beinhalten.

Vor der Magento Version 1.5 musste man ich selber darum kümmern, die gewünschten Einstellungen, ein und wieder auszuschalten:

  • Setzen des entsprechenden Areas (frontend, admin)
  • Umschalten auf den gewünschten Store
  • Sprachtabellen für die Übersetzungen laden
  • Und nach getaner Arbeit alles wieder zurück

Seit der Version 1.5 findet man im Paket Core neben dem app/Area Modell, das Modell app/ Emulation. Die Klasse übernimmt nun die einfache Umschaltung der Store abhängigen Daten.

Im Allgemeinen langt folgendes Codefragment aus:

$appEmulation = Mage::getSingleton('core/app_emulation');
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
try {
	// 	Logik
	// …
} catch (Exception $exception) {
	// Stop store emulation process
   $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
   throw $exception;
}
// Stop store emulation process
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);

Als Rückgabewert erhalten wir die aktuellen Einstellungen, die über die Methode 'Mage_Core_Model_App_Emulation::stopEnvironmentEmulation' zurückgesetzt werden sollten. Die Methode 'Mage_Core_Model_App_Emulation::startEnvironmentEmulation' bietet die Möglichkeit weitere Parameter zu übernehmen:

Die Methode 'Mage_Core_Model_App_Emulation::startEnvironmentEmulation' bietet die Möglichkeit weitere Parameter zu übernehmen:

  • storeId Ist die gewünschte StoreId
  • area (Default frontent) Neben Frontent und AdminHtml wären theoretisch weitere Design Areas denkbar
  • emulateStoreInlineTranslation (Default false) Hier hat man die Möglichkeit die Übersetzungen, die über den Modus "Translate inline" hinzugefügt wurden, zu berücksichtigen.

Über den Sinn der Funktion "Translate inline" kann sicherlich ein eigener Artikel geschrieben werden. Diese Funktionen versuche ich meinen Kunden nicht zu zeigen, da sich dann die Suche nach dem Ort der Übersetzung weiter verkompliziert. Hier sollten in meinen Augen die CSV Sprachfiles benutzt werden.

Eingesetzt wird diese Klasse von Magento vor allem bei der Generierung der E-Mails, den Rechnungen, Lieferscheinen und Gutschriften. Interessant für diese Klasse wird es immer dann, wenn man aus der Umgebung eines Stores, die Darstellungsvorschriften eines anderen Stores benötigt. Also z.B. die Generierung Store abhängiger Daten innerhalb eines Cronjob, welcher im Admin-Modus läuft.

Der Eine oder Andere wird sich jetzt fragen, was ist so besonderes an diese Klasse. Ich habe die Klasse lieben gelernt, da ich Magento öfters für etwas artfremde Projekte einsetze. So z.B. für ein Projekt, indem innerhalb eines Konzerns verschiedenste Dokumente generiert werden und dies zukünftig in bis zu 23 Sprachen. Als Produkte stehen dem Mitarbeiter, u.a. Visitenkarten, individualisierbare Marketing-Maßnahmen bis hin zu Produktkatalogen, zur Auswahl. Auch der Magento Warenkorb wird hier verwendet, nur das die Mitarbeiter nicht mit einer Kreditkarte bezahlen, sondern mit Auftrags- und Abrechnungskonten. Und damit nicht wild bestellt wird gibt es pro Abteilung ein Budget, welches pro Monat nicht überzogen werden darf.

Da man sich nicht immer sicher sein kann, was sich die Magento Entwickler noch einfallen lassen, bin ich über die Zusammenfassung in diese Basis-Klasse begeistert.

Ich wünsche allen Magento-aner ein arbeitsfreies Weihnachtsfest und gute Geschäfte im nächsten Jahr.



Ein Beitrag von Michael Augsten
Michael's avatar

Michael Augsten ist seit über 20 Jahren selbstständiger Informatiker aus München. Er ist begeistert von der Anpassbarkeit von Magento und realisiert in seiner Firma Au-IT, seit der Magento Version 1.1.6 vor gut 3 Jahren, fast ausschließlich Projekte die auf dem Open Source System aufbauen. Vom klassischen Online Shop bis hin zum Marketing-Portal für eine firmenweite Nutzung. Sie erreichen Ihn über seine Webseite oder per E-Mail

Alle Beiträge von Michael

Kommentare
Viktor Franz am

Vielen Dank für den Beitrag,

habe den Code in unserem Produkt Feed Generator gebracht.

Christian Münch am

Danke für die Info. Kannte ich noch gar nicht. Ich könnte mir vorstellen, dass dies auch für Unit Tests gut geeignet ist.

Michael Karl am

War schon hin und wieder über die Emulation-Gechichte gestolpert, hatte mich aber nie genauer damit befasst. Danke für den Beitrag, für einige Projekte scheint man hier viel Arbeit sparen können.

Bastian Ike am

Gefällt mir, schön das sich mal jemand des core/app_emulation-Models angenommen hat!

Dein Kommentar