Aufgabenstellung

Mitunter kann es in einem Joomla-Template notwendig sein, ein Modul unterschiedlich darzustellen, je nach dem an welcher Modulposition es ausgegeben wird. Beispiel ein Warenkorb in der Modulposition "left" würde vertikal aufgebaut werden und alle Bestellpositionen enthalten. Würde der Warenkorb z.B. in der Toggelbar am unteren Browserrand angezeigt werden, müßte der Aufbau gänzlich anders erfolgen. Das kann nicht immer nur über Styles erreicht werden, sondern mitunter muss das Modul-Templatescript die Ausgabe komplett anders ansteuern. Hierfür muss man aber Im Templatescript zunächst erfahren können, an welcher Position das Modul nun gerade veröffentlich ist. Nachfolgend die ganz einfache Lösung (zutreffend für Joomla 1.5.x):

 



 

Lösung

Das Joomla Framework liefert hierfür schon ein fertiges Objekt $module welches über das Script module.php bereitgestellt wird. $module kennt diverse Methoden um Information über das Modulobjekt zu liefern. Eine davon ist position. Siehe dazu unter joomla-wiki.de.

Im Script kann man dann ganz einfach folgende Zeile einfügen:

 

$modulposition = $module->position;

 

In Verbindung mit modChrome lassen sich dann also ein Modul Positionsabhängig flexibel gestalten. Auch innerhalb von Komponente-Modulen ist das machbar, so wie z.B. in unserem obigen Warenkorbbeispiel genannt.

Im Script shop.basket_short.php kann Positionsabhängig ein unterschiedliches Template-Script aufgerufen werden:

 

echo $tpl->fetch( "common/".$module->position.".minicart.tpl.php");
oder
echo ($module->position == "shoppingbarmodulpos") 
	? $tpl->fetch( 'common/togglebar.minicart.tpl.php')
	: $tpl->fetch( 'common/minicart.tpl.php' );

 

Alternative bei Ajax-Aufrufen

Eine eigentlich Selbstverständlichkeit sei hier noch einschränkend erwähnt. Wenn man im Projekt mit Ajax nur den Contentbereich aktualisiert, also den Aufruf mit der index2.php macht, dann steht das Objekt $module nicht zur Verfügung. Logisch, denn im Contentbereich werden ja keine Module angezeigt, folglich wird das Objekt hier nicht benötigt und bereitgestellt.

Wie oben beschrieben kann also nicht verfahren werden. Deshalb ist eine Alternative notwendig, die darin besteht beim ersten Modulaufruf dessen Position in der Session zu speichern, so dass die Modulposition uns überall zur Verfügung steht. Das könnte dann im konkreten Beispiel unseres shop.basket_short.php-Scriptes so aussehen:

 

if (!isset($_SESSION['cart']['ModulePos']) || ($module->position != $_SESSION['cart']['ModulePos'] &! empty($module->position))) 
	$_SESSION['cart']['ModulePos'] = $module->position;
echo ($_SESSION['cart']['ModulePos'] == "togglebarmodulpos")
	? $tpl->fetch( 'common/minicart.togglebar.tpl.php')
	: $tpl->fetch( 'common/minicart.tpl.php' );

Kurz kommentiert: Wir beziehen uns bei unserer Template-Auswahlentscheidung immer auf den Session-Eintrag für die Cart-Modulposition. Vorher wird dieser, wenn er nicht gesetzt ist oder ungleich zur feststellbaren Cart-Modulposition ist, in die Session geschrieben.