Türchen 11: Templating mittels local.xml in der Praxis

Heute soll es um "die local.xml" gehen. Wer sich jetzt entspannt zurück lehnt und denkt: jo, kennich, kannich. Der sollte vor allem dann weiter lesen, wenn er denkt, es handelt sich um die local.xml unter app/etc. Um die geht es nämlich nicht. Es geht um "die local.xml", die, die man für Layout-Updates verwenden kann.

Wo?

"Die local.xml" liegt im "layout"-Folder Eures app/design/frontend/default/[EUER-THEME]/-Verzeichnisses. Und wenn alles so richtig gut läuft, dann öffnet man dieses layout-Verzeichnis und man sieht nur eine einzige Datei: "die local.xml". Nur die, keine catalog.xml, checkout.xml, page.xml, wowarnochmalwas.xml....

Warum?

Im Gegensatz zur weit verbreiteten Template-Bau-Technik, in der man XML-Dateien in sein eigenes Template kopiert, damit Magento sie hoffentlich als letztes berücksichtigt und so im Dschungel und der Fülle der XML-Tags und -Files seine Änderungen vornimmt, die man schon nach wenigen Wochen nicht mehr nachvollziehen kann, nimmt man mit der local.xml ausschließlich Updates vor. Man kopiert gar nix. Man kann neue Blöcke hinzufügen, bestehende deaktivieren oder löschen, man kann Blöcken andere Klassen zuweisen oder Klassen-Methoden nutzen, um neue Links einzufügen, man kann auch nur Änderungen für eine bestimmte Produkt- oder Kategorieseite vornehmen. All sowas. Und das fantastische an der local.xml ist: sie wird zum Schluß gelesen. Sie hat also immer recht. (Zumindest auf Datei-Ebene).

Wie?

Die heutige Aufgabe: die Suche aus dem Header verschieben.
Als erstes muss die Suche oben aus dem Header erstmal verschwinden. Das geht entweder radikal mittels "remove" (), dann werden allerdings auch die dazugehörigen Klassen gar nicht geladen. Sprich: man kann den Block dann auch nirgendwo mehr einfügen, weil er schlichtweg nicht mehr existent ist. Die Alternative heißt "unset", dann ist der Block weg, aber die Klassen sind geladen und warten auf ihren Einsatz.
Also: erstens rausfinden in welchem Block die Suche liegt (im "header"). Und wie der Block heißt (topSearch). Nach diesem Rausfinden, die Methode des umgebenden Blocks "header" nutzen und die Suche unsetten. (Ich habe den Artikel nur geschrieben, um "unsetten" zu schreiben. Über "Ergoogeln" stolpert ja niemanden mehr).

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <default>
	<reference name="header">
            <action method="unsetChild">
              	  <name>topSearch</name>
            </action>
        </reference>
</default>
</layout>

Nu isse wech.

Und so isse wieder da (erstmal rechts, ist einfacher):

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <default>
		<reference name="header">
            	<action method="unsetChild">
                	<name>topSearch</name>
            	</action>
       	 </reference>

		<reference name="right">
            	<action method="insert">
               	<name>top.search</name>
            	</action>
        	</reference>
	</default>
</layout>

Unnu? Nun soll die Suche auch mal neben die Brotkrumen-Navigation. Die befindet sich direkt im Root-Block. Nun würde man ja annehmen, das obige ließe sich auch dort anwenden. Das Klappt aber nicht. Innerhalb des root-Blocks muss man folgendes anwenden:

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <default>
		<reference name="header">
            <action method="unsetChild">
                <name>topSearch</name>
            </action>
		</reference>

        <reference name="root">
            <block type="core/template"
				name="top.search"
				as="topSearch"
    				template="catalogsearch/form.mini.phtml"/>
        </reference>
	</default>
</layout>

Zusätzlich muss man nun in den Page-Template-Dateien (1column.phtml, 2columns-left, ...) unter app/design/frontend/default/[EUER-THEME]/template/page/ an der passenden Stelle den "getChild('topSearch') Aufruf einfügen:

<!-- ... -->
		<div class="main">
                <?php echo $this->getChildHtml('breadcrumbs') ?>
                <?php echo $this->getChildHtml('topSearch') ?>
<!-- ... -->

(In diesem Fall muss man auch die Styles noch anfassen, damit die beiden Blöcke auch neben und nicht untereinander stehen, dies aber nur am Erwähnenswert-Rande).

Wieso?

Es gibt unterschiedliche Arten von Blöcken: Struktur- und Inhaltsblöcke. Die Unterschiede? Die einen laden immer automatisch alle Blöcke und sind vom Typ "text/list" (Mage_Core_Block_Text_List). Sie rendern alle Blöcke, die sich in ihnen befinden, ohne dass in irgendeiner Template.phtml-Datei der Auruf getChild('blockname') erfolgen muss. Sie haben nicht mal ein eigenes Template - es gibt also keine right.phtml.

Die anderen sind Inhaltsblöcke. Hier werden Blöcke nicht automatisch gerendert. Hier muss man im Quellcode der Template-Datei an den passenden Stellen den Aufruf zum Rendern des Blocks einfügen: getChild('topSearch'). Wieso? Naja, der Header sähe höchstwahrscheinlich merkwüdig aus, wenn Blöcke automatisch ohne Platzierung geladen würden, die "Muttertemplates" 3columnns.phtml, 2columns-left.phtml und -right ebenso...

Und die Moral von der Geschicht

"Die local.xml" zu benutzen lohnt sich vor allem dann, wenn man immer mal wieder oder auch nur potentiell irgendwann was am Template anpassen muss. Mit ihr erübrigt sich schon fast eine Template-Dokumentation... Wenn man sie nutzt, muss man sich auf eine hartnäckige Namenssuche begeben und man sollte sich die Mühe machen herauszufinden, welche Klassen mit welchen Methoden den Blöcken zugrunde liegen.



Ein Beitrag von Carmen Bremen
Carmen's avatar

'Carmen Bremen ist freie Programmiererin mit dem Schwerpunkt Magento, firmiert unter NeoShops.de, lebt und arbeitet in Köln, ist Initiatorin des Kölner Magento-Stammtischs, trinkt sporadisch Kölsch, spricht Kölsch nur auf Aufforderung und das nicht besonders gut und darf sich

Alle Beiträge von Carmen

Kommentare
Marcus am

Hallo Webguys,

danke für den Beitrag. Gibt es eine Möglichkeit einen bestimmten Block auf allen Seiten anzuzeigen, nur nicht im Checkout?

Herzliche Grüße, Marcus

Magento - Seiten Navigation aus Kategorie entfernen | commercers magento Problem blog am

[...] Erstellung einer eigenen local.xml im eigenen Template Layout Ordner (nähere Informationen auch HIER im Blog der Webguys). Für unseren Fall wollen wir die Toolbar generell unterbinden und schreiben daher in die [...]

Carmen am

Danke@Fabrizio!

@nicmare: das wäre auch ein schöner eigener Beitrag ;-) Zu den Customer-Account-Links-Entfernungen hat Andreas (www.avs-webentwicklung.de unter "Blog") mal was hilfreiches verfasst.

nicmare am

wäre schön gewesen zu erwähnen was nicht mit local.xml geht. zum beispiel anpassungen von statischen seiten oder das entfernen von links aus dem customer account.

Fabrizio Branca am

Sehr unterhaltsam geschrieben! Und natürlich: Interessant, wie immer :) Danke, Carmen!

Vielen Grüße aus Wiesbaden,

Fabrizio

Dein Kommentar