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.

Miss Magenta
Carmen Wingenbach
Kontakt
E-Mail: office@neoshops.de
Tel.: +49 [0]151 7000 7107
Carmen Bremen
Magento Certified Developer
Magento Certified Solution Specialist
Magento Certified Frontend Developer
Magento Freelancer


Magento Certified Developer Magento Certified Solution Specialist Magento Certified Frontend Developer



Magento Stammtisch Köln
Magento Stammtisch KölnDer nächste Kölner Magento Stammtisch findet statt am 18. Juli 2017. (Xing Event) Wer Interesse hat, kann sich in die Stammtisch-Gruppe auf Xing eintragen, ich sende eine Rund-E-Mail mit Details kurz vor dem Event!

Kontakt

Carmen Bremen.

In: Xing
In: Skype
In: Twitter
In: Google+
Per: Formular
Innermail: Office (t) neoshops.de
In Köln: In der Lößbörde 1, 50859 Köln
Per Handy: +49 [0]151- 7000 7107

Letzte Beiträge