Eigentlich wollte ich mir heute einen Magento-freien Vormittag machen. Dann aber stolperte ich zufällig über eine Frage auf Stack Overflow, die mir so oder in ähnlicher Form immer wieder einmal gestellt wird:
Magento: einen Inhalts-Block am Ende des Struktur-Blocks „content“ einfügen
Ich versuche einen Inhalts-Block in Magento hinzuzufügen, der auf jeder Seite unterhalb des Hauptinhalts sichtbar ist. Ich möchte dies mit einer eigenen Extension umsetzen, damit ich diese Extension kopieren kann und keine Core-Design-Dateien angepasst werden müssen.
(Amk: Übersetzung der Frage auf Stack Overflow)
Das klingt erst einmal einfach, funktioniert allerdings etwas anders, als man zuerst denkt. Meine Original-Antwort zur Frage finden Sie hier (zum Beispiel, falls Sie meine Antwort positiv bewerten wollen ;-)). Wenn Sie die Umsetzung übernehmen, denken Sie bitte daran, dass Sie selbst noch ein wenig Code hinzufügen müssen (das Extension-Basisgerüst erstellen, die Dateinamen und Ähnliches entsprechend anpassen etc.).
1. Wenn Sie den Block wirklich auf allen Shop-Seiten einfügen möchten
Fügen Sie in Ihrer XML-Layout-Datei (local.xml oder eine eigens erstellte) ein neues Layout-Handle hinzu:
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<!-- your other adjustments for default, category_product_view and so on go here -->
<add_my_block>
<reference name="content">
<block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
</reference>
</add_my_block>
</layout>
Dann erstellen Sie einen Event-Observer, der dafür sorgt, dass das Layout-Handle bei der Erstellung der Seite berücksichtigt wird:
<?php class YourCompany_YourExtension_Model_Observer { /** * Adds a block at the end of the content block. * * Uses the event 'controller_action_layout_load_before'. * * @param Varien_Event_Observer $observer * @return YourCompany_YourExtension_Model_Observer */ public function addBlockAtEndOfMainContent(Varien_Event_Observer $observer) { $layout = $observer->getEvent()->getLayout()->getUpdate(); $layout->addHandle('add_my_block'); return $this; } }
Jetzt müssen Sie noch die XML-Extension-Konfigurationsdatei (config.xml) anpassen und den Event-Observer registrieren.
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<modules>
<YourCompany_YourExtension>
<version>0.0.1</version>
</YourCompany_YourExtension>
</modules>
<frontend>
<events>
<controller_action_layout_load_before>
<observers>
<mymod_add_block_at_end_of_main_content>
<type>singleton</type>
<class>mymod/observer</class>
<method>addBlockAtEndOfMainContent</method>
</mymod_add_block_at_end_of_main_content>
</observers>
</controller_action_layout_load_before>
</events>
<!-- declaring your layout xml etc. -->
</frontend>
<global>
<!-- declaring your block classes etc. -->
<models>
<mymod>
<class>YourCompany_YourExtension_Model</class>
</mymod>
</models>
</global>
</config>
Der Block wird nun unterhalb der anderen Blöcke angezeigt. Ich habe das erfolgreich für die Startseite, die Login-Seite und die Kategorieseite getestet. Es sollte auch auf den anderen Seiten funktionieren.
Falls Sie den Block doch auf einigen wenigen Seiten ausnehmen möchten, können Sie im Event-Observer überprüfen, ob das Layout-Handle auf der aufgerufenen Seite verwendet werden soll.
Falls Sie den Block nur auf einigen Seiten einbinden möchten
Wie oben beschrieben fügen Sie ein Layout-Handle in ihrer XML-Layout-Datei hinzu, doch anstatt einen Event-Observer zu erstellen und zu registrieren, teilen Sie direkt in Ihrer XML-Layout-Datei mit, in welchen Bereichen das Layout-Handle zur Anwendung kommt.
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<catalog_category_default>
<update handle="add_my_block" />
</catalog_category_default>
<catalog_category_layered>
<update handle="add_my_block" />
</catalog_category_layered>
<cms_page>
<update handle="add_my_block" />
</cms_page>
<!-- and so on -->
<add_my_block>
<reference name="content">
<block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
</reference>
</add_my_block>
</layout>

Hallo, warum hast du in der local.xml nicht einfach das „default“-Layouthandle angesprochen, um den Block auf jeder Seite einzufügen?
Hallo, weil der Block dadurch nicht am Ende des Content-Bereichs angezeigt wird (siehe die ursprüngliche Frage auf Stack Overflow und die Kommentare dazu).
Oh, ja an die Problematik habe ich jetzt gar nicht gedacht, sorry.