Automatisch das Theme wechseln

Durch Interfaces bzw. Themes in Magento ist es möglich ein und das selbe System mit unterschiedlichen Darstellungen zu betreiben. Themes können häufig von Shop A nach Shop B kopiert und dort eingesetzt werden. Möchte man aber nun automatisch, anhand selbst definierter Kriterien, das Design wechseln ist ein wenig Programmcode von Nöten. Schwierig dabei ist eigentlich nur zu wissen welche Funktionen und Events benötigt werden.

In erster Regel ist herauszufinden wie und warum Magento das aktuell eingestellte Theme darstellt. Dies wird durch ein Singleton mit dem Namen core/design_package kontrolliert. Dieses kann wie folgt geladen werden:

$package = Mage::getSingleton('core/design_package');

$package enthält im Anschluss eine Instance vom Typ Mage_Core_Model_Design_Package. Mittels setPackageName kann nun wie folgt ein beliebiges Theme aktiv gesetzt werden:

$package->setPackageName('deinTheme');

Letztlich fehlt noch die Möglichkeit mittels Event Magento beim Starten dazu zu überreden nicht das Standard sondern, falls ein bestimmtes Kriterium zugrifft, das alternative Theme zu verwenden. Hierzu kann das Event controller_action_layout_load_before abgefangen und an einen Observer-Class weitergeleitet werden. In der config.xml des Moduls sind das wie folgt aus:

<config>
	<modules>
		<Webguys_Owntheme>
		<version>0.0.1</version>
		</Webguys_Owntheme>
	</modules>

	<global>
		<models>
			<Owntheme>
				<class>Webguys_Owntheme_Model</class>
			</Owntheme>
		</models>

		<events>
			<controller_action_layout_load_before>
				<observers>
					<webguys_owntheme_controller_front_init_before>
						<type>singleton</type>
						<class>Webguys_Owntheme_Model_Observer_Layout</class>
						<method>updateInterface</method>
					</webguys_owntheme_controller_front_init_before>
				</observers>
			</controller_action_layout_load_before>
		</events>

	</global>

</config>

Das dazugehörige Model, welches nun eine Methode bereitstellt die Einfluss auf das Magento-Theme nimmt, baut sich wie folgt auf:

class Webguys_Owntheme_Model_Observer_Layout {	
	public function updateInterface( $observer ) {		
		$package = Mage::getSingleton('core/design_package');		
		if ( /* DEINE BEDINGUNGEN */ ) {
			$package->setPackageName('deinTheme');
		}		
	}	
}

Ein solches Vorgehen bietet sich z.B. an um umfangreiche A/B Design-Tests in Magento zu realisieren. Um jedoch nur einzelne Blöcke des Layouts unter bestimmten Bedingungen zu verändern ist ein eigener Layout-Handler, der im Fall der Fälle aufgerufen wird, vermutlich der bessere Weg.



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
Magento Out of Stock Message am

Tobias! Thanks for the nice tips. I found one more blog posts around here http://magerts.com/create-custom-layout-handles-in-magento/ for the custom layout configuration using Observer file. Hope I could share this with you here. :)

Tobi am

Danke für den Tipp! Aber warum wird in der config verwendet, ich dachte man müsste bei Observern den Pfad zu diesen angeben:

Und wie müsste ich den Code ergänzen, wenn ich kein ganzen Package, sondern nur ein Theme des default packages ändern möchte? also z.B. von default in blank?

Tobi

Dein Kommentar