von Vinai Kopp, 14.10.2009

Eine Einführung in Magentos Layout-XML: Magento-Layouts im Griff

Aus dem
t3n Magazin Nr. 18

Jetzt kaufen

Die Konfiguration der Magento-Themes können Entwickler bequem im Backend erledigen.

Die Konfiguration der Magento-Themes können Entwickler bequem im Backend erledigen.

Ändern einer Template-Datei

Am einfachsten lassen sich Template-Änderungen durch eigene Themes erreichen. Durch Layout-Updates ist es aber möglich, Änderungen in Modulen zu kapseln, sodass sie unabhängig vom jeweiligen Theme eines Shops funktionieren.

Möchten Sie beispielsweise das Template für Cross-Sell-Produkte durch eine Variante mit einem animierten Slider ersetzen, lohnt es sich, dies in einem Modul zu bündeln, um es immer wieder verwenden oder verkaufen zu können.

Ein Modul sollte keine Core-Template-Dateien ersetzen, deswegen erstellen Sie dafür ein neues Template unter „app/design/frontend/default/default/template/meinmodul/checkout/crosssell.phtml“. Durch den folgenden Code in einer Layout-Datei wird das standardmäßige Cross-Sell-Template durch ein eigenes ersetzt:

Ersetzen eines Templates

<layout version="0.1.0">
	<checkout_cart_index>
		<reference name="checkout.cart.crosssell">
			<action method="setTemplate">
				<template>meinmodul/checkout/crosssell.phtml</template>
			</action>
		</refererence>
	</checkout_cart_index>
</layout>

Listing 8

Position von Blöcken ändern

Ein klassisches Beispiel: Der Mini-Warenkorb soll in der linken statt in der rechten Spalte dargestellt werden. Dazu können Sie eine besondere Eigenschaft des Blocktyps „core/text_list“ nutzen, der für die linke und rechte Spalte verwendet wird. Diese Blockklasse ist eine der wenigen, die kein Template zum Rendern der Ausgaben nutzt, sondern alle Child-Blöcke der Reihe nach ausgibt. Wenn ein Blocktyp, der ein Template zur Ausgabe benutzt, verwendet wird, dann muss in der Template-Datei die Anzeige des Child-Blocks mit „echo $this->getChildHtml('cart_sidebar')“ eingefügt werden. Bei „core/text_list“-Blöcken ist das nicht nötig.

Das Ziel, den Sidebar-Warenkorb zu verschieben, kann auf verschiedene Arten erreicht werden. Der einfachste Weg ist es, die Datei „checkout.xml“ in das Themeverzeichnis zu kopieren und nur eine Zeile zu verändern:

Mini-Warenkorb links in checkout.xml

<layout version="0.1.0">
	<default>
		...
		<!--Vorher: --><!--<reference name="right">-->
		<!-- Nachher: --><reference name="left">
			<block type="checkout/cart_sidebar" name="cart_sidebar"
template="checkout/cart/sidebar.phtml" before="-">
			...
			</block>
		</reference>
		...
	</default>
</layout>

Listing 9

Das Gleiche können Sie auch durch eine eigene Layout-Datei erreichen:

Mini-Warenkorb links in eigenem Layout XML

<layout version="0.1.0">
	<default>
		<reference name="right">

			<!-- Entfernen des Blocks in der rechten Spalte -->
			<action method="unsetChild"><name>cart_sidebar</name></action>
		</reference>
		<reference name="left">

			<!-- Einfügen des Block in der linken Spalte -->
			<block type="checkout/cart_sidebar" name="cart_sidebar" template="checkout/cart/sidebar.phtml" before="-">
				...
				<!-- hier Parameter übernehmen aus checkout.xml -->
			</block>
		</reference>
	</default>
</layout>

Listing 10

Blöcke hinzufügen oder entfernen

Es ist einfach, neue Inhaltsblöcke anzuzeigen. Einen CMS-Block mit dem Bezeichner „mein_cms_block“ in der rechten Spalte erreichen Sie mit folgendem Code:

CMS-Block in rechter Spalte hinzufügen

<layout version="0.1.0">
	<default>
		<reference name="right">
				<block type="cms/block" name="callout2">
					<action method="setBlockId"><block_id>mein_cms_block</block_id></action>
				</block>
		</reference>
	</default>
</layout>

Listing 11

Um den gleichen Code im Contentbereich anzuzeigen, müssen Sie nur das <reference name="right"> gegen ein <reference name="content"> austauschen. Zur Ausgabe fügen Sie ein „echo $this->getChildHtml('callout2')“ an der gewünschten Stelle des Templates ein.

Eigene Datei-Templates hinzuzufügen (im Unterschied zu CMS-Blöcken), ist sogar noch einfacher:

Eine eigene Template-Datei einfügen

<layout version="0.1.0">
	<!-- Layout Update Handle für alle Kunden-Profilseiten: -->
	<customer_account>
		<reference name="footer">
			<block type="core/template" name="callout3" template=“callouts/meinblock.phtml“/>
		</reference>
	</customer_account>
</layout>

Listing 12

Blöcke entfernen können Sie auf zwei Arten:

CMS-Blöcke entfernen

<layout version="0.1.0">
	<catalog_category_default>

		<!-- Variante 1: -->
		<reference name="right">
			<action method="unsetChild"><name>right.permanent.callout</name></action>
		</reference>

		<!-- Variante 2: -->
		<remove name="right.permanent.callout" />
	</catalog_category_default>
</layout>

Listing 13

Die erste Variante erzeugt leider eine Fehlermeldung, wenn ein Block mehr als einmal auf diese Art innerhalb eines Layout-Updates entfernt wird.

Das Aufrufen von Methoden einer Blockklasse via Layout-XML wird häufig benutzt, um Links zur Top-Navigation oder der Navigation im Kundenkonto hinzuzufügen:

Hinzufügen eines Links

<layout version="0.1.0">
	<customer_logged_in>
		<reference name="top.links">
			<action method="addLink">
			<label>Spezialangebote</label>
			<path>angebote</path>
			<title>Spezialangebote</title>
			<prepare/>
			<urlParams/>
			<position>300</position>
		</action>
		</reference>
	</customer_logged_in>
</layout>

Listing 14

Die Namen der Tags im <action>-Element haben keine Relevanz – lediglich die Reihenfolge wird ausgewertet. Es lassen sich nur skalare Typen übergeben, keine komplexen Werte wie beispielsweise Arrays oder Objekte.

Seite:  1 2 3 4

Empfohlene Artikel

4 Antworten

  1. von Tutorial: Einführung in Magentos Layout… 08.03.2010 (09:01Uhr) 1.

    [...] 18 vermittelt das Grundwissen, um Layout-Updates in eigenen Magento-Projekten umsetzen zu können. Er steht jetzt kostenlos im Heftarchiv zur Verfügung. Zudem kann man t3n Nr. 18 versandkostenfrei in unserem Shop bestellen.Ads_BA_AD('CAD2'); magento [...]

  2. von mathiasschopmans 09.03.2010 (16:16Uhr) 2.

    Super! Endlich mal ein guter Einstieg. ;)

  3. von Till Heß 09.03.2010 (20:33Uhr) 3.

    Super Artikel! Hätte es den doch gegeben als ich das erste mal die xml Datein von Magento angepasst habe ;-)

  4. von TB 10.05.2010 (09:41Uhr) 4.

    Das beste Tutorial das ich bis jetzt im Netz gefunden habe *daumen hoch*

Deine Meinung


(wird nicht veröffentlicht)