Viele kennen es bestimmt noch von Magento 1: Spezifische LayoutHandles für den eingeloggten oder nicht eingeloggten Zustand. In Magento 2 gibt es diese von Haus aus leider nicht mehr. In unserem Türchen zeigen wir euch aber eine einfache und kurze Lösung, wie ihr diese wieder implementieren könnt.
Als ersten Step brauchen wir einen Observer, der sich beim „layout_load_before“ Event einschaltet:
<!-- events.xml in einem Modul -->
<?xml version="1.0"?>
<config
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"
>
<event name="layout_load_before">
<observer
name="codex_layouthandles_observer_layoutloadbefore"
instance="Codex\LayoutHandles\Observer\LayoutLoadBefore"
/>
</event>
</config>
Der Inhalt des Observers sieht so aus:
/ in der Codex\LayoutHandles\Observer\LayoutLoadBefore.php
<?php
namespace Codex\LayoutHandles\Observer;
use Magento\Customer\Model\Session;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class LayoutLoadBefore
implements ObserverInterface
{
// Session über construct als
// $this->custSession einbinden
private Session $custSession;
public function execute(Observer $obsrv): void
{
$layout = $obsrv->getEvent()->getLayout();
// LayoutHandle definieren anhand des
// Login-Status des Nutzers
$handle = $this->custSession->isLoggedIn() ?
'customer_logged_in' :
'customer_logged_out';
// LayoutHandle setzen
$layout->getUpdate()->addHandle($handle);
}
}
Das extra LayouHandle, welches wir in dem Observer hinzufügen, können wir dann wie folgt, mittels z.B. einer „customer_logged_in.xml“ nutzen:
<!--
Einbindungs-Beispiel in einer
customer_logged_in.xml in einem Modul
-->
<?xml version="1. 0"?>
<page
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"
>
<body>
<referenceContainer name="header-wrapper">
<block
name="cx.header.quickorder"
template="Codex_QuickOrder:header.phtml"
/>
</referenceContainer>
</body>
</page>
Das Template „header.phtml“ für die QuickOrder-Funktion wird nun also nur für eingeloggte Nutzer geladen und im „header-wrapper“ angezeigt. Genau identisch können wir natürlich auch die „customer_logged_out.xml“ für abgemeldete Nutzer verwenden. So simpel geht’s! Happy Coding.