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" (
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.