Magische Setter/Getter in Magento Templates und Layouts

von Thomas Müller

Die magischen Getter und Setter, die z.B. von Models bekannt sind, können auch in den Layouts verwendet werden. Hier ein Beispiel für die Verwendung der Setter und Getter:

$product->setWurst("Salami");
echo $product->getWurst();

Nach ein wenig Überlegung macht das Ganze auch in den Layouts Sinn.Beispiel: Im Header soll ein anderes Hintergrundbild angezeigt werden, wenn der Benutzer im Warenkorb ist. Gelöst wird sowas natürlich mittels einer CSS-Klasse für den Header. Der alte Weg würde so aussehen, dass man im Template header.phtml in etwa sowas einbaut:

<div id="header" class="<?php echo ($warenkorbAnzeige) ? "header-cart" : "header-default"; ?>">

Das ist natürlich nicht so schön, wenn es mehr als 2 Klassen gibt. Magento löst das jedoch schöner. Im Template schreibt man einfach:

<div id="header" class="<?php echo $this->getHeaderClass(); ?>">

Den Wert für HeaderClass kann man direkt in den Layouts setzen.

Beispiel in page.xml für alle Seiten:

<block name="top.container" as="topContainer" translate="label">
<action method="setHeaderClass"><value>header-default</value></action>
</block>

Beispiel in cart.xml für die CSS-Klasse im Warenkorb

<checkout_cart_index>
<reference name="topContainer">
<action method="setHeaderClass"><value>header-cart</value></action>
</reference>
</checkout_cart_index>

Ein Blick unter die Haube:

Eigentlich passiert nichts weiter, als dass die im XML angegebene Method für die Instanz des Blocks ausgeführt wird. Da jeder Block auf Varien_Object zurückzuführen ist, funktionieren die magischen Setter und Getter auch. Des Weiteren können auch alle public function einer Block-Klasse aus dem XML aufgerufen werden, auch wenn sie mehr als einen Parameter erfordern.

Beispiel:

1. Block-Klasse

<?php
 
Class FiveDigital_TestModul_Block_Foo extends Mage_Core_Template {
 
private $foo;
private $bar;
 
public function changeFoo($baz, $someVar) {
	$this->foo = $baz;	
	$this->bar = $someVar;
}
 
public function showFoo() {
	echo $this->foo." - ".$this->bar;
}
 
}
 
?>

2. Layout-XML

<testmodul_index_index>
	<reference name="content">
		<block type="testmodul/foo" name="fooBlock">
			<action method="changeFoo">
				<foo>Lorem</foo>
				<somevar>Ipsum</somevar>
			</action>
		</block>
	</reference>
</testmodul_index_index>

3. Template

<h1>Foo:</h1>
 
<p><?php echo $this->showFoo(); ?></p>