Wie füge ich auf jeder Seite einen Block am Ende von ‚content‘ hinzu?

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>

3 Antworten

  1. Andi sagt:

    Hallo, warum hast du in der local.xml nicht einfach das „default“-Layouthandle angesprochen, um den Block auf jeder Seite einzufügen?