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.