Blog
Magento-Templates: Blöcke im Header positionieren
Warum man „cart_sidebar“ einfach nach links und nicht so einfach in den „header“ verschieben kann…
Zunächst gibt es Strukturblöcke (z.B. „right“) und Inhaltsblöcke (z.B. „cart_sidebar“).
Zum Rendern der Inhaltsblöcke (also um sie wieauchimmer in korrektem HTML darzustellen), werden Informationen benötigt: welche Klasse braucht Magento für die Daten, die gezeigt werden sollen (z.B. Produkte im Warenkorb) und wie soll es aussehen (welches Template). Blockanweisungen in den Blockelementen weisen einem Block die Blockklassen zu, die benötigt werden und daher instanziert werden sollen (type=“ „) und das dazugehörige Template (template=““).
<block type="catalog/product_compare_sidebar" name="catalog.compare.sidebar" template="catalog/product/compare/sidebar.phtml" />
Es gibt Blöcke (Strukturblöcke), die enthalten gar keine Templates, sondern geben nur die darin liegenden Blöcke zurück (z.B. der right-Block). Dann gibt reine Inhaltsblöcke (cart_sidebar). Und es gibt Mischformen zwischen Struktur- und Inhaltsblock (z.B. Footer).
Blöcke, die „nur“ die darin enthaltenden Kind-Blöcke zurückgeben, sind z.B. Blöcke vom Typ „text_list“, dazu gehören „right“ und „left“. Sie haben daher auch kein eigenes Template, da sie ja nur Container sind.
<block type="core/text_list" name="right" as="right" translate="label" >
Der Aufruf getChildHtml(’right’); ruft daher alle Elemente, die eine Referenz haben im Container „right“ (also in diesem Fall rechts) angeordnet zu werden, auf.
Dem „header“ Block liegt eine andere Klasse zugrunde:
<block type="page/html_header" name="header" as="header">
Diese Klasse weist dem header auch das Template zu, der header hat also ein Template, und dient nicht als flexibler Container.
In dieser header-Klasse werden nicht automatisch die Kind-Eemente geladen. Daher werden auch Blöcke innerhalb von
<reference name="header"><block.../></reference>
quasi ignoriert und nicht „eingesammelt“.
Will man, dass in solchen Blöcken andere Template-Blöcke „mitgerendert“ werden, muss man dem „Muttertemplate“ (in diesem Fall die page/html/header.phtml) „zu Fuß“ mitteilen, dass es Kinder zu rendern gibt. Dies tut man über:
<?php echo $this->getChildHtml('cart_sidebar') ?>
in der Template Datei (also der header.phtml). Aber natürlich NIEMALS die Datei im base-Verzeichnis ändern, sondern ins eigene Theme/Template verzeichnis kopieren und dort ändern!
Zuvor muss man dennoch dem Header auch mitteilen, dass es eine Klasse gibt, die benötigt wird, um ein Element darzustellen.
Dafür muss man zunächst den Block aus dem rechten Bereich entfernen. Löscht man den Aufruf „getChildHmtl(‚cart_sidebar‘) aus einem Template, werden dennoch aufgrund der XML-Konfiguration alle dafür benötigten Klassen geladen! Also immer Blöcke über die XML-Struktur entfernen, nicht über die Templates!
Am besten legt man eine local.xml in seinem Theme/Layout-Verzeichnis an und fügt dieser folgendes hinzu:
<?xml version="1.0" encoding="UTF-8"?> <layout> <move_cart_sidebar> <reference name="right"> <action method="unsetChild"> <name>cart_sidebar</name> </action> </reference> <reference name="header"> <action method="insert"> <name>cart_sidebar</name> </action> </reference> </move_cart_sidebar> <default> <update handle="move_cart_sidebar" /> </default> </layout>
„unsetChild“ entfernt einen Block aus einem Bereich, und lädt dennoch dessen Klassen.
<remove name="checkout.cart.shipping" />
Entfernt einen Block vollständig.
„insert“ fügt nun den Block in einen anderen Bereich ein.
Das Update-Handle (eine Art Tu-Was-Anderes-Als-Geplant-Aufruf) „move_cart_sidebar“ kann nun dort eingesetzt werden, wo es benötigt wird. Z.B. nur im Customer-Bereich oder nur in den Kategorien. In diesem Fall hab ich mal default genommen, weil es für alle Bereich gelten soll.
Neueste Kommentare