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.