Layout-Handles sind XML-Blöcke die Einfluss auf das jeweilige Theme haben - es also aktualisieren können. Einige Beispiele dazu gibt es in unserem Artikel zu Layout-Updates mittels local.xml. Jeder Controller besitzt quasi sein eigenes Layout-Handle dessen Aufbau in der Regel
[..]
<checkout_cart_index>
<!-- Versandkosten schätzen im Warenkorb raus -->
<remove name="checkout.cart.shipping" />
</checkout_cart_index>
[..]
Dieses Layout-Update wird ausschließlich aufgerufen falls der jeweilige Controller aktiv ist. Es entfernt dabei den Block zum Schätzen der Versandkosten rückstandslos.
Nun gehen wir einen Schritt weiter uns registrieren unser eigenes Layout-Handle. Dieses wird jedoch nur bei bestimmen Ereignissen aufgerufen - z.B. wenn der Kunde über x Euro Umsatz hat oder wenn eben Freitag ist. Dazu erweitern wir die config.xml unseres Moduls um einen Event der aufgerufen wird bevor das Layout komplett geladen wird.
..
<events>
<controller_action_layout_load_before>
<observers>
<webguys_load_layout>
<class>webguys/observer</class>
<method>beforeLoadLayout</method>
</webguys_load_layout>
</observers>
</controller_action_layout_load_before>
</events>
..
Das Event leiten wir an das Model Observer im Namespace webguys weiter. In der Regel wird diese also Webguys_Webguys_Model_Observer heißen. Dort rufen wir die Methode beforeLoadLayout auf welche ungefähr wie folgt implementiert sein kann:
public function beforeLoadLayout($observer)
{
if ( $besonderes_ereignis ) {
$layout = $observer->getEvent()->getLayout()->getUpdate();
$layout->addHandle('webguys_besonderes_ereignis');
}
}
Die Variable $besonderes_ereignis repräsentiert hier natürlich irgendein besonderes Ereignis welches eben z.B. das Erreichen einer Umsatzgrenze oder ein besonderer Tag sein kann. Wie zu erkennen ist wird das Layout-Handle nur angerufen falls unser besonderes Ereignis auch eingetreten ist. In das Praxis bedeutet dies das wir nachträglich unser Layout mittels dieses Events und Layout-Updates verändern können. Um somit die Versandkosten-Schätzung im Warenkorb nur zu entfernen falls unser Ereignis eingetreten ist würde die dazugehörige Layout-XML wie folgt aussehen:
[..]
<webguys_besonderes_ereignis>
<!-- Versandkosten schätzen im Warenkorb raus -->
<remove name="checkout.cart.shipping" />
</webguys_besonderes_ereignis>
[..]
Viel Spaß beim Experimentieren.