Türchen 6: Magento 2 LayoutHandle für eingeloggte Nutzer

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.

0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert