Targeting mehrerer Layout-Handles in Layout-XML

22

Ich habe einen benutzerdefinierten Controller, auf den über den folgenden Pfad zugegriffen /custommodule/customer/infowird, der die 2columns-left.phtmlVorlage auf den rootKnoten lädt :

<custommodule_customer_info>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>
</custommodule_customer_info>

Ich möchte die Stammvorlage für Kunden aktualisieren, die nicht angemeldet sind, z. B .:

<customer_logged_out>
    <custommodule_customer_info>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </custommodule_customer_info>
</customer_logged_out>

Ich verstehe, dass ich auf diese Weise nicht auf mehrere Layout-Handles zugreifen kann, aber die Absicht sollte klar sein. Aktualisieren Sie die Stammvorlage für dieses Layout-Handle, während Kunden nicht angemeldet sind.

Ich hatte gedacht, dass ich den Handle meines Controllers wie folgt anvisieren könnte:

<customer_logged_out>
    <reference name="custommodule_customer_info">
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </reference>
</customer_logged_out>

Dadurch wird zwar die Stammvorlage mit der 1column.phtmlVorlage aktualisiert , dies geschieht jedoch auf scheinbar allen Seiten und nicht nur auf der Seite, auf die sich mein referenceKnoten bezieht .

Ich habe mehrere Permutationen dieses Layout-Updates ausprobiert, aber keine scheint zu funktionieren. Wie kann ich dieses eine Layout-Handle anvisieren und gleichzeitig das customer_logged_outLayout-Handle verwenden?

- edit - Um es klar auszudrücken, handelt es sich tatsächlich um ein Drittanbieter-Modul.

pspahn
quelle

Antworten:

18

Da Sie Ihren eigenen Controller verwenden, müssen Sie nicht nur die Standardgriffe verwenden. Basierend auf dem angemeldeten Status können Sie Ihre infoAction-Methode hinzufügen

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

oder

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

und dann in deiner layout.xml Datei verwenden

<mymodule_customer_info_logged_in>

und

<mymodule_customer_info_logged_out>

- zusätzlich nach deiner Bearbeitung unten -

Da Sie den Controller nicht bearbeiten möchten (da es sich um eine Erweiterung eines Drittanbieters handelt), würde ich eine separate Erweiterung erstellen, die nur controller_action_layout_load_before berücksichtigt

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }
Kristof bei Fooman
quelle
Snazzy. Dies ist nicht ideal, aber eine relativ saubere Lösung. Wie ich in meinem anderen Kommentar weiter unten erwähnt habe, möchte ich lieber kein Modul eines Drittanbieters ändern, aber es sieht so aus, als wäre hier keine große Auswahl vorhanden. Schade, denn die customer_logged_in/outGriffe könnten so mächtig sein, aber sie werden wegen dieser Einschränkung gimpen.
pspahn
14

Alan Storm hat so etwas ähnliches beantwortet:

/programming//a/5601579/1157493

Sie können einen Helfer verwenden, um zu prüfen, ob der Benutzer angemeldet ist.

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

Es ruft Mage::helper('mymodule/myhelper')->switchTemplateIf(); in diesem Helfer Sie entscheiden können , um die Vorlage zu wechseln oder es einfach weiter so.

Ich glaube, es setzt die Vorlage auf das, was Sie returnin dieser Funktion tun.

Es würde ungefähr so ​​aussehen:

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

Ungetestet

Rick Kuipers
quelle
Ich hatte auch diesen Gedanken, aber ich hoffte, mich nur auf das XML-Layout des Moduls verlassen zu müssen, um dies durchzuführen, ohne auf zusätzliche Klassen im Modul angewiesen zu sein Erstellen Sie in XML keine zusätzlichen Modulressourcen, wenn dies nicht erforderlich ist ".
pspahn
@pspahn Natürlich ist das Ziel, es mit dem von Magento bereitgestellten XML-Layoutsystem zu versuchen. Leider hat es seine Grenzen und ich glaube, dies ist eine davon. Obwohl ich immer noch der Meinung bin, dass dies trotz der zusätzlichen Modulressourcen eine absolut praktikable Lösung ist.
Rick Kuipers
@pspahn Fooman hat eine gute alternative Lösung, die ich über meine empfehlen würde. Es erfordert weniger Codierung!
Rick Kuipers
In diesem Fall habe ich es tatsächlich mit einem Drittanbieter-Modul zu tun. Ich würde es vorziehen, ihr Modul nicht zu bearbeiten (da Updates es möglicherweise beschädigen) und dies nicht in der Hilfsklasse eines separaten Moduls unterzubringen (da dies ihr Modul und Modul an der Hüfte zusammenhält).
pspahn
6

Ich brauchte kürzlich diese Art von Funktionalität und es wurde schwierig, mehr und mehr Layout-Handles für alle verschiedenen Kombinationen vorhandener Layout-Handles hinzuzufügen. Deshalb habe ich eine Magento-Erweiterung erstellt, um die Möglichkeit hinzuzufügen, mehrere Layout-Handles direkt aus dem Layout-XML-Code auszuwählen.

Hier ist der Link zur Erweiterung https://github.com/mridul89/MultipleHandles.git

Du würdest es so benutzen-

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

Dadurch wird Magento angewiesen, dieses spezielle customer_logged_outLayout-Handle nur zu verwenden , wenn auch ein custommodule_customer_infoLayout-Handle vorhanden ist.

Mridul Aggarwal
quelle